/*
Copyright (C) 2012-2013 Josef Reisinger,cooljavajoe@aol.com
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111 USA
*/
#include <QThread>
#include <QFuture>
#include <iostream>
#include <unistd.h>
#include <QFileDialog>
#include <QProcessEnvironment>
#include "minihomerbridge.h"
#include "../minihomer/mdebug.h"
MinihomerBridge::MinihomerBridge(QWebFrame *_w, QObject *parent) :
QObject(parent)
{
QString mhdebug = QProcessEnvironment::systemEnvironment().value("MHDEBUG");
mdebug.setDebugLevel(mhdebug.toInt());
webFrame = _w;
}
int MinihomerBridge::setPort(QString portname) {
int sts;
char *p=portname.toLatin1().data();
cerr << "MinihomerBridge::setPort('" << p << "') enter " << endl;
sts=miniHomer.setPort(p);
if (sts < 0 ) cerr << "MiniHomer:setPort returned " << sts << endl;
cerr << "MinihomerBridge::setPort('" << p << "') returns " << sts << endl;
return sts;
}
int MinihomerBridge::open() {
int sts;
qDebug() << "MinihomerBridge::open() enter ";
sts=miniHomer.open();
if (sts < 0 ) cerr << "MiniHomer:open returned " << sts << endl;
qDebug() << "MinihomerBridge::open() leave=" << sts ;
return sts;
}
int MinihomerBridge::discover() {
int sts;
const char *speed="";
qDebug() << "MinihomerBridge::discover() enter ";
sts=miniHomer.open();
if (sts >= 0 ) {
sts=miniHomer.discover(speed);
} else {
cerr << "MiniHomer:open returned " << sts << endl;
}
miniHomer.close();
if (sts >= 0) {
discoverDone(strtol(speed, 0, 10));
} else {
cerr << "MiniHomer:discover returned " << sts << endl;
}
qDebug() << "MinihomerBridge::discover(" << speed << ") leave=" << sts;
return sts;
}
int MinihomerBridge::getSWVersion() {
int sts;
SoftwareVersion softwareVersion;
QVariantMap qvm;
qDebug() << "MinihomerBridge::getSWVersion() enter ";
sts=miniHomer.open();
if (sts >= 0) {
sts=miniHomer.getSWVersion(softwareVersion);
if (sts >= 0) {
qvm.insert("swtype", QVariant(softwareVersion.swtype));
qvm.insert("odmversion",
QVariant(QString("%1.%2.%3")
.arg(softwareVersion.odmversion[1])
.arg(softwareVersion.odmversion[2])
.arg(softwareVersion.odmversion[3])));
qvm.insert("kernelversion",
QVariant(QString("%1.%2.%3")
.arg(softwareVersion.kernelversion[1])
.arg(softwareVersion.kernelversion[2])
.arg(softwareVersion.kernelversion[3])));
qvm.insert("revision",
QVariant(QString("20%1.%2.%3")
.arg(softwareVersion.revision[1])
.arg(softwareVersion.revision[2])
.arg(softwareVersion.revision[3])));
getSWVersionDone(qvm);
} else {
cerr << "MiniHomer::getSWVersion returned " << sts << endl;
}
} else {
cerr << "MiniHomer::open returned " << sts << endl;
}
miniHomer.close();
qDebug() << "MinihomerBridge::getSWVersion() leave=" << sts;
return sts;
}
/* minihomer log commands */
int MinihomerBridge::getLogStatus (){
int sts;
LogStatus logStatus;
Config cfg;
QVariantMap qvm;
qDebug() << "MinihomerBridge::getLogStatus () enter ";
sts=miniHomer.open();
if (sts >= 0) {
sts=miniHomer.getLogStatus(logStatus);
if (sts >= 0) {
sts=miniHomer.getBacklightConfig(cfg);
if (sts >= 0) {
sts=miniHomer.getAutoPowerOffConfig(cfg);
if (sts >= 0) {
qvm.insert("logWrPtr", QVariant(logStatus.logWrPtr));
qvm.insert("totalSectors", QVariant(logStatus.totalSectors));
qvm.insert("sectorsLeft", QVariant(logStatus.sectorsLeft));
qvm.insert("minTime", QVariant(logStatus.minTime));
qvm.insert("maxTime", QVariant(logStatus.maxTime));
qvm.insert("minDistance", QVariant(logStatus.minDistance));
qvm.insert("maxDistance", QVariant(logStatus.maxDistance));
qvm.insert("minSpeed", QVariant(logStatus.minSpeed));
qvm.insert("maxSpeed", QVariant(logStatus.maxSpeed));
qvm.insert("enableLogging", QVariant(logStatus.enableLogging));
qvm.insert("enableFifo", QVariant(logStatus.enableFifo));
qvm.insert("enableAutoPowerOff", QVariant(cfg.enableAutoPowerOff));
qvm.insert("enableBacklight", QVariant(cfg.enableBacklight));
qvm.insert("enableBacklightFrom", QVariant(cfg.enableBacklightFrom));
qvm.insert("enableBacklightTo", QVariant(cfg.enableBacklightTo));
} else {
cerr << "MiniHomer::getAutoPowerOffConfig returned " << sts << endl;
}
} else {
cerr << "MiniHomer::getBacklightConfig returned " << sts << endl;
}
} else {
cerr << "MiniHomer::getLogStatus returned " << sts << endl;
}
} else {
cerr << "MiniHomer::open returned " << sts << endl;
}
miniHomer.close();
if (sts >= 0) getLogStatusDone(qvm);
qDebug() << "MinihomerBridge::getLogStatus() leave=" << sts;
return sts;
}
int MinihomerBridge::setLogStatus (QVariantMap qvm){
LogStatus logStatus;
Config cfg;
int s, sts;
qDebug() << "MinihomerBridge::setLogStatus() enter";
sts=miniHomer.open();
if (sts >= 0) {
logStatus.minTime= qvm.value("minTime").toInt();
logStatus.maxTime = qvm.value("maxTime").toInt();
logStatus.minDistance = qvm.value("minDistance").toInt();
logStatus.maxDistance = qvm.value("maxDistance").toInt();
logStatus.minSpeed = qvm.value("minSpeed").toInt();
logStatus.maxSpeed = qvm.value("maxSpeed").toInt();
logStatus.enableLogging = qvm.value("enableLogging").toInt();
logStatus.enableFifo = qvm.value("enableFifo").toInt();
sts=miniHomer.setLogStatus(logStatus);
if (sts < 0 ) cerr << "MiniHomer::setLogStatus returned " << sts << endl;
cfg.enableAutoPowerOff = qvm.value("enableAutoPowerOff").toInt();
cfg.enableBacklight = qvm.value("enableBacklight").toInt();
cfg.enableBacklightFrom = qvm.value("enableBacklightFrom").toInt();
cfg.enableBacklightTo = qvm.value("enableBacklightTo").toInt();
s=miniHomer.setAutoPowerOffConfig(cfg);
if (s < 0) sts=s;
if (sts < 0 ) cerr << "MiniHomer::setAutoPowerOffConfig returned " << sts << endl;
s=miniHomer.setBacklightConfig(cfg);
if (s < 0) sts=s;
if (sts < 0 ) cerr << "MiniHomer::setBacklightConfig returned " << sts << endl;
} else {
cerr << "MiniHomer:open returned " << sts << endl;
}
miniHomer.close();
qDebug() << "MinihomerBridge::setLogStatus() leave=" << sts;
return sts;
}
/* minihomer log PoI */
int MinihomerBridge::getPoI (QString which){
int sts=0, n=which.toInt();
PoI poi;
poi.lla.lat=poi.lla.lng=poi.lla.alt=0.0;
qDebug() << "MinihomerBridge::getPoI (" << n << ") enter ";
sts=miniHomer.open();
if (sts >= 0) {
sts=miniHomer.getPoI(poi, n);
if (sts >= 0) {
getPoIDone(n, poi.lla.lat, poi.lla.lng, poi.lla.alt);
} else {
cerr << "MiniHomer:getPoi returned " << sts << endl;
}
qDebug() << "MinihomerBridge::getPoI(" << poi.lla.lat << "," << poi.lla.lng << "," << poi.lla.alt << ") leave=" << sts;
} else {
cerr << "MiniHomer:open returned " << sts << endl;
}
miniHomer.close();
return sts;
}
int MinihomerBridge::setPoI (int which, double lat, double lng){
int sts=0;
PoI poi;
poi.lla.lat=lat;
poi.lla.lng=lng;
poi.lla.alt=lng;
qDebug() << "MinihomerBridge::setPoI (" << which << "," << lat << "," << lng << ") enter ";
sts=miniHomer.open();
if (sts >= 0) {
sts=miniHomer.setPoI(poi, which);
if (sts < 0) {
cerr << "MiniHomer:setPoi returned " << sts << endl;
}
} else {
cerr << "MiniHomer:open returned " << sts << endl;
}
miniHomer.close();
qDebug() << "MinihomerBridge::setPoI(" << poi.lla.lat << "," << poi.lla.lng << "," << poi.lla.alt << ") leave=" << sts;
return sts;
}
/* minihomer log PoI */
int MinihomerBridge::readBatchLog () {
int sts=0;
qDebug() << "MinihomerBridge::readBatchLog() enter ";
saveFileName = QFileDialog::getSaveFileName(NULL,
tr("Save track to GPX file"), "", tr("GPX Files (*.gpx)"));
if (saveFileName.length() == 0) return -1;
gpsFormatter= Formatter::getFormatter("GPX", saveFileName.toStdString().c_str());
mhb=new MHBThread(miniHomer);
connect(mhb, SIGNAL(readBatchLogDone()), this, SLOT(readBatchLogCallback()));
mhb->start();
qDebug() << "MinihomerBridge::readBatchLog() leave ";
qDebug() << "readBatchLog " << thread()->currentThreadId();
return sts;
}
QVariantMap MinihomerBridge::pollProgress () {
QVariantMap qvm;
qDebug() << "pollProgress ";
qvm.insert("min", QVariant(mhb->min));
qvm.insert("act", QVariant(mhb->act));
qvm.insert("max", QVariant(mhb->max));
qDebug() << "pollProgress " << mhb->min << "/" << mhb->act << "/" << mhb->max;
return qvm;
}
int MinihomerBridge::readBatchLogCallback () {
qDebug() << "readBatchLogCallback " << thread()->currentThreadId();
LogEntry *le;
QString js;
if (mhb->sts >= 0) {
le=mhb->wpt.getHead();
while (le) {
readBatchLogWpt(le->ts, le->lla.lat, le->lla.lng,le->lla.alt);
le=le->getNext();
}
le=mhb->trk.getHead();
while (le) {
readBatchLogTrk(le->ts, le->lla.lat, le->lla.lng,le->lla.alt);
le=le->getNext();
}
gpsFormatter->head();
gpsFormatter->body(mhb->wpt, mhb->trk);
gpsFormatter->tail();
} else {
cerr << "MiniHomerThread returned " << mhb->sts << endl;
}
readBatchLogDone();
return 0;
}
QString MinihomerBridge::scanDevices() {
int i;
int limit=20;
char devname[50];
char comma=' ';
QString result("[");
for (i=0; i<limit; i++) {
sprintf(devname, "%s%i", "/dev/ttyUSB", i);
if (0 == access(devname, R_OK|W_OK)) {
result = result + comma + "'" + devname + "' ";
if (comma == ' ') comma=',';
}
sprintf(devname, "%s%i:", "COM", i);
if (0 == access(devname, R_OK|W_OK)) {
result = result + comma + "'" + devname + "' ";
if (comma == ' ') comma=',';
}
}
result= result+"]";
return result;
}