fixed some connection issues with the basestation and did some cleanup

This commit is contained in:
dorian 2019-08-19 15:14:11 +02:00
parent 59bf853f0a
commit c571cb8c54
9 changed files with 65 additions and 113 deletions

View file

@ -82,7 +82,7 @@
</application> </application>
<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="26"/> <uses-sdk android:minSdkVersion="21" android:targetSdkVersion="26"/>
<supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/> <supports-screens android:largeScreens="true" android:normalScreens="true" android:anyDensity="true" android:smallScreens="true"/>
<!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application. <!-- The following comment will be replaced upon deployment with default permissions based on the dependencies of the application.

View file

@ -47,7 +47,7 @@ RemoteDataListView {
//listData = {} //listData = {}
var retData = speedBackend.getAthletes() var retData = speedBackend.getAthletes()
if(retData === undefined){ if(!retData){
status = 500 status = 500
return return
} }

View file

@ -26,36 +26,10 @@ import "./components"
Popup { Popup {
id: root id: root
x: startButt.x
y: startButt.y
width: startButt.width
height: startButt.height
modal: true modal: true
dim: false dim: false
opacity: 0 opacity: 0
property var connections
signal connectRequested(var type)
onConnectionsChanged: {
//loop trough all connections
for (var key in connections) {
if(!connections[key])continue; //skip if empty to avoid errors
//check if any connection is in the state "connecting"
if(connections[key]["status"] === "connecting"){
root.closePolicy = Popup.NoAutoClose //make the dalog non-closable
return
}
}
//if no connection is in "conecting" state make popup closable
root.closePolicy = Popup.CloseOnPressOutside
}
function connect(type) {
connectRequested(type)
}
enter: Transition { enter: Transition {
NumberAnimation { properties: "opacity"; to: 1; duration: 300; easing.type: Easing.InOutQuad } NumberAnimation { properties: "opacity"; to: 1; duration: 300; easing.type: Easing.InOutQuad }
NumberAnimation { properties: "scale"; from: 0.9; to: 1; duration: 300; easing.type: Easing.InOutQuad } NumberAnimation { properties: "scale"; from: 0.9; to: 1; duration: 300; easing.type: Easing.InOutQuad }
@ -295,11 +269,7 @@ Popup {
} }
function loadSetting(key, del){ function loadSetting(key, del){
var val return speedBackend.readSetting(key)
val = speedBackend.readSetting(key)
return val
} }
SmoothSwitchDelegate { SmoothSwitchDelegate {
@ -372,7 +342,7 @@ Popup {
} }
} }
/*-----Page to connect to extenstions like a startpad or buzzer-----*/ /*-----Page to connect to the base station -----*/
Component { Component {
id: connect id: connect
Column { Column {

View file

@ -14,7 +14,6 @@ SmoothItemDelegate {
enabled: (status.status === "disconnected" && control.connect !== undefined) || ( status.status === "connected" && control.disconnect !== undefined ) enabled: (status.status === "disconnected" && control.connect !== undefined) || ( status.status === "connected" && control.disconnect !== undefined )
onClicked: { onClicked: {
if(status.status === "disconnected"){ if(status.status === "disconnected"){
connect() connect()
if(status.status !== "connected"){ if(status.status !== "connected"){

View file

@ -23,7 +23,7 @@ Item {
ListView { ListView {
id: listView id: listView
model: control.listData.length model: control.listData === undefined ? 0:control.listData.length
anchors.fill: parent anchors.fill: parent

View file

@ -467,20 +467,11 @@ Window {
------*/ ------*/
SettingsDialog{ SettingsDialog{
id: settingsDialog id: settingsDialog
connections: root.connections
onConnectRequested: { x: startButt.x
switch(type){ y: startButt.y
case "buzzer": width: startButt.width
buzzerConn.connect() height: startButt.height
break
case "startpad":
startpadConn.connect()
break
case "baseStation":
baseConn.connectToHost()
break
}
}
} }
ProfilesDialog { ProfilesDialog {
@ -492,8 +483,6 @@ Window {
y: !root.landscape() ? topContainerItm.height + margin:topContainerItm.x + margin y: !root.landscape() ? topContainerItm.height + margin:topContainerItm.x + margin
width: root.landscape() ? root.width - topContainerItm.width - menu_container.width - margin * 2 : root.width - margin * 2 width: root.landscape() ? root.width - topContainerItm.width - menu_container.width - margin * 2 : root.width - margin * 2
height: !root.landscape() ? root.height - topContainerItm.height - menu_container.height - margin * 2 : root.height - margin * 2 height: !root.landscape() ? root.height - topContainerItm.height - menu_container.height - margin * 2 : root.height - margin * 2
} }
/*------------------- /*-------------------

View file

@ -21,46 +21,29 @@ bool BaseConn::connectToHost() {
qDebug() << "connecting"; qDebug() << "connecting";
setState("connecting"); setState("connecting");
this->connection_progress = 0; this->connection_progress = 0;
QEventLoop loop;
QTimer timer;
timer.setSingleShot(true); QEventLoop loop;
// quit the loop when the timer times out
loop.connect(&timer, SIGNAL(timeout()), &loop, SLOT(quit())); // quit loop when state changed (successfull connection is handled elswhere
//quit the loop when the connection was established loop.connect(this, SIGNAL(stateChanged()), &loop, SLOT(quit()));
loop.connect(this->socket, SIGNAL(connected()), &loop, SLOT(quit()));
// start the timer before starting to connect
timer.start(3000);
//connect //connect
this->socket->connectToHost(this->ip, this->port); this->socket->connectToHost(this->ip, this->port);
//wait for the connection to finish (programm gets stuck in here) while(this->state != "connected" && this->state != "disconnected"){
loop.exec(); loop.exec();
//loop finish
if(timer.remainingTime() == -1){
//the time has been triggered -> timeout
this->socket->abort();
return(false);
} }
// stop the timer as the connection has been established if(this->state == "connected") {
timer.stop(); return true;
connect(this->socket, &QTcpSocket::readyRead, this, &BaseConn::readyRead); }
this->connection_progress = 50;
if(!this->init()){
this->closeConnection();
return false; return false;
}
this->setState("connected");
return(true);
} }
bool BaseConn::init() { bool BaseConn::init() {
connect(this->socket, &QTcpSocket::readyRead, this, &BaseConn::readyRead);
this->connection_progress = 50;
return true; return true;
} }
@ -126,6 +109,33 @@ void BaseConn::gotError(QAbstractSocket::SocketError err)
// --- socket communication handling --- // --- socket communication handling ---
// ------------------------------------- // -------------------------------------
void BaseConn::socketStateChanged(QAbstractSocket::SocketState socketState) {
switch (socketState) {
case QAbstractSocket::UnconnectedState:
{
this->deInit();
this->setState("disconnected");
break;
}
case QAbstractSocket::ConnectedState:
{
if(this->init()) {
this->setState("connected");
}
else {
this->closeConnection();
}
break;
}
default:
{
//qDebug() << "+ --- UNKNOWN SOCKET STATE: " << socketState;
break;
}
}
}
QVariantMap BaseConn::sendCommand(int header, QJsonValue data){ QVariantMap BaseConn::sendCommand(int header, QJsonValue data){
if(this->state != "connected"){ if(this->state != "connected"){
return {{"status", 910}, {"data", "not connected"}}; return {{"status", 910}, {"data", "not connected"}};
@ -303,27 +313,11 @@ QString BaseConn::getState() const
} }
void BaseConn::setState(QString newState){ void BaseConn::setState(QString newState){
if(this->state != newState) {
this->state = newState; this->state = newState;
emit stateChanged(); emit stateChanged();
} if(this->state == "disconnected") {
void BaseConn::socketStateChanged(QAbstractSocket::SocketState socketState) {
switch (socketState) {
case QAbstractSocket::UnconnectedState:
{
this->deInit(); this->deInit();
this->setState("disconnected");
break;
}
case QAbstractSocket::ConnectedState:
{
//this->setState("connected");
break;
}
default:
{
qDebug() << "+ --- UNKNOWN SOCKET STATE: " << socketState;
break;
} }
} }
} }

View file

@ -20,6 +20,7 @@ ClimbingRace::ClimbingRace(QObject *parent) : QObject(parent)
this->baseConn->setIP(pGlobalAppSettings->loadSetting("baseStationIpAdress")); this->baseConn->setIP(pGlobalAppSettings->loadSetting("baseStationIpAdress"));
connect(this->baseConn, &BaseConn::stateChanged, this, &ClimbingRace::baseStationStateChanged); connect(this->baseConn, &BaseConn::stateChanged, this, &ClimbingRace::baseStationStateChanged);
connect(this->baseConn, &BaseConn::stateChanged, this, &ClimbingRace::refreshMode);
connect(this->baseConn, &BaseConn::connectionsChanged, this, &ClimbingRace::baseStationConnectionsChanged); connect(this->baseConn, &BaseConn::connectionsChanged, this, &ClimbingRace::baseStationConnectionsChanged);
this->speedTimers.append( new SpeedTimer ); this->speedTimers.append( new SpeedTimer );
@ -53,8 +54,6 @@ int ClimbingRace::startRace() {
return 904; return 904;
} }
this->refreshMode();
qDebug() << "+ --- starting race"; qDebug() << "+ --- starting race";
int returnCode = 900; int returnCode = 900;
@ -104,8 +103,6 @@ int ClimbingRace::stopRace(int type) {
// 1: cancel // 1: cancel
// 2: fail (fase start) // 2: fail (fase start)
this->refreshMode();
qDebug() << "+ --- stopping race"; qDebug() << "+ --- stopping race";
int returnCode = 900; int returnCode = 900;
@ -133,7 +130,6 @@ int ClimbingRace::stopRace(int type) {
QVariantMap reply = this->baseConn->sendCommand(1001); QVariantMap reply = this->baseConn->sendCommand(1001);
if(reply["status"] != 200){ if(reply["status"] != 200){
//handle Error!!
returnCode = reply["status"].toInt(); returnCode = reply["status"].toInt();
} }
else { else {
@ -153,8 +149,6 @@ int ClimbingRace::resetRace() {
return 904; return 904;
} }
this->refreshMode();
qDebug() << "+ --- resetting race"; qDebug() << "+ --- resetting race";
int returnCode = 900; int returnCode = 900;
@ -205,6 +199,7 @@ void ClimbingRace::syncWithBaseStation() {
this->baseConn->refreshConnections(); this->baseConn->refreshConnections();
// sync race state
QVariantMap tmpReply = this->baseConn->sendCommand(2000); QVariantMap tmpReply = this->baseConn->sendCommand(2000);
if(tmpReply["status"] != 200){ if(tmpReply["status"] != 200){
@ -367,6 +362,11 @@ void ClimbingRace::refreshMode() {
if(newMode == LOCAL){ if(newMode == LOCAL){
// if the new mode is local -> connection to base station has been lost // if the new mode is local -> connection to base station has been lost
// reset race
// reset state
this->setState(IDLE);
// reset timers
// go back to one timer // go back to one timer
for (int i = 0;i<this->speedTimers.length();i++) { for (int i = 0;i<this->speedTimers.length();i++) {
delete this->speedTimers[i]; delete this->speedTimers[i];
@ -376,6 +376,7 @@ void ClimbingRace::refreshMode() {
this->speedTimers.append(new SpeedTimer); this->speedTimers.append(new SpeedTimer);
// reset base conn
// clear extensions // clear extensions
this->baseConn->connections.clear(); this->baseConn->connections.clear();
} }
@ -627,7 +628,6 @@ QVariant ClimbingRace::getBaseStationConnections() {
return baseConn->getConnections(); return baseConn->getConnections();
} }
bool ClimbingRace::reloadBaseStationIpAdress() { bool ClimbingRace::reloadBaseStationIpAdress() {
if(this->baseConn->state == "disconnected"){ if(this->baseConn->state == "disconnected"){
this->baseConn->setIP(pGlobalAppSettings->loadSetting("baseStationIpAdress")); this->baseConn->setIP(pGlobalAppSettings->loadSetting("baseStationIpAdress"));

View file

@ -1,4 +1,4 @@
QT += quick sql multimedia QT += quick qml quickcontrols2 sql multimedia
android { android {
QT += androidextras QT += androidextras