/********************************************************************************
* FaceTrackNoIR This program is a private project of some enthusiastic *
* gamers from Holland, who don't like to pay much for *
* head-tracking. *
* *
* Copyright (C) 2012 Wim Vriend (Developing) *
* Ron Hendriks (Researching and Testing) *
* Homepage: http://facetracknoir.sourceforge.net/home/default.htm *
* *
* Copyright (C) 2012 FuraX49 (HAT Tracker plugins) *
* Homepage: http://hatire.sourceforge.net *
* *
* *
* 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 3 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, see . *
* *
********************************************************************************/
#include "ftnoir_tracker_hat.h"
#include "ftnoir_tracker_hat_dialog.h"
#include
//*******************************************************************************************************
// FaceTrackNoIR Client Settings-dialog.
//*******************************************************************************************************
//
// Constructor for server-settings-dialog
//
TrackerControls::TrackerControls() : theTracker(NULL), timer(this)
{
ui.setupUi( this );
ui.label_version->setText(VER_FILEVERSION_STR);
// make SerialPort list
ui.cbSerialPort->clear();
foreach (QSerialPortInfo PortInfo , QSerialPortInfo::availablePorts() ) {
ui.cbSerialPort->addItem(PortInfo.portName());
}
// Stop if no SerialPort dispo
if (ui.cbSerialPort->count()<1) {
QMessageBox::critical(this,"FaceTrackNoIR Error", "No SerialPort avaible");
} else {
ui.cbSerialPort->setCurrentIndex(settings.SerialPortName);
}
// Serial config
ui.QCB_Serial_baudRate->clear();
ui.QCB_Serial_baudRate->addItem(QLatin1String("9600"),QSerialPort::Baud9600);
ui.QCB_Serial_baudRate->addItem(QLatin1String("19200"),QSerialPort::Baud19200);
ui.QCB_Serial_baudRate->addItem(QLatin1String("38400"),QSerialPort::Baud38400);
ui.QCB_Serial_baudRate->addItem(QLatin1String("57600"),QSerialPort:: Baud57600);
ui.QCB_Serial_baudRate->addItem(QLatin1String("115200"),QSerialPort::Baud115200);
ui.QCB_Serial_dataBits->clear();
ui.QCB_Serial_dataBits->addItem(QLatin1String("5"), QSerialPort::Data5);
ui.QCB_Serial_dataBits->addItem(QLatin1String("6"), QSerialPort::Data6);
ui.QCB_Serial_dataBits->addItem(QLatin1String("7"), QSerialPort::Data7);
ui.QCB_Serial_dataBits->addItem(QLatin1String("8"), QSerialPort::Data8);
ui.QCB_Serial_parity->clear();
ui.QCB_Serial_parity->addItem(QLatin1String("None"), QSerialPort::NoParity);
ui.QCB_Serial_parity->addItem(QLatin1String("Even"), QSerialPort::EvenParity);
ui.QCB_Serial_parity->addItem(QLatin1String("Odd"), QSerialPort::OddParity);
ui.QCB_Serial_parity->addItem(QLatin1String("Space"), QSerialPort::SpaceParity);
ui.QCB_Serial_parity->addItem(QLatin1String("Mark"), QSerialPort::MarkParity);
ui.QCB_Serial_stopBits->clear();
ui.QCB_Serial_stopBits->addItem(QLatin1String("1"));
ui.QCB_Serial_stopBits->addItem(QLatin1String("1.5"));
ui.QCB_Serial_stopBits->addItem(QLatin1String("2"));
ui.QCB_Serial_flowControl->clear();
ui.QCB_Serial_flowControl->addItem(QLatin1String("None"));
ui.QCB_Serial_flowControl->addItem(QLatin1String("RTS/CTS"));
ui.QCB_Serial_flowControl->addItem(QLatin1String("XON/XOFF"));
tie_setting(settings.EnableRoll, ui.chkEnableRoll);
tie_setting(settings.EnablePitch, ui.chkEnablePitch);
tie_setting(settings.EnableYaw, ui.chkEnableYaw);
tie_setting(settings.EnableX, ui.chkEnableX);
tie_setting(settings.EnableY, ui.chkEnableY);
tie_setting(settings.EnableZ, ui.chkEnableZ);
tie_setting(settings.InvertRoll, ui.chkInvertRoll);
tie_setting(settings.InvertPitch, ui.chkInvertPitch);
tie_setting(settings.InvertYaw, ui.chkInvertYaw);
tie_setting(settings.InvertX, ui.chkInvertX);
tie_setting(settings.InvertY, ui.chkInvertY);
tie_setting(settings.InvertZ, ui.chkInvertZ);
tie_setting(settings.RollAxe, ui.cb_roll);
tie_setting(settings.RollAxe, ui.cb_roll);
tie_setting(settings.RollAxe, ui.cb_roll);
tie_setting(settings.XAxe, ui.cb_x);
tie_setting(settings.YAxe, ui.cb_y);
tie_setting(settings.ZAxe, ui.cb_z);
tie_setting(settings.CmdStart, ui.le_cmd_start);
tie_setting(settings.CmdStop, ui.le_cmd_stop);
tie_setting(settings.CmdInit, ui.le_cmd_init);
tie_setting(settings.CmdReset, ui.le_cmd_reset);
tie_setting(settings.CmdCenter, ui.le_cmd_center);
tie_setting(settings.CmdZero, ui.le_cmd_zero);
tie_setting(settings.DelayInit, ui.spb_BeforeInit);
tie_setting(settings.DelayStart, ui.spb_BeforeStart);
tie_setting(settings.DelaySeq, ui.spb_AfterStart);
tie_setting(settings.BigEndian, ui.cb_Endian);
tie_setting(settings.pBaudRate, ui.QCB_Serial_baudRate);
tie_setting(settings.pDataBits, ui.QCB_Serial_dataBits);
tie_setting(settings.pParity, ui.QCB_Serial_parity);
tie_setting(settings.pStopBits, ui.QCB_Serial_stopBits);
tie_setting(settings.pFlowControl, ui.QCB_Serial_flowControl);
tie_setting(settings.SerialPortName, ui.cbSerialPort);
// Connect Qt signals to member-functions
connect(ui.btnOK, SIGNAL(clicked()), this, SLOT(doOK()));
connect(ui.btnCancel, SIGNAL(clicked()), this, SLOT(doCancel()));
connect(ui.btnSave, SIGNAL(clicked()), this, SLOT(doSave()));
connect(ui.btnReset, SIGNAL(clicked()), this, SLOT(doReset()));
connect(ui.btnCenter, SIGNAL(clicked()), this, SLOT(doCenter()));
connect(ui.btnZero, SIGNAL(clicked()), this, SLOT(doZero()));
connect(ui.btnSend, SIGNAL(clicked()), this, SLOT(doSend()));
connect(ui.btn_icone, SIGNAL(clicked()), this, SLOT(doSerialInfo()));
connect(&timer,SIGNAL(timeout()), this,SLOT(poll_tracker_info()));
}
//
// Center asked to ARDUINO
//
void TrackerControls::doCenter() {
if (theTracker) theTracker->notifyCenter();
}
//
// Zero asked to ARDUINO
//
void TrackerControls::doZero() {
if (theTracker) theTracker->notifyZeroed();
}
//
// Reset asked to ARDUINO
//
void TrackerControls::doReset() {
if (theTracker) theTracker->reset();
}
//
// Serial Info debug
//
void TrackerControls::doSerialInfo() {
if (theTracker) theTracker->SerialInfo();
}
//
// Send command to ARDUINO
//
void TrackerControls::doSend() {
if (theTracker) {
if (!ui.lineSend->text().isEmpty()) {
theTracker->sendcmd(ui.lineSend->text().toLatin1());
}
}
}
//
// Display FPS of Arduino.
//
void TrackerControls::poll_tracker_info()
{
if (theTracker)
{
int nb_trame;
theTracker->get_info(&nb_trame);
ui.lab_vtps->setText(QString::number(nb_trame*(1000/last_time.elapsed())));
last_time.restart();
}
}
void TrackerControls::WriteMsgInfo(const QByteArray &MsgInfo)
{
QApplication::beep();
ui.pteINFO->moveCursor(QTextCursor::End);
ui.pteINFO->insertPlainText(QString(MsgInfo));
QScrollBar *bar = ui.pteINFO->verticalScrollBar();
bar->setValue(bar->maximum());
}
void TrackerControls::doSave() {
settings.b->save();
if (theTracker)
theTracker->applysettings(settings);
}
//
// OK clicked on server-dialog
//
void TrackerControls::doOK() {
settings.b->save();
if (theTracker)
theTracker->applysettings(settings);
this->close();
}
//
// Cancel clicked on server-dialog
//
void TrackerControls::doCancel() {
//
// Ask if changed Settings should be saved
//
if (settings.b->modifiedp()) {
int ret = QMessageBox::question ( this, "Settings have changed", "Do you want to save the settings?", QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
switch (ret) {
case QMessageBox::Save:
settings.b->save();
close();
break;
case QMessageBox::Discard:
settings.b->revert();
close();
break;
case QMessageBox::Cancel:
// Cancel was clicked
break;
default:
// should never be reached
break;
}
}
else {
close();
}
}
void TrackerControls::registerTracker(ITracker *tracker) {
theTracker = static_cast(tracker);
connect(theTracker, SIGNAL(sendMsgInfo(QByteArray)),this , SLOT(WriteMsgInfo(QByteArray)));
if (isVisible() && settings.b->modifiedp()) theTracker->applysettings(settings);
ui.cbSerialPort->setEnabled(false);
ui.pteINFO->clear();
ui.lab_vstatus->setText("HAT START");
last_time.start();
timer.start(250);
}
void TrackerControls::unRegisterTracker() {
theTracker=NULL;
timer.stop();
ui.cbSerialPort->setEnabled(true);
ui.lab_vstatus->setText("HAT STOPPED");
ui.lab_vtps->setText("");
}
#ifdef OPENTRACK_API
extern "C" FTNOIR_TRACKER_BASE_EXPORT ITrackerDialog* CALLING_CONVENTION GetDialog( )
#else
#pragma comment(linker, "/export:GetTrackerDialog=_GetTrackerDialog@0")
FTNOIR_TRACKER_BASE_EXPORT ITrackerDialogPtr __stdcall GetTrackerDialog( )
#endif
{
return new TrackerControls;
}