diff --git a/headers/buzzerconn.h b/headers/buzzerconn.h index 8255edb..9918979 100644 --- a/headers/buzzerconn.h +++ b/headers/buzzerconn.h @@ -19,6 +19,12 @@ typedef struct strReturnData{ class BuzzerConn : public QObject { Q_OBJECT + Q_PROPERTY(double lastTriggered READ getLastTriggered NOTIFY triggered) + Q_PROPERTY(QString ipAdress WRITE setIP READ getIP) + Q_PROPERTY(QString state READ getState NOTIFY stateChanged) + Q_PROPERTY(int progress READ getProgress NOTIFY progressChanged) + Q_PROPERTY(double offset READ getOffset NOTIFY offsetChanged) + public: explicit BuzzerConn(QObject *parent = nullptr, QString ip = "http://192.168.4.1", int port = 80); double offset; @@ -31,6 +37,7 @@ public: int port; int errors; int errors_until_disconnect = 4; + QString state; @@ -42,6 +49,13 @@ private: QStringList pending_commands; //QSemaphore dataPipe(1); signals: + void triggered(); + + void stateChanged(); + + void progressChanged(); + + void offsetChanged(); public slots: ReturnData_t senddata(QNetworkAccessManager * NetMan, QUrl serviceUrl, int timeout); @@ -73,6 +87,17 @@ public slots: //refreshed the connection to the buzzer Q_INVOKABLE void appendCommand(QString command); + void setIP(const QString &ipAdress); + QString getIP() const; + + QString getState() const; + void setState(QString newState); + + int getProgress() const; + + double getOffset() const; + + double getLastTriggered() const; }; diff --git a/qml/connections/BuzzerConn.qml b/qml/connections/BuzzerConn.qml deleted file mode 100644 index aa10808..0000000 --- a/qml/connections/BuzzerConn.qml +++ /dev/null @@ -1,96 +0,0 @@ -import QtQuick 2.0 - -Item { - id: buzzerConn - height: 0 - width: 0 - opacity: 0 - visible: false - - signal pushed() - property bool connected: false - property var status: {'status': buzzerConn.state, 'progress': get_progress()} - - Timer { - //timer that refreshes the connection state to the buzzer - id: connectionRefreshTimer - running: root.state !== "RUNNING" && root.state !== "STARTING" && buzzerConn.status !== "connecting" - repeat: false - interval: 1000 - onTriggered: { - _cppBuzzerConn.refresh() - if(!_cppBuzzerConn.get("connected") && buzzerConn.state !== "connecting"){ - buzzerConn.state = "disconnected" - } - - connectionRefreshTimer.start() - } - } - - Timer { - //timer that checks, if the button has been pushed - id: running_refresh_timer - running: root.state === "RUNNING" - repeat: false - interval: 1 - - onTriggered: { - if(_cppBuzzerConn.buzzer_triggered()){ - buzzerConn.pushed() - - } - if(root.state === "RUNNING"){ - running_refresh_timer.start() - } - } - } - - Timer { - id: prog_refresh - running: buzzerConn.state === "connecting" - interval: 1 - repeat: true - onTriggered: { - buzzerConn.status.progress = get_progress() - } - } - - states: [ - State { - name: "disconnected" - PropertyChanges { - target: buzzerConn - } - }, - State { - name: "connecting" - PropertyChanges { - target: buzzerConn - } - }, - State { - name: "connected" - PropertyChanges { - target: buzzerConn - } - } - ] - - function connect(){ - buzzerConn.state = "connecting" - if(_cppBuzzerConn.connect()){ - buzzerConn.state = "connected" - return(true) - } - else { - buzzerConn.state = "disconnected" - return(false) - } - - - } - - function get_progress(){ - return(_cppBuzzerConn.get("connection_progress")) - } -} diff --git a/qml/connections/StartpadConn.qml b/qml/connections/StartpadConn.qml deleted file mode 100644 index 8a49176..0000000 --- a/qml/connections/StartpadConn.qml +++ /dev/null @@ -1,97 +0,0 @@ -import QtQuick 2.0 - -Item { - id: startpadConn - height: 0 - width: 0 - opacity: 0 - visible: false - - signal pushed() - property bool connected: false - property var status: {'status': startpadConn.state, 'progress': get_progress()} - property bool active - - Timer { - //timer that refreshes the connection state to the buzzer - id: connectionRefreshTimer - running: root.state !== "RUNNING" && root.state !== "STARTING" && startpadConn.status !== "connecting" - repeat: false - interval: 1000 - onTriggered: { - _cppStartpadConn.refresh() - if(!_cppStartpadConn.get("connected") && startpadConn.state !== "connecting"){ - startpadConn.state = "disconnected" - } - - connectionRefreshTimer.start() - } - } - - Timer { - //timer that checks, if the button has been pushed - id: running_refresh_timer - running: (root.state === "RUNNING" || root.state === "STARTING") && active - repeat: false - interval: 1 - - onTriggered: { - if(_cppStartpadConn.buzzer_triggered()){ - startpadConn.pushed() - - } - if(root.state === "RUNNING" || root.state === "STARTING" && active){ - running_refresh_timer.start() - } - } - } - - Timer { - id: prog_refresh - running: startpadConn.state === "connecting" - interval: 1 - repeat: true - onTriggered: { - startpadConn.status.progress = get_progress() - } - } - - states: [ - State { - name: "disconnected" - PropertyChanges { - target: startpadConn - } - }, - State { - name: "connecting" - PropertyChanges { - target: startpadConn - } - }, - State { - name: "connected" - PropertyChanges { - target: startpadConn - } - } - ] - - function connect(){ - startpadConn.state = "connecting" - if(_cppStartpadConn.connect()){ - startpadConn.state = "connected" - return(true) - } - else { - startpadConn.state = "disconnected" - return(false) - } - - - } - - function get_progress(){ - return(_cppStartpadConn.get("connection_progress")) - } -} diff --git a/qml/main.qml b/qml/main.qml index 09abe66..312ab4e 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -21,7 +21,6 @@ import QtQuick.Window 2.2 import QtQuick.Controls 2.2 import "." import "./components" -import "./connections" import "./styles" //import QtQuick.Layouts 1.11 @@ -47,8 +46,8 @@ Window { property double stoppedTime: 0 property double currTime - property double buzzer_offset - property double last_button_pressed + property double buzzer_offset: buzzerConn.offset + property double last_button_pressed: buzzerConn.lastTriggered property var last_run : { 'stop_type': "", 'time': 0, 'react_time': 0 @@ -69,6 +68,62 @@ Window { color: StyleSettings.backgroundColor } + BuzzerConn { + id: buzzerConn + ipAdress: "192.168.4.10" + property var status: {'status': buzzerConn.state, 'progress': buzzerConn.progress} + onLastTriggeredChanged: { + console.log(lastTriggered) + root.stop("buzzer") + } + } + + Timer { + id: buzzerRefreshTimer + running: buzzerConn.state === "connected" + interval: root.state === "RUNNING" ? 1:1000 + repeat: false + onTriggered: { + buzzerConn.refresh() + this.start() + } + } + + StartpadConn { + id: startpadConn + ipAdress: "192.168.4.11" + property var status: {'status': startpadConn.state, 'progress': startpadConn.progress} + property string color: root.state === "RUNNING" ? "SET_LED_RUNNING":"SET_LED_STARTING" + onColorChanged: { + appendCommand(color) + } + + onLastTriggeredChanged: { + console.log("startpad triggered") + var offset = startpadConn.offset + var last_pressed = startpadConn.lastTriggered + var trigger_time = (last_pressed + offset) + root.last_run.react_time = trigger_time - root.startTime + if(trigger_time - root.startTime <= 0){ + root.stop("false") + } + } + } + + Timer { + id: startpadRefreshTimer + running: startpadConn.state === "connected" + interval: root.state === "RUNNING" || root.state === "STARTING" ? 1:1000 + repeat: false + onTriggered: { + startpadConn.refresh() + this.start() + } + } + + + +/* BuzzerConn { id: buzzerConn onPushed: { @@ -96,7 +151,7 @@ Window { } } } - +*/ Timer { //timer that updates the currTime variable running: true @@ -183,20 +238,24 @@ Window { if(!playing && root.state==="STARTING"){ console.log(root.startTime) - _cppStartpadConn.appendCommand("SET_LED_RUNNING") root.currTime = root.startTime time.text = ( ( root.currTime - root.startTime ) / 1000 ).toFixed(3) + " sec" root.state = "RUNNING" } else if(playing) { console.log("start sound started") - root.startTime = _cppBuzzerConn.get("currtime") + 3100 //set the startime to be 0 after the starttone - startpadConn.active = true + root.startTime = new Date().getTime() + 3100 //set the startime to be 0 after the starttone } } } + SoundEffect { + //start sound + id: falseSound + source: "qrc:/sounds/false.wav" + } + /*------------------------ Timer text an upper line ------------------------*/ @@ -687,16 +746,16 @@ Window { } function stop(type){ - _cppStartpadConn.appendCommand("SET_LED_STARTING"); + //_cppStartpadConn.appendCommand("SET_LED_STARTING"); switch(type){ case "buzzer": //the buzzer was pushed - root.buzzer_offset = _cppBuzzerConn.get("offset") - root.last_button_pressed = _cppBuzzerConn.get("lastpressed") + root.buzzer_offset = buzzerConn.offset + root.last_button_pressed = buzzerConn.lastTriggered root.stoppedTime = (root.last_button_pressed + root.buzzer_offset) - root.startTime root.state = "STOPPED" //time.text = ( root.stoppedTime / 1000 ).toFixed(3) + " sec" - console.log("STOPPED: "+root.stoppedTime) + console.log("STOPPED: "+root.stoppedTime + " started at: " + root.startTime + " offset: "+ root.buzzer_offset + "lastpressed: " + root.last_button_pressed) break case "manual": //the stop button was pressed @@ -713,9 +772,10 @@ Window { at_marksSound.stop() readySound.stop() startSound.stop() + falseSound.play() break } - startpadConn.active = true + //tartpadConn.active = true } function reset(){ diff --git a/qml/qml.qrc b/qml/qml.qrc index 2faba7a..d95c7a4 100644 --- a/qml/qml.qrc +++ b/qml/qml.qrc @@ -7,8 +7,6 @@ components/SimpleIndicator.qml components/ConnectionDelegate.qml components/FadeAnimation.qml - connections/BuzzerConn.qml - connections/StartpadConn.qml styles/StyleSettings.qml styles/qmldir styles/Dark.js diff --git a/shared.qrc b/shared.qrc index 4f8acc8..1e8a3ea 100644 --- a/shared.qrc +++ b/shared.qrc @@ -20,5 +20,6 @@ translations/de_DE.ts graphics/icons/settings_black.png graphics/icons/startpad_black.png + sounds/false.wav diff --git a/sounds/false.wav b/sounds/false.wav new file mode 100644 index 0000000..ae4daa7 Binary files /dev/null and b/sounds/false.wav differ diff --git a/sources/buzzerconn.cpp b/sources/buzzerconn.cpp index b3c30aa..8e6a890 100644 --- a/sources/buzzerconn.cpp +++ b/sources/buzzerconn.cpp @@ -30,6 +30,8 @@ BuzzerConn::BuzzerConn(QObject *parent, QString ip, int port) : QObject(parent) this->ip = ip; this->port = port; + + this->setState("disconnected"); // "http://192.168.4.1" } @@ -37,6 +39,8 @@ bool BuzzerConn::connect() { qDebug() << "connecting..."; + setState("connecting"); + //wait until the request has finished QEventLoop loop; QTimer timer; @@ -62,17 +66,21 @@ bool BuzzerConn::connect() this->latest_button_pressed = times[2]; for(int i=0;i<=100;i++){ this->connection_progress = i; + emit this->progressChanged(); if(!calcoffset(this->gettimes(1000))){ this->connection_progress = 100; this->connected = false; + setState("disconnected"); return(false); } } this->connected = true; + setState("connected"); return(true); } else{ this->connected = false; + setState("disconnected"); return(false); } } @@ -95,7 +103,8 @@ bool BuzzerConn::calcoffset(QList times) mem += latest_offsets[i]; } this->offset = mem / double(latest_offsets.length()); - qDebug("%20f", this->offset); + offsetChanged(); + //qDebug("%20f", this->offset); return(true); } else { @@ -215,6 +224,41 @@ double BuzzerConn::get(QString key) } return(0); } + return(0); +} + +void BuzzerConn::setIP(const QString &ipAdress){ + this->ip = ipAdress; +} + +QString BuzzerConn::getIP() const +{ + return(this->ip); +} + +QString BuzzerConn::getState() const +{ + return(this->state); +} + +void BuzzerConn::setState(QString newState){ + this->state = newState; + emit stateChanged(); +} + +int BuzzerConn::getProgress() const +{ + return(connection_progress); +} + +double BuzzerConn::getOffset() const +{ + return(this->offset); +} + +double BuzzerConn::getLastTriggered() const +{ + return(this->latest_button_pressed); } QString BuzzerConn::test() @@ -228,36 +272,23 @@ bool BuzzerConn::refresh() if(!this->connected){ return(false); } -// QList times; -// ReturnData_t ret = senddata(this->reloadNetworkManager, QUrl(this->ip), 1000); -// times.append(double(ret.status_code)); - -// if(ret.status_code == 200){ -// ret.text.replace("\n",""); -// ret.text.replace("\r",""); -// QStringList times_cache = ret.text.split("
"); -// times.append(times_cache[0].toDouble()); -// times.append(times_cache[1].toDouble()); -// calcoffset(times); -// return(true); -// } -// else{ -// //this->connected = false; -// return(false); -// } if(pending_commands.length() > 0){ QString command = this->pending_commands.first(); - signed long retval = this->sendCommand(command, 800); + signed long retval = this->sendCommand(command, 2000); if(retval > 0){ this->pending_commands.removeFirst(); } } //refresh the times - QList ret = this->gettimes(800); + QList ret = this->gettimes(2000); if(ret[0] >= 0){ + if(ret[2] > this->latest_button_pressed){ + this->latest_button_pressed = ret[2]; + emit triggered(); + } this->errors = 0; return(this->calcoffset(ret)); } @@ -356,8 +387,8 @@ signed long BuzzerConn::sendCommand(QString command, int timeout){ long data = 0; this->socket->read((char*)&data,4); - qDebug() << data; - qDebug() << this->socket->bytesAvailable(); + //qDebug() << data; + //qDebug() << this->socket->bytesAvailable(); return data; } diff --git a/sources/main.cpp b/sources/main.cpp index cf3dbc8..17a3cc8 100644 --- a/sources/main.cpp +++ b/sources/main.cpp @@ -105,14 +105,18 @@ int main(int argc, char *argv[]) #endif connectToDatabase(); - BuzzerConn * pBuzzerConn = new BuzzerConn(nullptr, "192.168.4.10", 80); - BuzzerConn * pStartpadConn = new BuzzerConn(nullptr, "192.168.4.11", 80); + //BuzzerConn * pBuzzerConn = new BuzzerConn(nullptr, "192.168.4.10", 80); + //BuzzerConn * pStartpadConn = new BuzzerConn(nullptr, "192.168.4.11", 80); AppSettings * pAppSettings = new AppSettings(); //setup the sql storage model as a qml model qmlRegisterType("com.itsblue.speedclimbingstopwatch", 1, 0, "SqlProfileModel"); qmlRegisterType("com.itsblue.speedclimbingstopwatch", 1, 0, "SqlStorageModel"); + //setup the startpad and buzzer conn qml objects + qmlRegisterType("com.itsblue.speedclimbingstopwatch", 1, 0, "BuzzerConn"); + qmlRegisterType("com.itsblue.speedclimbingstopwatch", 1, 0, "StartpadConn"); + //setup translation engine //to the language of the system //if the system language is not found the language is set to english @@ -125,16 +129,12 @@ int main(int argc, char *argv[]) if (engine.rootObjects().isEmpty()) return -1; - engine.rootContext()->setContextProperty("_cppBuzzerConn", pBuzzerConn); - engine.rootContext()->setContextProperty("_cppStartpadConn", pStartpadConn); engine.rootContext()->setContextProperty("_cppAppSettings", pAppSettings); int iRet = 0; iRet = app.exec(); //call the destructors of all objects - delete pBuzzerConn; - delete pStartpadConn; delete pAppSettings; return iRet;