/* Speed Climbing Stopwatch - Simple Stopwatch for Climbers Copyright (C) 2018 Itsblue Development - Dorian Zeder This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, version 3 of the License. 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 Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ #include "headers/buzzerconn.h" BuzzerConn::BuzzerConn(QObject *parent) : QObject(parent) { this->networkManager = new QNetworkAccessManager(); this->reloadNetworkManager = new QNetworkAccessManager(); this->date = new QDateTime; this->latest_button_pressed = 0; this->connected = false; } bool BuzzerConn::connect() { qDebug() << "connecting to buzzer..."; QList times = gettimes(1000); qDebug() << times[0]; if(times[0] == 200.0){ this->latest_button_pressed = times[2]; for(int i=0;i<=100;i++){ this->connection_progress = i; if(!calcoffset(this->gettimes(1000))){ this->connection_progress = 100; this->connected = false; return(false); } } this->connected = true; return(true); } else{ this->connected = false; return(false); } } bool BuzzerConn::calcoffset(QList times) { if(times.length() != 3){ return(false); } if(times[0] == 200.0){ this->latest_button_pressed = times[2]; double offset = date->currentMSecsSinceEpoch() - times[1]; if(this->latest_offsets.length()>=100){ this->latest_offsets.removeFirst(); } this->latest_offsets.append(offset); double mem = 0; for(int i=0;ioffset = mem / double(latest_offsets.length()); qDebug("%20f", this->offset); return(true); } else { //this->connected = false; return(false); } } QList BuzzerConn::gettimes(int timeout) { QList times; ReturnData_t ret = senddata(this->networkManager, QUrl("http://192.168.4.1"), timeout); 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()); return(times); } else{ return(times); } } bool BuzzerConn::buzzer_triggered() { if(!this->connected){ return(false); } QList times = this->gettimes(1000); if(times[0] == 200.0){ if(times[2] > this->latest_button_pressed){ this->latest_button_pressed = times[2]; return(true); } else { return(false); } } else{ //this->connected = false; return(false); } } bool BuzzerConn::start() { if(!this->connected){ return(false); } QList times = this->gettimes(1000); if(times[0] == 200.0 && this->connected){ this->latest_button_pressed = times[2]; return(true); } else{ this->connected = false; return(false); } } double BuzzerConn::get(QString key) { if(key == "offset"){ return(this->offset); } else if (key == "lastpressed") { return(this->latest_button_pressed); } else if( key == "currtime") { return(this->date->currentMSecsSinceEpoch()); } else if( key == "connection_progress") { return(this->connection_progress); } else if( key == "connected") { if(this->connected){ return(1); } return(0); } } QString BuzzerConn::test() { ReturnData_t ret = this->senddata(this->networkManager, QUrl("http://www.google.de"), 500); return(ret.text); } bool BuzzerConn::refresh() { if(!this->connected){ return(false); } QList times; ReturnData_t ret = senddata(this->reloadNetworkManager, QUrl("http://192.168.4.1"), 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); } } ReturnData_t BuzzerConn::senddata(QNetworkAccessManager * NetMan, QUrl serviceUrl, int timeout) { ReturnData_t ret; //this is a custom type to store the returned data // Call the webservice QNetworkRequest request(serviceUrl); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); //send a POST request with the given url and data to the server QUrlQuery pdata; QNetworkReply* reply; //wait until the request has finished QEventLoop loop; QTimer timer; timer.setSingleShot(true); loop.connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); loop.connect(NetMan, SIGNAL(finished(QNetworkReply*)), SLOT(quit())); timer.start(timeout); reply = NetMan->post(request, pdata.toString(QUrl::FullyEncoded).toUtf8()); loop.exec(); timer.stop(); //get the status code QVariant status_code = reply->attribute(QNetworkRequest::HttpStatusCodeAttribute); ret.status_code = status_code.toInt(); if(ret.status_code == 0){ //if the statuscode is zero, the connecion to the server was not possible ret.status_code = 444; } //get the full text response ret.text = QString::fromUtf8(reply->readAll()); //return the data return(ret); }