summaryrefslogtreecommitdiffhomepage
path: root/csv
diff options
context:
space:
mode:
authorStanislaw Halik <sthalik@misaki.pl>2014-11-02 12:05:04 +0100
committerStanislaw Halik <sthalik@misaki.pl>2014-11-02 18:32:44 +0100
commit4c237558dd079133f48789da9e97b541c2e89fa5 (patch)
tree439a6ac064393992db47584b60ddd77b9ed6ba68 /csv
parentd97fec6daff4df7b8868b708ef543e0aa0455d4f (diff)
rename csv module dir
Diffstat (limited to 'csv')
-rw-r--r--csv/csv.cpp161
-rw-r--r--csv/csv.h26
2 files changed, 187 insertions, 0 deletions
diff --git a/csv/csv.cpp b/csv/csv.cpp
new file mode 100644
index 00000000..71db8ecb
--- /dev/null
+++ b/csv/csv.cpp
@@ -0,0 +1,161 @@
+/********************************************************************************
+* FaceTrackNoIR This program is a private project of the some enthusiastic *
+* gamers from Holland, who don't like to pay much for *
+* head-tracking. *
+* *
+* Copyright (C) 2013 Wim Vriend (Developing) *
+* Ron Hendriks (Researching and Testing) *
+* *
+* Homepage *
+* *
+* 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 <http://www.gnu.org/licenses/>. *
+* *
+********************************************************************************/
+#define INSIDE_CSV
+#include "csv.h"
+#include <QTextDecoder>
+#include <QFile>
+#include <QCoreApplication>
+#include <QDebug>
+
+CSV::CSV(QIODevice * device)
+{
+ m_device = device;
+ m_codec = QTextCodec::codecForLocale();
+ m_pos = 0;
+ m_rx = QRegExp("((?:(?:[^;\\n]*;?)|(?:\"[^\"]*\";?))*)\\n");
+}
+CSV::CSV(QString &string){
+ m_device = NULL;
+ m_codec = QTextCodec::codecForLocale();
+ m_string = string;
+ m_pos = 0;
+ m_rx = QRegExp("((?:(?:[^;\\n]*;?)|(?:\"[^\"]*\";?))*)\\n");
+}
+
+void CSV::setCodec(const char* codecName){
+ m_codec = QTextCodec::codecForName(codecName);
+}
+
+QString CSV::readLine(){
+ QString line;
+
+ if(m_string.isNull()){
+ if(m_device && m_device->isReadable()){
+ QTextDecoder dec(m_codec);
+ m_string = dec.toUnicode(m_device->readAll());
+ }else{
+ return QString();
+ }
+ }
+ if((m_pos = m_rx.indexIn(m_string,m_pos)) != -1) {
+ line = m_rx.cap(1);
+ m_pos += m_rx.matchedLength();
+ }
+ return line;
+
+}
+QStringList CSV::parseLine(){
+ return parseLine(readLine());
+}
+QStringList CSV::parseLine(QString line){
+ QStringList list;
+ int pos2 = 0;
+ QRegExp rx2("(?:\"([^\"]*)\";?)|(?:([^;]*);?)");
+ if(line.size()<1){
+ list << "";
+ }else while (line.size()>pos2 && (pos2 = rx2.indexIn(line, pos2)) != -1) {
+ QString col;
+ if(rx2.cap(1).size()>0)
+ col = rx2.cap(1);
+ else if(rx2.cap(2).size()>0)
+ col = rx2.cap(2);
+
+ list << col;
+
+ if(col.size())
+ pos2 += rx2.matchedLength();
+ else
+ pos2++;
+ }
+ return list;
+}
+
+void CSV::getGameData( const int id, unsigned char* table, QString& gamename)
+{
+ QString gameID = QString::number(id);
+
+ /* zero table first, in case unknown game is connecting */
+ memset(table, 0, 8);
+ QStringList gameLine;
+ qDebug() << "getGameData, ID = " << gameID;
+
+ QFile file(QCoreApplication::applicationDirPath() + "/settings/facetracknoir supported games.csv");
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text)){
+ return;
+ }
+ CSV csv(&file);
+ gameLine = csv.parseLine();
+
+ while (gameLine.count() > 2) {
+ //qDebug() << "Column 0: " << gameLine.at(0); // No.
+ //qDebug() << "Column 1: " << gameLine.at(1); // Game Name
+ //qDebug() << "Column 2: " << gameLine.at(2); // Game Protocol
+ //qDebug() << "Column 3: " << gameLine.at(3); // Supported since version
+ //qDebug() << "Column 4: " << gameLine.at(4); // Verified
+ //qDebug() << "Column 5: " << gameLine.at(5); // By
+ //qDebug() << "Column 6: " << gameLine.at(6); // International ID
+ //qDebug() << "Column 7: " << gameLine.at(7); // FaceTrackNoIR ID
+
+ if (gameLine.count() > 6) {
+ if (gameLine.at(6).compare( gameID, Qt::CaseInsensitive ) == 0) {
+ QByteArray id = gameLine.at(7).toLatin1();
+ unsigned int tmp[8];
+ unsigned int fuzz[3];
+ if (gameLine.at(3) == QString("V160"))
+ {
+ qDebug() << "no table";
+ }
+ else if (sscanf(id.constData(),
+ "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",
+ fuzz + 2,
+ fuzz + 0,
+ tmp + 3,
+ tmp + 2,
+ tmp + 1,
+ tmp + 0,
+ tmp + 7,
+ tmp + 6,
+ tmp + 5,
+ tmp + 4,
+ fuzz + 1) != 11)
+ {
+ qDebug() << "scanf failed" << fuzz[0] << fuzz[1] << fuzz[2];
+ }
+ else
+ for (int i = 0; i < 8; i++)
+ table[i] = tmp[i];
+ qDebug() << gameID << "game-id" << gameLine.at(7);
+ gamename = gameLine.at(1);
+ file.close();
+ return;
+ }
+ }
+
+ gameLine = csv.parseLine();
+ }
+
+ qDebug() << "Unknown game connected" << gameID;
+ file.close();
+}
diff --git a/csv/csv.h b/csv/csv.h
new file mode 100644
index 00000000..e0eac7dd
--- /dev/null
+++ b/csv/csv.h
@@ -0,0 +1,26 @@
+#pragma once
+#include <QObject>
+#include <QStringList>
+#include <QIODevice>
+#include <QTextCodec>
+#include <QRegExp>
+#include <QtGlobal>
+
+class CSV
+{
+public:
+ QString readLine();
+ QStringList parseLine();
+ static QStringList parseLine(QString line);
+
+ void setCodec(const char* codecName);
+ static void getGameData(const int gameID, unsigned char* table, QString& gamename);
+private:
+ QIODevice *m_device;
+ QTextCodec *m_codec;
+ QString m_string;
+ int m_pos;
+ QRegExp m_rx;
+ CSV(QIODevice * device);
+ CSV(QString &string);
+};