From 569f3736f93a7ecb7ed11c94c80cfeb32f167b7d Mon Sep 17 00:00:00 2001 From: Kenz Dale Date: Thu, 23 Aug 2012 17:14:47 +0200 Subject: [PATCH] Removed HiTLv2 sources. --- .../src/plugins/hitlv2/aerosimrc.cpp | 495 --------- .../src/plugins/hitlv2/aerosimrc.h | 73 -- .../plugins/hitlv2/aerosimrc/aerosimrc.pro | 10 - .../aerosimrc/src/aerosimrcdatastruct.h | 206 ---- .../src/plugins/hitlv2/aerosimrc/src/enums.h | 102 -- .../plugins/hitlv2/aerosimrc/src/plugin.cpp | 394 -------- .../src/plugins/hitlv2/aerosimrc/src/plugin.h | 53 - .../plugins/hitlv2/aerosimrc/src/plugin.pro | 71 -- .../hitlv2/aerosimrc/src/qdebughandler.cpp | 64 -- .../hitlv2/aerosimrc/src/qdebughandler.h | 37 - .../hitlv2/aerosimrc/src/resources/cc_off.tga | Bin 128570 -> 0 bytes .../aerosimrc/src/resources/cc_off_hover.tga | Bin 128400 -> 0 bytes .../hitlv2/aerosimrc/src/resources/cc_on.tga | Bin 134221 -> 0 bytes .../aerosimrc/src/resources/cc_on_hover.tga | Bin 134442 -> 0 bytes .../aerosimrc/src/resources/cc_plugin.ini | 55 - .../hitlv2/aerosimrc/src/resources/plugin.txt | 86 -- .../plugins/hitlv2/aerosimrc/src/settings.cpp | 98 -- .../plugins/hitlv2/aerosimrc/src/settings.h | 67 -- .../hitlv2/aerosimrc/src/udpconnect.cpp | 228 ----- .../plugins/hitlv2/aerosimrc/src/udpconnect.h | 90 -- .../plugins/hitlv2/aerosimrc/src/udptest.pro | 17 - .../hitlv2/aerosimrc/src/udptestmain.cpp | 38 - .../hitlv2/aerosimrc/src/udptestwidget.cpp | 537 ---------- .../hitlv2/aerosimrc/src/udptestwidget.h | 91 -- .../hitlv2/aerosimrc/src/udptestwidget.ui | 940 ------------------ .../src/plugins/hitlv2/hitlv2.pluginspec | 12 - .../src/plugins/hitlv2/hitlv2.pro | 5 - .../plugins/hitlv2/hitlv2_dependencies.pri | 4 - .../plugins/hitlv2/hitlv2configuration.cpp | 178 ---- .../src/plugins/hitlv2/hitlv2configuration.h | 61 -- .../src/plugins/hitlv2/hitlv2factory.cpp | 59 -- .../src/plugins/hitlv2/hitlv2factory.h | 52 - .../src/plugins/hitlv2/hitlv2gadget.cpp | 50 - .../src/plugins/hitlv2/hitlv2gadget.h | 60 -- .../src/plugins/hitlv2/hitlv2optionspage.cpp | 146 --- .../src/plugins/hitlv2/hitlv2optionspage.h | 61 -- .../src/plugins/hitlv2/hitlv2optionspage.ui | 639 ------------ .../src/plugins/hitlv2/hitlv2plugin.cpp | 71 -- .../src/plugins/hitlv2/hitlv2plugin.h | 67 -- .../src/plugins/hitlv2/hitlv2widget.cpp | 188 ---- .../src/plugins/hitlv2/hitlv2widget.h | 72 -- .../src/plugins/hitlv2/hitlv2widget.ui | 314 ------ .../src/plugins/hitlv2/plugin.pro | 32 - .../src/plugins/hitlv2/simulatorv2.cpp | 341 ------- .../src/plugins/hitlv2/simulatorv2.h | 222 ----- 45 files changed, 6386 deletions(-) delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/aerosimrc.pro delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/aerosimrcdatastruct.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/enums.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.pro delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/qdebughandler.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/qdebughandler.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_off.tga delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_off_hover.tga delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_on.tga delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_on_hover.tga delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_plugin.ini delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/plugin.txt delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/settings.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/settings.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udpconnect.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udpconnect.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptest.pro delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestmain.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.ui delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pluginspec delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pro delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2_dependencies.pri delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2configuration.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2configuration.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2factory.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2factory.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2gadget.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2gadget.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.ui delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2plugin.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2plugin.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.h delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.ui delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/plugin.pro delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/simulatorv2.cpp delete mode 100644 ground/openpilotgcs/src/plugins/hitlv2/simulatorv2.h diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc.cpp b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc.cpp deleted file mode 100644 index f8306e30d..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc.cpp +++ /dev/null @@ -1,495 +0,0 @@ -/** - ****************************************************************************** - * - * @file aerosimrc.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "aerosimrc.h" -#include -#include -#include - -AeroSimRCSimulator::AeroSimRCSimulator(const SimulatorSettings ¶ms) - : Simulator(params) -{ - udpCounterASrecv = 0; -} - -AeroSimRCSimulator::~AeroSimRCSimulator() -{ -} - -bool AeroSimRCSimulator::setupProcess() -{ - QMutexLocker locker(&lock); - return true; -} - -void AeroSimRCSimulator::setupUdpPorts(const QString &host, int inPort, int outPort) -{ - Q_UNUSED(outPort) - if (inSocket->bind(QHostAddress(host), inPort)) - emit processOutput("Successfully bound to address " + host + ", port " + QString::number(inPort) + "\n"); - else - emit processOutput("Cannot bind to address " + host + ", port " + QString::number(inPort) + "\n"); -} - -void AeroSimRCSimulator::transmitUpdate() -{ - // read actuator output - ActuatorCommand::DataFields actCmdData; - actCmdData = actCommand->getData(); - float channels[10]; - for (int i = 0; i < 10; ++i) { - qint16 ch = actCmdData.Channel[i]; - float out = -1.0; - if (ch >= 1000 && ch <= 2000) { - ch -= 1000; - out = ((float)ch / 500.0) - 1.0; - } - channels[i] = out; - } - - // read flight status - FlightStatus::DataFields flightData; - flightData = flightStatus->getData(); - quint8 armed; - quint8 mode; - armed = flightData.Armed; - mode = flightData.FlightMode; - - QByteArray data; - // 50 - current size of values, 4(quint32) + 10*4(float) + 2(quint8) + 4(quint32) - data.resize(50); - QDataStream stream(&data, QIODevice::WriteOnly); - stream.setFloatingPointPrecision(QDataStream::SinglePrecision); - stream << quint32(0x52434D44); // magic header, "RCMD" - for (int i = 0; i < 10; ++i) - stream << channels[i]; // channels - stream << armed << mode; // flight status - stream << udpCounterASrecv; // packet counter - - if (outSocket->writeDatagram(data, QHostAddress(settings.remoteAddress), settings.outPort) == -1) { - qDebug() << "write failed: " << outSocket->errorString(); - } - -#ifdef DBG_TIMERS - static int cntTX = 0; - if (cntTX >= 100) { - qDebug() << "TX=" << 1000.0 * 100 / timeTX.restart(); - cntTX = 0; - } else { - ++cntTX; - } -#endif -} - -void AeroSimRCSimulator::processUpdate(const QByteArray &data) -{ - // check size - if (data.size() > 188) { - qDebug() << "!!! big datagram: " << data.size(); - return; - } - - QByteArray buf = data; - QDataStream stream(&buf, QIODevice::ReadOnly); - stream.setFloatingPointPrecision(QDataStream::SinglePrecision); - - // check magic header - quint32 magic; - stream >> magic; - if (magic != 0x4153494D) { // "AERO" - qDebug() << "wrong magic: " << magic << ", correct: " << quint32(0x4153494D); - return; - } - - float timeStep, - homeX, homeY, homeZ, - WpHX, WpHY, WpLat, WpLon, - posX, posY, posZ, // world - velX, velY, velZ, // world - angX, angY, angZ, // model - accX, accY, accZ, // model - lat, lon, agl, // world - yaw, pitch, roll, // model - volt, curr, - rx, ry, rz, fx, fy, fz, ux, uy, uz, // matrix - ch[8]; - - stream >> timeStep; - stream >> homeX >> homeY >> homeZ; - stream >> WpHX >> WpHY >> WpLat >> WpLon; - stream >> posX >> posY >> posZ; - stream >> velX >> velY >> velZ; - stream >> angX >> angY >> angZ; - stream >> accX >> accY >> accZ; - stream >> lat >> lon >> agl; - stream >> yaw >> pitch >> roll; - stream >> volt >> curr; - stream >> rx >> ry >> rz >> fx >> fy >> fz >> ux >> uy >> uz; - stream >> ch[0] >> ch[1] >> ch[2] >> ch[3] >> ch[4] >> ch[5] >> ch[6] >> ch[7]; - stream >> udpCounterASrecv; - - /**********************************************************************************************/ - QTime currentTime = QTime::currentTime(); - /**********************************************************************************************/ - static bool firstRun = true; - if (settings.homeLocation) { - if (firstRun) { - HomeLocation::DataFields homeData; - homeData = posHome->getData(); - - homeData.Latitude = WpLat * 10e6; - homeData.Longitude = WpLon * 10e6; - homeData.Altitude = homeZ; - homeData.Set = HomeLocation::SET_TRUE; - - posHome->setData(homeData); - - firstRun = false; - } - if (settings.homeLocRate > 0) { - static QTime homeLocTime = currentTime; - if (homeLocTime.secsTo(currentTime) >= settings.homeLocRate) { - firstRun = true; - homeLocTime = currentTime; - } - } - } - /**********************************************************************************************/ - if (settings.attRaw || settings.attActual) { - QMatrix4x4 mat; - mat = QMatrix4x4( fy, fx, -fz, 0.0, // model matrix - ry, rx, -rz, 0.0, // (X,Y,Z) -> (+Y,+X,-Z) - -uy, -ux, uz, 0.0, - 0.0, 0.0, 0.0, 1.0); - mat.optimize(); - - QQuaternion quat; // model quat - asMatrix2Quat(mat, quat); - - // rotate gravity - QVector3D acc = QVector3D(accY, accX, -accZ); // accel (X,Y,Z) -> (+Y,+X,-Z) - QVector3D gee = QVector3D(0.0, 0.0, -GEE); - QQuaternion qWorld = quat.conjugate(); - gee = qWorld.rotatedVector(gee); - acc += gee; - - /*************************************************************************************/ - if (settings.attRaw) { - Accels::DataFields accelsData; - accelsData = accels->getData(); - Gyros::DataFields gyrosData; - gyrosData = gyros->getData(); - - gyrosData.x = angY * RAD2DEG; // gyros (X,Y,Z) -> (+Y,+X,-Z) - gyrosData.y = angX * RAD2DEG; - gyrosData.z = angZ * -RAD2DEG; - accelsData.x = acc.x(); - accelsData.y = acc.y(); - accelsData.z = acc.z(); - - accels->setData(accelsData); - gyros->setData(gyrosData); - } - /*************************************************************************************/ - if (settings.attActHW) { - // do nothing - /*****************************************/ - } else if (settings.attActSim) { - // take all data from simulator - AttitudeActual::DataFields attActData; - attActData = attActual->getData(); - - QVector3D rpy; // model roll, pitch, yaw - asMatrix2RPY(mat, rpy); - - attActData.Roll = rpy.x(); - attActData.Pitch = rpy.y(); - attActData.Yaw = rpy.z(); - attActData.q1 = quat.scalar(); - attActData.q2 = quat.x(); - attActData.q3 = quat.y(); - attActData.q4 = quat.z(); - - attActual->setData(attActData); - /*****************************************/ - } else if (settings.attActCalc) { - // calculate RPY with code from Attitude module - AttitudeActual::DataFields attActData; - attActData = attActual->getData(); - - static float q[4] = {1, 0, 0, 0}; - static float gyro_correct_int2 = 0; - - float dT = timeStep; - - AttitudeSettings::DataFields attSettData = attSettings->getData(); - float accelKp = attSettData.AccelKp * 0.1666666666666667; - float accelKi = attSettData.AccelKp * 0.1666666666666667; - float yawBiasRate = attSettData.YawBiasRate; - - // calibrate sensors on arming - if (flightStatus->getData().Armed == FlightStatus::ARMED_ARMING) { - accelKp = 2.0; - accelKi = 0.9; - } - - float gyro[3] = {angY * RAD2DEG, angX * RAD2DEG, angZ * -RAD2DEG}; - float attRawAcc[3] = {acc.x(), acc.y(), acc.z()}; - - // code from Attitude module begin /////////////////////////////// - float *accels = attRawAcc; - float grot[3]; - float accel_err[3]; - - // Rotate gravity to body frame and cross with accels - grot[0] = -(2 * (q[1] * q[3] - q[0] * q[2])); - grot[1] = -(2 * (q[2] * q[3] + q[0] * q[1])); - grot[2] = -(q[0] * q[0] - q[1]*q[1] - q[2]*q[2] + q[3]*q[3]); - - // CrossProduct - { - accel_err[0] = accels[1]*grot[2] - grot[1]*accels[2]; - accel_err[1] = grot[0]*accels[2] - accels[0]*grot[2]; - accel_err[2] = accels[0]*grot[1] - grot[0]*accels[1]; - } - - // Account for accel magnitude - float accel_mag = sqrt(accels[0] * accels[0] + accels[1] * accels[1] + accels[2] * accels[2]); - accel_err[0] /= accel_mag; - accel_err[1] /= accel_mag; - accel_err[2] /= accel_mag; - - // Accumulate integral of error. Scale here so that units are (deg/s) but Ki has units of s - gyro_correct_int2 += -gyro[2] * yawBiasRate; - - // Correct rates based on error, integral component dealt with in updateSensors - gyro[0] += accel_err[0] * accelKp / dT; - gyro[1] += accel_err[1] * accelKp / dT; - gyro[2] += accel_err[2] * accelKp / dT + gyro_correct_int2; - - // Work out time derivative from INSAlgo writeup - // Also accounts for the fact that gyros are in deg/s - float qdot[4]; - qdot[0] = (-q[1] * gyro[0] - q[2] * gyro[1] - q[3] * gyro[2]) * dT * M_PI / 180 / 2; - qdot[1] = (+q[0] * gyro[0] - q[3] * gyro[1] + q[2] * gyro[2]) * dT * M_PI / 180 / 2; - qdot[2] = (+q[3] * gyro[0] + q[0] * gyro[1] - q[1] * gyro[2]) * dT * M_PI / 180 / 2; - qdot[3] = (-q[2] * gyro[0] + q[1] * gyro[1] + q[0] * gyro[2]) * dT * M_PI / 180 / 2; - - // Take a time step - q[0] += qdot[0]; - q[1] += qdot[1]; - q[2] += qdot[2]; - q[3] += qdot[3]; - - if(q[0] < 0) { - q[0] = -q[0]; - q[1] = -q[1]; - q[2] = -q[2]; - q[3] = -q[3]; - } - - // Renomalize - float qmag = sqrt((q[0] * q[0]) + (q[1] * q[1]) + (q[2] * q[2]) + (q[3] * q[3])); - q[0] /= qmag; - q[1] /= qmag; - q[2] /= qmag; - q[3] /= qmag; - - // If quaternion has become inappropriately short or is nan reinit. - // THIS SHOULD NEVER ACTUALLY HAPPEN - if((fabs(qmag) < 1e-3) || (qmag != qmag)) { - q[0] = 1; - q[1] = 0; - q[2] = 0; - q[3] = 0; - } - - float rpy2[3]; - // Quaternion2RPY - { - float q0s, q1s, q2s, q3s; - q0s = q[0] * q[0]; - q1s = q[1] * q[1]; - q2s = q[2] * q[2]; - q3s = q[3] * q[3]; - - float R13, R11, R12, R23, R33; - R13 = 2 * (q[1] * q[3] - q[0] * q[2]); - R11 = q0s + q1s - q2s - q3s; - R12 = 2 * (q[1] * q[2] + q[0] * q[3]); - R23 = 2 * (q[2] * q[3] + q[0] * q[1]); - R33 = q0s - q1s - q2s + q3s; - - rpy2[1] = RAD2DEG * asinf(-R13); // pitch always between -pi/2 to pi/2 - rpy2[2] = RAD2DEG * atan2f(R12, R11); - rpy2[0] = RAD2DEG * atan2f(R23, R33); - } - - attActData.Roll = rpy2[0]; - attActData.Pitch = rpy2[1]; - attActData.Yaw = rpy2[2]; - attActData.q1 = q[0]; - attActData.q2 = q[1]; - attActData.q3 = q[2]; - attActData.q4 = q[3]; - attActual->setData(attActData); - /*****************************************/ - } - } - /**********************************************************************************************/ - if (settings.gcsReciever) { - static QTime gcsRcvrTime = currentTime; - if (!settings.manualOutput || gcsRcvrTime.msecsTo(currentTime) >= settings.outputRate) { - GCSReceiver::DataFields gcsRcvrData; - gcsRcvrData = gcsReceiver->getData(); - - for (int i = 0; i < 8; ++i) - gcsRcvrData.Channel[i] = 1500 + (ch[i] * 500); - - gcsReceiver->setData(gcsRcvrData); - if (settings.manualOutput) - gcsRcvrTime = currentTime; - } - } else if (settings.manualControl) { - // not implemented yet - } - /**********************************************************************************************/ - if (settings.gpsPosition) { - static QTime gpsPosTime = currentTime; - if (gpsPosTime.msecsTo(currentTime) >= settings.gpsPosRate) { - GPSPosition::DataFields gpsPosData; - gpsPosData = gpsPosition->getData(); - - gpsPosData.Altitude = posZ; - gpsPosData.Heading = yaw * RAD2DEG; - gpsPosData.Latitude = lat * 10e6; - gpsPosData.Longitude = lon * 10e6; - gpsPosData.Groundspeed = qSqrt(velX * velX + velY * velY); - gpsPosData.GeoidSeparation = 0.0; - gpsPosData.Satellites = 8; - gpsPosData.PDOP = 3.0; - gpsPosData.Status = GPSPosition::STATUS_FIX3D; - - gpsPosition->setData(gpsPosData); - gpsPosTime = currentTime; - } - } - /**********************************************************************************************/ - if (settings.sonarAltitude) { - static QTime sonarAltTime = currentTime; - if (sonarAltTime.msecsTo(currentTime) >= settings.sonarAltRate) { - SonarAltitude::DataFields sonarAltData; - sonarAltData = sonarAlt->getData(); - - float sAlt = settings.sonarMaxAlt; - // 0.35 rad ~= 20 degree - if ((agl < (sAlt * 2.0)) && (roll < 0.35) && (pitch < 0.35)) { - float x = agl * qTan(roll); - float y = agl * qTan(pitch); - float h = qSqrt(x*x + y*y + agl*agl); - sAlt = qMin(h, sAlt); - } - - sonarAltData.Altitude = sAlt; - sonarAlt->setData(sonarAltData); - sonarAltTime = currentTime; - } - } - /**********************************************************************************************/ -/* - BaroAltitude::DataFields altActData; - altActData = altActual->getData(); - altActData.Altitude = posZ; - altActual->setData(altActData); - - PositionActual::DataFields posActData; - posActData = posActual->getData(); - posActData.North = posY * 100; - posActData.East = posX * 100; - posActData.Down = posZ * -100; - posActual->setData(posActData); - - VelocityActual::DataFields velActData; - velActData = velActual->getData(); - velActData.North = velY * 100; - velActData.East = velX * 100; - velActData.Down = velZ * 100; - velActual->setData(velActData); -*/ - -#ifdef DBG_TIMERS - static int cntRX = 0; - if (cntRX >= 100) { - qDebug() << "RX=" << 1000.0 * 100 / timeRX.restart(); - cntRX = 0; - } else { - ++cntRX; - } -#endif -} - -// transfomations - -void AeroSimRCSimulator::asMatrix2Quat(const QMatrix4x4 &m, QQuaternion &q) -{ - qreal w, x, y, z; - - // w always >= 0 - w = qSqrt(qMax(0.0, 1.0 + m(0, 0) + m(1, 1) + m(2, 2))) / 2.0; - x = qSqrt(qMax(0.0, 1.0 + m(0, 0) - m(1, 1) - m(2, 2))) / 2.0; - y = qSqrt(qMax(0.0, 1.0 - m(0, 0) + m(1, 1) - m(2, 2))) / 2.0; - z = qSqrt(qMax(0.0, 1.0 - m(0, 0) - m(1, 1) + m(2, 2))) / 2.0; - - x = copysign(x, (m(1, 2) - m(2, 1))); - y = copysign(y, (m(2, 0) - m(0, 2))); - z = copysign(z, (m(0, 1) - m(1, 0))); - - q.setScalar(w); - q.setX(x); - q.setY(y); - q.setZ(z); -} - -void AeroSimRCSimulator::asMatrix2RPY(const QMatrix4x4 &m, QVector3D &rpy) -{ - qreal roll, pitch, yaw; - - if (qFabs(m(0, 2)) > 0.998) { - // ~86.3°, gimbal lock - roll = 0.0; - pitch = copysign(M_PI_2, -m(0, 2)); - yaw = qAtan2(-m(1, 0), m(1, 1)); - } else { - roll = qAtan2(m(1, 2), m(2, 2)); - pitch = qAsin(-m(0, 2)); - yaw = qAtan2(m(0, 1), m(0, 0)); - } - - rpy.setX(roll * RAD2DEG); - rpy.setY(pitch * RAD2DEG); - rpy.setZ(yaw * RAD2DEG); -} diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc.h b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc.h deleted file mode 100644 index 42b7d4aa5..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc.h +++ /dev/null @@ -1,73 +0,0 @@ -/** - ****************************************************************************** - * - * @file aerosimrc.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef AEROSIMRC_H -#define AEROSIMRC_H - -#include -#include -#include -#include -#include "simulatorv2.h" - -class AeroSimRCSimulator: public Simulator -{ - Q_OBJECT - -public: - AeroSimRCSimulator(const SimulatorSettings ¶ms); - ~AeroSimRCSimulator(); - - bool setupProcess(); - void setupUdpPorts(const QString& host, int inPort, int outPort); - -private slots: - void transmitUpdate(); - -private: - quint32 udpCounterASrecv; //keeps track of udp packets received by ASim - - void processUpdate(const QByteArray &data); - - void asMatrix2Quat(const QMatrix4x4 &m, QQuaternion &q); - void asMatrix2RPY(const QMatrix4x4 &m, QVector3D &rpy); -}; - -class AeroSimRCSimulatorCreator : public SimulatorCreator -{ -public: - AeroSimRCSimulatorCreator(const QString &classId, const QString &description) - : SimulatorCreator (classId, description) - {} - - Simulator* createSimulator(const SimulatorSettings ¶ms) - { - return new AeroSimRCSimulator(params); - } -}; - -#endif // AEROSIMRC_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/aerosimrc.pro b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/aerosimrc.pro deleted file mode 100644 index 74df87185..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/aerosimrc.pro +++ /dev/null @@ -1,10 +0,0 @@ -TEMPLATE = subdirs - -win32 { - SUBDIRS += plugin -} - -SUBDIRS += udptest - -plugin.file = src/plugin.pro -udptest.file = src/udptest.pro diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/aerosimrcdatastruct.h b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/aerosimrcdatastruct.h deleted file mode 100644 index 697695bc2..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/aerosimrcdatastruct.h +++ /dev/null @@ -1,206 +0,0 @@ -/** - ****************************************************************************** - * - * @file aerosimrcdatastruct.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef AEROSIMRCDATASTRUCT_H -#define AEROSIMRCDATASTRUCT_H - -#include - -const quint8 AEROSIMRC_MAX_CHANNELS = 39; -const quint16 DBG_BUFFER_MAX_SIZE = 4096; - -#define MAX_DLL_USER_MENU_ITEMS 16 -#define OBSOLETE_MIT_COMMAND (1 << 0) -#define OBSOLETE_MIT_CHECKBOX (1 << 1) -#define OBSOLETE_MIT_SEPARATOR (1 << 7) - -#define PACK_STRUCT __attribute__((packed)) - -struct simToPlugin -{ - quint16 structSize; - float simTimeStep; - float chSimTX[AEROSIMRC_MAX_CHANNELS]; - float chSimRX[AEROSIMRC_MAX_CHANNELS]; - uchar *OSDVideoBuf; - quint32 simMenuStatus; - float initPosX; - float initPosY; - float initPosZ; - float initHeading; - float initPitch; - float initRoll; - float wpHomeX; - float wpHomeY; - float wpHomeLat; - float wpHomeLong; - const char *wpHomeDesc; // (m, deg, string) - float wpAX; - float wpAY; - float wpALat; - float wpALong; - const char *wpADesc; // (m, deg, string) - float wpBX; - float wpBY; - float wpBLat; - float wpBLong; - const char *wpBDesc; // (m, deg, string) - float wpCX; - float wpCY; - float wpCLat; - float wpCLong; - const char *wpCDesc; // (m, deg, string) - float wpDX; - float wpDY; - float wpDLat; - float wpDLong; - const char *wpDDesc; // (m, deg, string) - float posX; - float posY; - float posZ; - float velX; - float velY; - float velZ; - float angVelX; - float angVelY; - float angVelZ; - float accelX; - float accelY; - float accelZ; - qreal latitude; - qreal longitude; - float AGL; - float heading; - float pitch; - float roll; - float windVelX; - float windVelY; - float windVelZ; - float eng1RPM; - float eng2RPM; - float eng3RPM; - float eng4RPM; - float voltage; // V - float current; // A - float consumedCharge; // Ah - float capacity; // Ah - float fuelConsumed; // l - float fuelTankCapacity; // l - // ver 3.83 - qint16 screenW; - qint16 screenH; - // Model Orientation Matrix (X=Right, Y=Front, Z=Up) - float axisXx; - float axisXy; - float axisXz; - float axisYx; - float axisYy; - float axisYz; - float axisZx; - float axisZy; - float axisZz; - // Model data in body frame coordinates (X=Right, Y=Front, Z=Up) - float velXm; // m/s Model velocity in body coordinates - float velYm; - float velZm; - float angVelXm; // rad/s Model angular velocity in body coordinates - float angVelYm; - float angVelZm; - float accelXm; // m/s/s Model acceleration in body coordinates - float accelYm; - float accelZm; - // ver 3.90 - quint32 OSDVideoBufSize; -} PACK_STRUCT ; // normal - 592, packed - 582 OK (3.81) - // normal - ???, packed - 658 OK (3.83) - // normal - ???, packed - 662 OK (3.90) - -struct pluginToSim -{ - quint16 structSize; - const char *dbgInfoText; - uchar chOverTX[AEROSIMRC_MAX_CHANNELS]; - float chNewTX[AEROSIMRC_MAX_CHANNELS]; - uchar chOverRX[AEROSIMRC_MAX_CHANNELS]; - float chNewRX[AEROSIMRC_MAX_CHANNELS]; - float newPosX; // m - float newPosY; - float newPosZ; - float newVelX; // m/s - float newVelY; - float newVelZ; - float newAngVelX; // rad/s - float newAngVelY; - float newAngVelZ; - float newHeading; // rad - float newPitch; - float newRoll; - quint32 modelOverrideFlags; - quint32 newMenuStatus; - quint8 isOSDShow; - quint8 isOSDChanged; - quint16 OSDWindow_DX; - quint16 OSDWindow_DY; - float OSDScale; - float newWindVelX; - float newWindVelY; - float newWindVelZ; - float newEng1RPM; - float newEng2RPM; - float newEng3RPM; - float newEng4RPM; - float newVoltage; - float newCurrent; - float newConsumedCharge; - float newFuelConsumed; - quint8 modelCrashInhibit; - // ver 3.83 - qint16 newScreenW; // Simulator window position and size on screen - qint16 newScreenH; - qint16 newScreenX; - qint16 newScreenY; -} PACK_STRUCT ; // normal 516, packed 507 OK (3.81) - // normal ???, packed 515 OK (3.83 & 3.90) - -struct TPluginMenuItem -{ - quint32 OBSOLETE_eType; - char *OBSOLETE_strName; -} PACK_STRUCT ; - -struct pluginInit -{ - quint32 nStructSize; - char *OBSOLETE_strMenuTitle; - TPluginMenuItem OBSOLETE_atMenuItem[MAX_DLL_USER_MENU_ITEMS]; - const char *strPluginFolder; - const char *strOutputFolder; -} PACK_STRUCT ; // normal - 144, packed - 144 OK (3.81 & 3.83 & 3.90) - -#undef PACK_STRUCT - -#endif // AEROSIMRCDATASTRUCT_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/enums.h b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/enums.h deleted file mode 100644 index 31abb1e0a..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/enums.h +++ /dev/null @@ -1,102 +0,0 @@ -/** - ****************************************************************************** - * - * @file enums.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef ENUMS_H -#define ENUMS_H - -// Custom Menu Item masks -enum MenuMasks { - MenuEnable = (1 << 0), - MenuTx = (1 << 1), - MenuRx = (1 << 2), - MenuScreen = (1 << 3), - MenuNextWpt = (1 << 4), - MenuCmdReset = (1 << 5), - MenuLedBlue = (1 << 6), - MenuLedGreen = (1 << 7), - MenuFMode1 = (1 << 8), - MenuFMode2 = (1 << 9), - MenuFMode3 = (1 << 10) -}; - -enum EOverrideFlags -{ - OVR_POS = (1 << 0), - OVR_VEL = (1 << 1), - OVR_ANG_VEL = (1 << 2), - OVR_HPR = (1 << 3), // Override Heading, Pitch and Roll - OVR_WIND_VEL = (1 << 4), // Override Wind velocity at model - OVR_ENGINE_RPM = (1 << 5), // Override RPM of all Engines or Motors - OVR_BAT_VOLT = (1 << 6), // Override motor Battery Voltage - OVR_BAT_AMP = (1 << 7), // Override motor Battery current - OVR_BAT_AH_CONSUMED = (1 << 8), // Override motor Battery AmpsHour consumed - OVR_FUEL_CONSUMED = (1 << 9) // Override Fuel consumed (gas & jet engines) -}; - -enum Channels { - Ch1Aileron, - Ch2Elevator, - Ch3Throttle, - Ch4Rudder, - Ch5, - Ch6, - Ch7, - Ch8, - Ch9, - Ch10Retracts, - Ch11Flaps, - Ch12FPVCamPan, - Ch13FPVCamTilt, - Ch14Brakes, - Ch15Spoilers, - Ch16Smoke, - Ch17Fire, - Ch18FlightMode, - Ch19ALTHold, - Ch20FPVTiltHold, - Ch21ResetModel, - Ch22MouseTX, - Ch23Plugin1, - Ch24Plugin2, - Ch25ThrottleHold, - Ch26CareFree, - Ch27FPVCamRoll, - Ch28LMotorDual, - Ch29RMotorDual, - Ch30Mix, - Ch31Mix, - Ch32Mix, - Ch33Mix, - Ch34Mix, - Ch35Mix, - Ch36Mix, - Ch37Mix, - Ch38Mix, - Ch39Mix -}; - -#endif // ENUMS_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.cpp b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.cpp deleted file mode 100644 index 18ba2c15d..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.cpp +++ /dev/null @@ -1,394 +0,0 @@ -/** - ****************************************************************************** - * - * @file plugin.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "plugin.h" -#include "udpconnect.h" -#include "qdebughandler.h" -#include "enums.h" -#include "settings.h" - -bool isFirstRun = true; -QString debugInfo(DBG_BUFFER_MAX_SIZE, ' '); -QString pluginFolder(MAX_PATH, ' '); -QString outputFolder(MAX_PATH, ' '); - -QList videoModes; -QTime ledTimer; - -UdpSender *sndr; -UdpReceiver *rcvr; - -const float RAD2DEG = (float)(180.0 / M_PI); -const float DEG2RAD = (float)(M_PI / 180.0); - -//extern "C" int __stdcall DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) -extern "C" int __stdcall DllMain(void*, quint32 fdwReason, void*) -{ - switch (fdwReason) { - case 0: -// qDebug() << hinstDLL << "DLL_PROCESS_DETACH " << lpvReserved; -// free resources here - rcvr->stop(); - rcvr->wait(500); - delete rcvr; - delete sndr; - qDebug("------"); - break; - case 1: -// qDebug() << hinstDLL << " DLL_PROCESS_ATTACH " << lpvReserved; - break; - case 2: -// qDebug() << hinstDLL << "DLL_THREAD_ATTACH " << lpvReserved; - break; - case 3: -// qDebug() << hinstDLL << "DLL_THREAD_DETACH " << lpvReserved; - break; - } - return true; -} - -SIM_DLL_EXPORT void AeroSIMRC_Plugin_ReportStructSizes(quint32 *sizeSimToPlugin, - quint32 *sizePluginToSim, - quint32 *sizePluginInit) -{ - // debug redirection - qInstallMsgHandler(myQDebugHandler); - - qDebug() << "AeroSIMRC_Plugin_ReportStructSizes"; - *sizeSimToPlugin = sizeof(simToPlugin); - *sizePluginToSim = sizeof(pluginToSim); - *sizePluginInit = sizeof(pluginInit); - qDebug() << "sizeSimToPlugin = " << *sizeSimToPlugin; - qDebug() << "sizePluginToSim = " << *sizePluginToSim; - qDebug() << "sizePluginInit = " << *sizePluginInit; -} - -SIM_DLL_EXPORT void AeroSIMRC_Plugin_Init(pluginInit *p) -{ - qDebug() << "AeroSIMRC_Plugin_Init begin"; - - pluginFolder = p->strPluginFolder; - outputFolder = p->strOutputFolder; - - ledTimer.restart(); - - Settings *ini = new Settings(pluginFolder); - ini->read(); - - videoModes = ini->getVideoModes(); - - sndr = new UdpSender(ini->getOutputMap(), ini->isFromTX()); - sndr->init(ini->remoteHost(), ini->remotePort()); - - rcvr = new UdpReceiver(ini->getInputMap(), ini->isToRX()); - rcvr->init(ini->localHost(), ini->localPort()); - - // run thread - rcvr->start(); - - delete ini; - - qDebug() << "AeroSIMRC_Plugin_Init done"; -} - -//----------------------------------------------------------------------------- - -void Run_Command_Reset(/*const simToPlugin *stp, - pluginToSim *pts*/) -{ - // Print some debug info, although it will only be seen during one frame - debugInfo.append("\nRESET"); -} - -void Run_Command_WindowSizeAndPos(const simToPlugin *stp, - pluginToSim *pts) -{ - static quint8 snSequence = 0; - quint8 idx = snSequence * 4; - - if (snSequence >= videoModes.at(0)) { // set fullscreen - pts->newScreenX = 0; - pts->newScreenY = 0; - pts->newScreenW = stp->screenW; - pts->newScreenH = stp->screenH; - snSequence = 0; - } else { // set video mode from config - pts->newScreenX = videoModes.at(idx + 1); - pts->newScreenY = videoModes.at(idx + 2); - pts->newScreenW = videoModes.at(idx + 3); - pts->newScreenH = videoModes.at(idx + 4); - snSequence++; - } -} - -void Run_Command_MoveToNextWaypoint(const simToPlugin *stp, - pluginToSim *pts) -{ - static quint8 snSequence = 0; - - switch(snSequence) { - case 0: - pts->newPosX = stp->wpAX; - pts->newPosY = stp->wpAY; - pts->newPosZ = 100.0; - break; - case 1: - pts->newPosX = stp->wpBX; - pts->newPosY = stp->wpBY; - pts->newPosZ = 100.0; - break; - case 2: - pts->newPosX = stp->wpCX; - pts->newPosY = stp->wpCY; - pts->newPosZ = 100.0; - break; - case 3: - pts->newPosX = stp->wpDX; - pts->newPosY = stp->wpDY; - pts->newPosZ = 100.0; - break; - case 4: - pts->newPosX = stp->wpHomeX; - pts->newPosY = stp->wpHomeY; - pts->newPosZ = 100.0; - break; - default: - qFatal("Run_Command_MoveToNextWaypoint switch error"); - } - pts->modelOverrideFlags = 0; - pts->modelOverrideFlags |= OVR_POS; - - snSequence++; - if(snSequence > 4) - snSequence = 0; -} - -void Run_BlinkLEDs(const simToPlugin *stp, - pluginToSim *pts) -{ - if ((stp->simMenuStatus & MenuEnable) != 0) { - pts->newMenuStatus |= MenuLedGreen; - int timeout; - quint8 armed; - quint8 mode; - rcvr->getFlighStatus(armed, mode); - debugInfo.append(QString("armed: %1, mode: %2\n").arg(armed).arg(mode)); - - if (armed == 0) // disarm - timeout = 1000; - else if (armed == 1) // arming - timeout = 40; - else if (armed == 2) // armed - timeout = 100; - else // unknown - timeout = 2000; - if (ledTimer.elapsed() > timeout) { - ledTimer.restart(); - pts->newMenuStatus ^= MenuLedBlue; - } - - if (mode == 6) { - pts->newMenuStatus |= MenuFMode3; - pts->newMenuStatus |= MenuFMode2; - pts->newMenuStatus |= MenuFMode1; - } else if (mode == 5) { - pts->newMenuStatus |= MenuFMode3; - pts->newMenuStatus |= MenuFMode2; - pts->newMenuStatus &= ~MenuFMode1; - } else if (mode == 4) { - pts->newMenuStatus |= MenuFMode3; - pts->newMenuStatus &= ~MenuFMode2; - pts->newMenuStatus |= MenuFMode1; - } else if (mode == 3) { - pts->newMenuStatus |= MenuFMode3; - pts->newMenuStatus &= ~MenuFMode2; - pts->newMenuStatus &= ~MenuFMode1; - } else if (mode == 2) { - pts->newMenuStatus &= ~MenuFMode3; - pts->newMenuStatus |= MenuFMode2; - pts->newMenuStatus &= ~MenuFMode1; - } else if (mode == 1) { - pts->newMenuStatus &= ~MenuFMode3; - pts->newMenuStatus &= ~MenuFMode2; - pts->newMenuStatus |= MenuFMode1; - } else /*(mode == 0)*/ { - pts->newMenuStatus &= ~MenuFMode3; - pts->newMenuStatus &= ~MenuFMode2; - pts->newMenuStatus &= ~MenuFMode1; - } - } else { - pts->newMenuStatus = 0; - } -} - -void InfoText(const simToPlugin *stp, - pluginToSim *pts) -{ - debugInfo.append( - QString( - "Plugin Folder = %1\n" - "Output Folder = %2\n" - "nStructSize = %3 " - "fIntegrationTimeStep = %4\n" - "\n" - "Aileron TX = %5 RX = %6 RCMD TX = %7 RX = %8\n" - "Elevator TX = %9 RX = %10 RCMD TX = %11 RX = %12\n" - "Throttle TX = %13 RX = %14 RCMD TX = %15 RX = %16\n" - "Rudder TX = %17 RX = %18 RCMD TX = %19 RX = %20\n" - "Channel5 TX = %21 RX = %22 RCMD TX = %23 RX = %24\n" - "Channel6 TX = %25 RX = %26 RCMD TX = %27 RX = %28\n" - "Channel7 TX = %29 RX = %30 RCMD TX = %31 RX = %32\n" - "PluginCh1 TX = %33 RX = %34 RCMD TX = %35 RX = %36\n" - "PluginCh2 TX = %37 RX = %38 RCMD TX = %39 RX = %40\n" - "FPVCamPan TX = %41 RX = %42 RCMD TX = %43 RX = %44\n" - "FPVCamTil TX = %45 RX = %46 RCMD TX = %47 RX = %48\n" - "\n" - "MenuItems = %49\n" - // Model data - "\n" - "fPosX,Y,Z = (%50, %51, %52)\n" - "fVelX,Y,Z = (%53, %54, %55)\n" - "fAngVelX,Y,Z = (%56, %57, %58)\n" - "fAccelX,Y,Z = (%59, %60, %61)\n" - "\n" - "Lat, Long = %62, %63\n" - "fHeightAboveTerrain = %64\n" - "\n" - "fHeading = %65 fPitch = %66 fRoll = %67\n" - ) - .arg(pluginFolder) - .arg(outputFolder) - .arg(stp->structSize) - .arg(1.0 / stp->simTimeStep, 4, 'f', 1) - .arg(stp->chSimTX[Ch1Aileron], 5, 'f', 2) - .arg(stp->chSimRX[Ch1Aileron], 5, 'f', 2) - .arg(pts->chNewTX[Ch1Aileron], 5, 'f', 2) - .arg(pts->chNewRX[Ch1Aileron], 5, 'f', 2) - .arg(stp->chSimTX[Ch2Elevator], 5, 'f', 2) - .arg(stp->chSimRX[Ch2Elevator], 5, 'f', 2) - .arg(pts->chNewTX[Ch2Elevator], 5, 'f', 2) - .arg(pts->chNewRX[Ch2Elevator], 5, 'f', 2) - .arg(stp->chSimTX[Ch3Throttle], 5, 'f', 2) - .arg(stp->chSimRX[Ch3Throttle], 5, 'f', 2) - .arg(pts->chNewTX[Ch3Throttle], 5, 'f', 2) - .arg(pts->chNewRX[Ch3Throttle], 5, 'f', 2) - .arg(stp->chSimTX[Ch4Rudder], 5, 'f', 2) - .arg(stp->chSimRX[Ch4Rudder], 5, 'f', 2) - .arg(pts->chNewTX[Ch4Rudder], 5, 'f', 2) - .arg(pts->chNewRX[Ch4Rudder], 5, 'f', 2) - .arg(stp->chSimTX[Ch5], 5, 'f', 2) - .arg(stp->chSimRX[Ch5], 5, 'f', 2) - .arg(pts->chNewTX[Ch5], 5, 'f', 2) - .arg(pts->chNewRX[Ch5], 5, 'f', 2) - .arg(stp->chSimTX[Ch6], 5, 'f', 2) - .arg(stp->chSimRX[Ch6], 5, 'f', 2) - .arg(pts->chNewTX[Ch6], 5, 'f', 2) - .arg(pts->chNewRX[Ch6], 5, 'f', 2) - .arg(stp->chSimTX[Ch7], 5, 'f', 2) - .arg(stp->chSimRX[Ch7], 5, 'f', 2) - .arg(pts->chNewTX[Ch7], 5, 'f', 2) - .arg(pts->chNewRX[Ch7], 5, 'f', 2) - .arg(stp->chSimTX[Ch23Plugin1], 5, 'f', 2) - .arg(stp->chSimRX[Ch23Plugin1], 5, 'f', 2) - .arg(pts->chNewTX[Ch23Plugin1], 5, 'f', 2) - .arg(pts->chNewRX[Ch23Plugin1], 5, 'f', 2) - .arg(stp->chSimTX[Ch24Plugin2], 5, 'f', 2) - .arg(stp->chSimRX[Ch24Plugin2], 5, 'f', 2) - .arg(pts->chNewTX[Ch24Plugin2], 5, 'f', 2) - .arg(pts->chNewRX[Ch24Plugin2], 5, 'f', 2) - .arg(stp->chSimTX[Ch12FPVCamPan], 5, 'f', 2) - .arg(stp->chSimRX[Ch12FPVCamPan], 5, 'f', 2) - .arg(pts->chNewTX[Ch12FPVCamPan], 5, 'f', 2) - .arg(pts->chNewRX[Ch12FPVCamPan], 5, 'f', 2) - .arg(stp->chSimTX[Ch13FPVCamTilt], 5, 'f', 2) - .arg(stp->chSimRX[Ch13FPVCamTilt], 5, 'f', 2) - .arg(pts->chNewTX[Ch13FPVCamTilt], 5, 'f', 2) - .arg(pts->chNewRX[Ch13FPVCamTilt], 5, 'f', 2) - .arg(stp->simMenuStatus) - .arg(stp->posX, 5, 'f', 2) - .arg(stp->posY, 5, 'f', 2) - .arg(stp->posZ, 5, 'f', 2) - .arg(stp->velX, 5, 'f', 2) - .arg(stp->velY, 5, 'f', 2) - .arg(stp->velZ, 5, 'f', 2) - .arg(stp->angVelXm, 5, 'f', 2) - .arg(stp->angVelYm, 5, 'f', 2) - .arg(stp->angVelZm, 5, 'f', 2) - .arg(stp->accelXm, 5, 'f', 2) - .arg(stp->accelYm, 5, 'f', 2) - .arg(stp->accelZm, 5, 'f', 2) - .arg(stp->latitude, 5, 'f', 2) - .arg(stp->longitude, 5, 'f', 2) - .arg(stp->AGL, 5, 'f', 2) - .arg(stp->heading*RAD2DEG, 5, 'f', 2) - .arg(stp->pitch*RAD2DEG, 5, 'f', 2) - .arg(stp->roll*RAD2DEG, 5, 'f', 2) - ); -} - -SIM_DLL_EXPORT void AeroSIMRC_Plugin_Run(const simToPlugin *stp, - pluginToSim *pts) -{ - debugInfo = "---\n"; - // By default do not change the Menu Items of type CheckBox - pts->newMenuStatus = stp->simMenuStatus; - // Extract Menu Commands from Flags - bool isReset = (stp->simMenuStatus & MenuCmdReset) != 0; - bool isEnable = (stp->simMenuStatus & MenuEnable) != 0; - bool isTxON = (stp->simMenuStatus & MenuTx) != 0; - bool isRxON = (stp->simMenuStatus & MenuRx) != 0; - bool isScreen = (stp->simMenuStatus & MenuScreen) != 0; - bool isNextWp = (stp->simMenuStatus & MenuNextWpt) != 0; - // Run commands - if (isReset) { - Run_Command_Reset(/*stp, pts*/); - } else if (isScreen) { - Run_Command_WindowSizeAndPos(stp, pts); - } else if (isNextWp) { - Run_Command_MoveToNextWaypoint(stp, pts); - } else { - Run_BlinkLEDs(stp, pts); - if (isEnable) { - if (isTxON) - sndr->sendDatagram(stp); - if (isRxON) - rcvr->setChannels(pts); - } - - // network lag - debugInfo.append(QString("out: %1, inp: %2, delta: %3\n") - .arg(sndr->pcks() - 1) - .arg(rcvr->pcks()) - .arg(sndr->pcks() - rcvr->pcks() - 1) - ); - } - - // debug info is shown on the screen - InfoText(stp, pts); - pts->dbgInfoText = debugInfo.toAscii(); - isFirstRun = false; -} diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.h b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.h deleted file mode 100644 index a590c8a24..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.h +++ /dev/null @@ -1,53 +0,0 @@ -/** - ****************************************************************************** - * - * @file plugin.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef PLUGIN_H -#define PLUGIN_H - -#include -#include -#include -#include "aerosimrcdatastruct.h" - -#define SIM_DLL_EXPORT extern "C" __declspec(dllexport) - -SIM_DLL_EXPORT void AeroSIMRC_Plugin_ReportStructSizes( - quint32 *sizeSimToPlugin, - quint32 *sizePluginToSim, - quint32 *sizePluginInit -); - -SIM_DLL_EXPORT void AeroSIMRC_Plugin_Init( - pluginInit *p -); - -SIM_DLL_EXPORT void AeroSIMRC_Plugin_Run( - const simToPlugin *stp, - pluginToSim *pts -); - -#endif // PLUGIN_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.pro b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.pro deleted file mode 100644 index 51bb42abd..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/plugin.pro +++ /dev/null @@ -1,71 +0,0 @@ -!win32 { - error("AeroSimRC plugin is only available for win32 platform") -} - -include(../../../../../openpilotgcs.pri) - -QT += network -QT -= gui - -TEMPLATE = lib -TARGET = plugin_AeroSIMRC - -RES_DIR = $${PWD}/resources -SIM_DIR = $$GCS_BUILD_TREE/../AeroSIM-RC -PLUGIN_DIR = $$SIM_DIR/Plugin/CopterControl -DLLDESTDIR = $$PLUGIN_DIR - -HEADERS = \ - aerosimrcdatastruct.h \ - enums.h \ - plugin.h \ - qdebughandler.h \ - udpconnect.h \ - settings.h - -SOURCES = \ - qdebughandler.cpp \ - plugin.cpp \ - udpconnect.cpp \ - settings.cpp - -# Resemble the AeroSimRC directory structure and copy plugin files and resources -equals(copydata, 1) { - - # Windows release only - win32:CONFIG(release, debug|release) { - - data_copy.commands += -@$(MKDIR) $$targetPath(\"$$PLUGIN_DIR\") $$addNewline() - - # resources and sample configuration - PLUGIN_RESOURCES = \ - cc_off.tga \ - cc_off_hover.tga \ - cc_on.tga \ - cc_on_hover.tga \ - cc_plugin.ini \ - plugin.txt - for(res, PLUGIN_RESOURCES) { - data_copy.commands += $(COPY_FILE) $$targetPath(\"$$RES_DIR/$$res\") $$targetPath(\"$$PLUGIN_DIR/$$res\") $$addNewline() - } - - # Qt DLLs - QT_DLLS = \ - QtCore4.dll \ - QtNetwork4.dll - for(dll, QT_DLLS) { - data_copy.commands += $(COPY_FILE) $$targetPath(\"$$[QT_INSTALL_BINS]/$$dll\") $$targetPath(\"$$SIM_DIR/$$dll\") $$addNewline() - } - - # MinGW DLLs - MINGW_DLLS = \ - libgcc_s_dw2-1.dll \ - mingwm10.dll - for(dll, MINGW_DLLS) { - data_copy.commands += $(COPY_FILE) $$targetPath(\"$$[QT_INSTALL_BINS]/../../../../../mingw/bin/$$dll\") $$targetPath(\"$$SIM_DIR/$$dll\") $$addNewline() - } - - data_copy.target = FORCE - QMAKE_EXTRA_TARGETS += data_copy - } -} diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/qdebughandler.cpp b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/qdebughandler.cpp deleted file mode 100644 index bb9617511..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/qdebughandler.cpp +++ /dev/null @@ -1,64 +0,0 @@ -/** - ****************************************************************************** - * - * @file qdebughandler.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "qdebughandler.h" - -void myQDebugHandler(QtMsgType type, const char *msg) -{ - static bool firstRun = true; - QString txt; - - switch (type) { - case QtDebugMsg: - txt = QString("Debug: %1").arg(msg); - break; - case QtWarningMsg: - txt = QString("Warning: %1").arg(msg); - break; - case QtCriticalMsg: - txt = QString("Critical: %1").arg(msg); - break; - case QtFatalMsg: - txt = QString("Fatal: %1").arg(msg); - break; - } - - QFile outFile("dbglog.txt"); - outFile.open(QIODevice::WriteOnly | QIODevice::Append); - QTextStream ts(&outFile); - QTime time; - - if (firstRun) { - ts << endl << endl; - firstRun = false; - } - - ts << time.currentTime().toString("hh:mm:ss.zzz") << " " << txt << endl; - - if (type == QtFatalMsg) - abort(); -} diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/qdebughandler.h b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/qdebughandler.h deleted file mode 100644 index d41dc6a67..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/qdebughandler.h +++ /dev/null @@ -1,37 +0,0 @@ -/** - ****************************************************************************** - * - * @file qdebughandler.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef QDEBUGHANDLER_H -#define QDEBUGHANDLER_H - -#include -#include -#include - -void myQDebugHandler(QtMsgType type, const char *msg); - -#endif // QDEBUGHANDLER_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_off.tga b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_off.tga deleted file mode 100644 index d8f4e0297073e2d74e5246aa594ce213a939e748..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128570 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�E2#7bUc9FTcjBc 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 diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_off_hover.tga b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_off_hover.tga deleted file mode 100644 index e00d86a480a59f75844fe2f200e95b573794db01..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 128400 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 z z-1}p#XXh?9eDDCRRVr`?>;O5+;R7t6V7~ZZ(S6zZNd)@TcEuns5<#ZUlnLW(-`eg5{d^8A7@>A^tAy)wX^w@nKoha3>!OfnvI<>O(Ob)DR$(T z@!E|{XNHf_wme;WSc|q@tZQK(8#rW?S{P+BX3npWyN;T=u|GKzCwc0qbC3m6z&)$57GHItnANuxuexQ!8aqwC<;{t8 zil$g?I~DnRo^p~Cq`qHj05~Nz9$o~j!?Aq`2IVxH3u!BSh%50iy%hZP%AqHf0O@6Q z-jnv{2OqF)uU%z1pNy5iVv54APSZYcg95uP4L1j+6U@z}ftm*I*3x%Wh4&+74({ID z8f;aD_Rpr+Ir^S^Zr!cq9$W2I`J*3y=su6jMaW?;@&2$1B_Gkg5QsM=UIMs2({uPr zm=miQyr1(RO;j2=e3%y5j&=2u8eU&}qNz2c^Sru(JX$Xe*?1_e70HG}iQJ zAV!ogJ_^;Mc2k9o6SL4nqeK(1onSt0=p!14Vp3hu6H{mvi>?P+K~l&Tu4Hg>tC_NB zk!b&IMa=Je;1;`emvWt4SYo?(Y_+-5#(PG=)-uWt=v!p{i+fnV-i30G_OQOa3#@Oi z?tYHn131^Kz>15ys!oBN6^-3k<$J#f5)r-7S{BXtV)L9Jjs}rdpr~zI=hyG@;}nuNzoX@SE*jFNt>QJhS#fc1OH<0T zQ&99$HUQ+5<20KRXB@g!DM2y|#J)SpfN;Y4A}jOPQI>zqagIFR1;Nm1ywJfc;*DW# zVFfu?z)lH;s?-IkygK>?GaLPYc?M@-=+O~gf8_;jZ2Y3#cFT=!L1YlLd{l-zMu5Bh zs1sbl3)QxDDGwpoOg0iD;ufqLPQ5R_6T>);UAZF%!U{Q&8OVpX@ia@S-C8zatL+K>EoWq1L0NU0?ZT-gXVKnS4(oE&|?T*9NoG@*I|IxB@a5YBin z0L>LZH#39QttR~-sq6o1=jngTdGhhw?ao`zwO{}JQ?N1Ry(n+#g%_-{8*aS7HkK^& zOap|xCm7U91wbcC!7;`<+=GujBvSl{?Y;j_yZ_p2ZOy^+t;{Fm6lgb2;=v-{mmc&0BL|>U zLKhlcd`!{A^u;s+y_CMeb)jnL+dag@2g+W0@|ONq^^?iAUO{bFDSYSLGtcl9aStlV zJ~7XXcAPTITsp`nRVsxCV+`Bfs|>v7pL>>z;Gci;k*!;Ey1n`8OLof**Vx{N9}xAp z*xq~lbtkvLW)n@7W%x+Wk5lu_*Iu-r|M7#(oi){p3cC};ae`HI4Cxt6RzwQs0a#?1 zNY_6}sWB!gD3NRdkPW9gPF_PEBj=OZT#>SzM&TK23C#RGjlzmAKmV9Lbl+9>>YLBm zd-Bx3_t6_N#6D!V-Fmt0xp%j1Oe~i;i71)GVR$21Mm;7q+crt@|wzzT7|vip%he z0%wE_H{+DJ6ESgyU7!bBrT_l-zxJQsf46`AOA$8z`qh5Z@!!AwX8-xm@A~_X?Y!a& zt5m6?Z_R>1Cqep+qgfN>Tvb{N4`D=kMF^a;NR2xkMVXF5E@T-rT$p3%j3ADH1UL%d zb3L4k)#JcK<$~7pldU2u^I24c)BrQH+_WH&2FW`n;qo zYnBF}GVp2)Zn^1t`{d&fJpm<29|)?v^OkEp80=YTsgFH)ha0EqF?uxUld>OEs6^kj zSNIsoz@AafP|X~z9|%xzYyjMt{>Xv<8;C>pHi1>&;FbbsJj|yOK&9xrjix=2ukUZLONBiHZV zWv{*RqCN7E;$3%MV%@dvN6DH~9Uu&SN5!qN6B(oL28?POd8N8Bb$`DXY)LfGL4g?yezY3CGx~w%@~AqUYp9QA-=~1k5oO;E8n= zKmPb*5_8+P@9=#m-3SBmZBX5fFGo7HWvM6lW}JbyvvwVMBVLAQFIR-q51J%jefWm{ zUbioGB(WLmLx4Z`K!E-v0p&YIYSm-%5x_l zoI|bzJmr8Tz~)$kqh|Gz8?c1Z7S1^mOH!pICUqgWQ~)QitKm9tQUig{rZwG>(sYma zFJ%rvu6af0UnyoEJiPRnL;$060aUpE67LDeBoB(GS1jEng9&+`~6us%1dZ6o0hy? zDrQql2EULV0q_8n*|TOEJH=VKd+xl=dUS4W{ffF+aiOG_f{xZ#R+OfV8~6h>*^-J$ zK3^UvUdRMQ^Q`+IOUm!shv;A0$l_Q1{X?6JAe?jE=Z+pqBs=z!UlrB-&#&KC2>++9 zAJE?oBH~o<&=Y?$)~f&V%?I}LSMO`d*2j)&+6tC0r)ZEyS3-Q>$jVSs;_pf8@YYL* z>}9P;dHIot?c6taS>|hVDKp1YkqM{;KHxcvsUBZP;4n2I) z@*(%KGW_I5K$>Eu)m_;kQHyjNM`FFvQl*bLywy$`wy6g329 ziGxc3^NE%6Tp1}ncsu^DGQj+4OJcL@td7K2C9|*vXxOT;o=co^;!da`*HX{ErS@yUAd&?mW4p zz&CtCJLQv4lthRO3}y395=Ky^urfjYHfhbzSK3vH4Lk0;`6s8lWf`c9Hp_A_FF1vE?4q+Dckr&BG&FH}Qn5CH;CAL9d<9m+%2;N1vDaxq>I=!z;DXLL~C| zBS!X@TdCz40~~GaPDR83)Cr`)3!zex+(l9cKE{t9Z`WLNjU764$liSOO_?_mff&QrNk3XPY-~p6ylshe!2y-+lLad)&`p<+TOi;?X0a^{k&62 zy$kQayYL?1xSJx%YH#RidGC(4){UF_;-zNF!3^FI0Qq*%#nG`RD(IS&NCHAu5N3k0 zd6eY*gHP|*Uh;}c)BR_%aeG-(T{f1G4E@C8hvB}yI{#!56A8u1jZ3)NNO2(v7JBCr z1)r)b)T7tAB$MqbuKHZ|!}?Z-Rsk!`gXX!9=2 zLE}aYwk8ehyIcb%c`Y_7U^lx3+IMwhS4ok}z3q5dBWFq;c{M zx6+zDp5^ANEFkD?DqV7+{77C2R!z>RzrFRcFX4Qb9i*N*V3)jqqch{#`uKILSEZP7 z3YWqv{1x&BQCqieo&Ejqf442jDYHq0quTP@z)xN&1Jcjo>s>j3l&8rf32 z)!uN!4OYTEwLvJ96l6v|9VlPm(8GH4v4(QQ)%bjxZQoj=DR`@0d&PzJ#)}8-CAkGz z{^AD7BnqMNc#!|}(7m?x%o4XC;C4e#9XWECJ@d=~Yb^~K6m9{+d6ZZd)}#r0DGGr} zq_|3!G^z@I4!yEeY%HzOD`von$2t`%1HdwY=P}`)td#NNs(U?De{i2n2r3{u2|-17 z1qm<(!CKetzSi+MKXUmEB^+sY_j@VJlwd5CDgG4w1)x zvH0kD+s^dxviWmoi8zNm@*vEymd2lx#j0>|`UZJ}O3V`2RnMYA*L%^ji`sOyW@{CL zt>70(WZ&Lmi+!Zcg26n9BTxZ=U37K&^y&7?FTVts&(x54FH`EO=v1&dDk5`D~bGS5#u}Ts;hSRd}r&qQNZ!wlSw!>w@tt?mp28H zP`Ze+5@3@LFdGP=1- zymwvw4Jt(*lh};xI%p?J@>uh-%PzC><;y!~KT@V+*e5k);B&GCMj3EO9J~Q+I(bw# z0Rrk0D9)a5N>IMij+r5UPsetxe9k(ORSP9*$>N3Xz`aD7J+Hm$ax2-ePA@HLrfXmm zT(Si2sw=Osabrf=IieTKmEwUVz|0m@HJ<1(K$|HkkWhLfCcc{V0zKEJbxRLJVNWgc zO`bkyz74&4p8RFwon4O~Gsa07_yLl|#l^0b6crU2too5h9!a7MOVz2Tp6Y}W=9?mV zIV)DIa4NoL&6-fR42Z;i2BzPA_uY^ozTKU7+~KS1Q)q-mXNZMGZMs<9l46O4<87F( z&7MBV`e^$CG`rzio6KZ&H0o2~3=3sjzUz)#EH5`t-k$#U_M5LcHKKE2&ne<4q6!$n zBFE;6KxhPqlEm-E0`(Iq{pdYMmimqXXb77YG9xM*2}$)tIPwJr-XmYXMH6b<5stIu z-A*mRb@J|p+{I8GeWU>%fP=olk(>VyY}Rl!22nCaH>>P>^Z}bcd8lF&$JoN@qio)k z5w>LZIP2c2t&57@yo@%{rWvv6gzI=@gA32s{_CQFXA4UgUvRDmVs(}1OCBls3T&3{ z+pvDEO`I^!7HDZ1W_zS^%s~jGbPZhvue#;t8*Td3NuE#VJf#Z(X3d*4@HU)rA4iJ- zk&a~=yDX`5wBVhr);Kp(-qm;i!e)6dDKO@My`Y7M=e)kleQPtOO;y&O5ExS|;@L-f zL*yDsm4FopbZeH#?A4uU?%z^TQ86cwGR! znK}dRNCFj&2U!v$B0y!5pl1&)40?8r&!^hC3KhCr_T}9>FS6GZS^3<7#}q;U7ncQI z-$kz{G_$||{%c#ga;e>Q`z^M5)~D%l#4wqk#+bsMbBIpV%aei?%xTG;6)>9BaO6t(~a8$F#_OwFS2b@=`Dr*=;07 z)^fo@zpup^39BvOlSvG<*q;ehOR@N)1B-Vus(~#H)dPgz6Hl zYJ}KsQ$&DoaI$ul7|!i3#B$k%|Vpp2)_?N-M4R_TlQA3T9pL$7hh=q9dUicPyYSu*I(_MZ@vjv zn`MF)nIeLg$x%>HV4a(^wG$O_ldFiEI<@e6hS)dy2mQh)XYwl%!sgDIDFsK{7A{$2 zOZ7+O1^vm$mE!dgwBquuyUL{Z$+tF8Z`b3scRe#EDe36FlXNdU-}yDXUSLhY?2q>> z2Cx3r?<)T4M>|n)KCYH_Y|$vE;VNmtX>wXpXe1I+xbL71($o6>YF0;mc$`>vYKrI! z2lpw=P>fQXKTy|FcFAVswpuxVobvLB+DIwFNObnvh1O5jE@m;bFB7s5@qCGV%yJ+C zlu6@3`i{vH$1AXPu1%Cu!xG;*+LtbBl63S+#eKli2v1tFXr4`;G+sQtzJrmr;NfVc zV@Jw<)2Fx1ojt={skm1W#F!vF*X7c3l=9W8GcPeo?nZxQXz4Ts-<@nVpu#bHh7?T~ zi>}{z@g=t8(ala}M~@t7^XANvz7Z&0CY2@P8u0%5>#s?8UUJDLDexvhZ`SLtzn;8? zE)Tp?(9QnmKmTdpefM3so_*DoS8CVG$HT9VnZV7Yw$XLduTu{@X|sGeA5T&Omzlnw z*W8(tU9nuhdZmk(VWNkfnh^MQU$fInHf^vw@4DIMNkL_tn9gIQSRRy++DcTm`C-8A z^U+rhrJ}#QZTW&0iVZ?37=@|=(`EvBQxOwCa!%#mst*MFeDS^2(Yd;!lnzx10f-JI zAiY{_p|M7x$KwZVuro1{T57N_xjWKfbhhH{x87v! zS~j-s9ot9@Xk%U4w{mfSJ#nCbfEIO%IUzs0$Y#*x17w*1qyu_FHlyw5pQV`4v+b%K z7ueZ}Ro3w2kjomFGnfZO(XYAUV%sc+ch;u$o)Kowv|+Nc_>kS_zH4^d z+JhH(v=;$4r?@+Mplei_(kt{1hW+{Hp9hfT?b)-(g#wU@GLJdxtFIJZr(v)hAP7ZA zC~y%V2jw4H{`AvNhdMQ)F2$YD^b~zf3IzkZ_LLjDpH)+g?OM^x?fUlZ7o6qU%u2LV z5!2ZxBO{#4x3dQSuDfot&6qolx}z4sSOyshZiDj&Z2g2J=U)&!^}c!t;;hIrq@dwj#?H(ofPysb}5 z<_w96coJZAit75k8!p_@;YF6t4AI?^dp>Xo90Za>O_y(3bfN^Js~WqwoS31$J5`)8khHndRP z!KgO?jE5`sfWNC&>YgaYKKGr`)+k^8PYoIJdi(ZDtLKubTx=+qmEjX4eBvAFD+mVt z6}~xNVVk3zV!D+{Eucgt5K?nmh`u!!#cC;Flt56kUBOZzfdE?}6NpYPHLDwIoSKNP zg1rE?rh=YO8qnBG;gpC1$tC!=>XP9CQdY@G?m5?uxgL*!H{(LtW1wu&76DWK8?YEOAr?=jE%f&~=7IX$w?%cW4i4IoN z=d{1H-(3e=JZGZyGi85|dXuc54bB>^!e*Mkk&Bm5$cy~kV+2Y1%jW+d;(>=sz*pMMMbq=nl6S1zaJ^)k>octc_LZl3eocjQk8j%+8%F}n_$Bgn87S5UF9%^b~2DA=!ap|#pDFy(*jFS`)Nbv)jE`v$*Xq<7KG z4(4Xem|?fwcANVhF|LEU=bwMxu>B4kIM5YwxHj~0@nS_HLK5?ydFC1C#I%5S5}gQ} zQ33*(f8m7}x*r{G%rl{V?)lNNu&}_ox9H$&1o1t#(<<2RT|2ugy1!z@S#kpI_(n#C zBlM5)b^a_4i%bka;Z)GRr=QyA0&OF~rfE}csnAr&a-fN-;fYk66rf>^B|9{deW;C1MH;)-DFRk3Qyp zw_bYXY))Z&_JE8k1OhQQ9C@%)(K{cY@sfi_m>#|-N)@9{vtXWYneZk%?<6Gjcx{%_;tP+|WlHem2Tji5?1-%15) zWM8FN=Ni?k5ea;pRXX8##RdyqaAc?^wsj~bd;kkfwEjfQIaKn13dR;V2q57%H4*?W zMdgrZ=x93BuTsq$a2}K$(V0G#E@g4if7alx`dVAb!!Z3YUVhYrAsY~5a%xYXGRbC* znqWOIn(V3yfkDH?m|3O*R>G z5qFT^um-D-NT0TBB;03XFRLKGPO#8rM^BLwTFzGxO|Aa%j zdV~V9UwiFkchs`)a6z|DVj~@upQ)pcokARstivS)^yGFT)<Y6P^Ek)#ST$ut2*2} zNeCkh2qz)2JmSpz17}WBzLW-1<+95!x4gVOBfyq0UxG6!6YhRc#so0GZJ`7#hZo&unp69d*t zw2Lu)$%1*l(GSVB7f+gI{dP=umm)IQs1YMm&`QVGI<(FNI%h)zvoN0|L%IdL7BO5X zvdv8V6t(Rd{DSX~vw=lDwaR~t*neMJq^to0Wvt|-5Dif8BkQD7Fe>=+9F=`SYEUM? zI%U-+S_jt1(Jdv>g5rW)u&Tg9n@EuJ2nq2z7~;uE4j4J1vrG797IK`TDjLIB70{!u zgLfwC>7}aEiP*oLo66QsSWpAC2KS`4hX5t-;42Of=W&g~HQS`bm*S{Z{&c_gK^s(L zlSheAj_7OShRXUZSaxjJQU)5)FcCA1OVM|P1m_w6J>+!6i53H&0+zm!`Ija-9t

oVt3w<&iu95>O1x~$zxZ1az~1t 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 N4S05t>bv^{ACG&m7|)c5ov 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

~U2 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 POF9#Cx>l?0awPr*RNp~U diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_on_hover.tga b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_on_hover.tga deleted file mode 100644 index 406204e32e195ac698df8ba12e11cec66ca3d69f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 134442 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 diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_plugin.ini b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_plugin.ini deleted file mode 100644 index 8b4174f60..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/cc_plugin.ini +++ /dev/null @@ -1,55 +0,0 @@ -[General] - -; Network settings -listen_on_host = 127.0.0.1 -listen_on_port = 40200 -send_to_host = 127.0.0.1 -send_to_port = 40100 - -; Channels enumerator, applicable for the AeroSIM RC version 3.90+ -all_channels = Ch1-Aileron Ch2-Elevator Ch3-Throttle Ch4-Rudder Ch5 Ch6 Ch7 Ch8 Ch9 Ch10-Retracts Ch11-Flaps Ch12-FPV-Pan Ch13-FPV-Tilt Ch14-Brakes Ch15-Spoilers Ch16-Smoke Ch17-Fire Ch18-Flight-Mode Ch19-ALT-Hold Ch20-FPV-Tilt-Hold Ch21-Reset-Model Ch22-MouseTX Ch23-Plugin-1 Ch24-Plugin-2 Ch25-Throttle-Hold Ch26-CareFree Ch27-FPV-Roll Ch28-L-Motor-Dual Ch29-R-Motor-Dual Ch30-Mix Ch31-Mix Ch32-Mix Ch33-Mix Ch34-Mix Ch35-Mix Ch36-Mix Ch37-Mix Ch38-Mix Ch39-Mix - -[Input] - -; Map CopterControl channels to simulator channels -; To use internal simulator channels just comment the mapping here -cc_channel_1 = Ch1-Aileron -cc_channel_2 = Ch2-Elevator -cc_channel_3 = Ch3-Throttle -cc_channel_4 = Ch4-Rudder -;cc_channel_5 = Ch27-FPV-Roll -cc_channel_6 = Ch13-FPV-Tilt -;cc_channel_7 = Ch12-FPV-Pan -;cc_channel_8 = -;cc_channel_9 = -;cc_channel_10= - -; Control TX or RX (before or after mixes) -send_to = RX - -[Output] - -; Map simulator channels to GCS HiTL/CopterControl channels -; Only mapped channels will be sent to the GCS -sim_channel_1 = Ch1-Aileron -sim_channel_2 = Ch2-Elevator -sim_channel_3 = Ch3-Throttle -sim_channel_4 = Ch4-Rudder -sim_channel_5 = Ch23-Plugin-1 -;sim_channel_6 = Ch27-FPV-Roll -sim_channel_7 = Ch13-FPV-Tilt -;sim_channel_8 = Ch12-FPV-Pan - -; take values from TX or RX (before or after mixes) -take_from = TX - -[Video] - -; Windowed simulator mode configurations -; Each resolution defines the upper left corner and width/hight. -; User can cycle through all resolutions using the menu command. -number_of_resolutions = 2 - -; x, y, width, height -resolution_1 = 50 50 640 720 -resolution_2 = 0 0 800 480 diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/plugin.txt b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/plugin.txt deleted file mode 100644 index 901e5c50a..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/resources/plugin.txt +++ /dev/null @@ -1,86 +0,0 @@ -.NAME "CopterControl" - -.HELP_EN "\ -OpenPilot CopterControl HiTL plugin for AeroSIM RC" - -.IMAGE_OFF "cc_off.tga" -.IMAGE_ON "cc_on.tga" -.IMAGE_OFF_MOUSE_HOVER "cc_off_hover.tga" -.IMAGE_ON_MOUSE_HOVER "cc_on_hover.tga" - -.MENU_ITEM_00_NAME "Enable" -.MENU_ITEM_00_TYPE CHECKBOX -.MENU_ITEM_00_HAS_SEPARATOR 0 -.MENU_ITEM_00_MOUSE_RECT_XY 89 91 -.MENU_ITEM_00_MOUSE_RECT_DXDY 48 48 -.MENU_ITEM_00_HIDE_MENU_ITEM 0 - -.MENU_ITEM_01_NAME "Transmit data" -.MENU_ITEM_01_TYPE CHECKBOX -.MENU_ITEM_01_HAS_SEPARATOR 0 -.MENU_ITEM_01_MOUSE_RECT_XY 110 166 -.MENU_ITEM_01_MOUSE_RECT_DXDY 52 34 -.MENU_ITEM_01_HIDE_MENU_ITEM 0 - -.MENU_ITEM_02_NAME "Receive data" -.MENU_ITEM_02_TYPE CHECKBOX -.MENU_ITEM_02_HAS_SEPARATOR 1 -.MENU_ITEM_02_MOUSE_RECT_XY 36 166 -.MENU_ITEM_02_MOUSE_RECT_DXDY 52 34 -.MENU_ITEM_02_HIDE_MENU_ITEM 0 - -.MENU_ITEM_03_NAME "Change window size and position" -.MENU_ITEM_03_TYPE COMMAND -.MENU_ITEM_03_HAS_SEPARATOR 0 -.MENU_ITEM_03_MOUSE_RECT_XY 0 0 -.MENU_ITEM_03_MOUSE_RECT_DXDY 0 0 -.MENU_ITEM_03_HIDE_MENU_ITEM 0 - -.MENU_ITEM_04_NAME "Move to next waypoint" -.MENU_ITEM_04_TYPE COMMAND -.MENU_ITEM_04_HAS_SEPARATOR 0 -.MENU_ITEM_04_MOUSE_RECT_XY 0 0 -.MENU_ITEM_04_MOUSE_RECT_DXDY 0 0 -.MENU_ITEM_04_HIDE_MENU_ITEM 0 - -.MENU_ITEM_05_NAME "no action" -.MENU_ITEM_05_TYPE COMMAND -.MENU_ITEM_05_HAS_SEPARATOR 0 -.MENU_ITEM_05_MOUSE_RECT_XY 0 0 -.MENU_ITEM_05_MOUSE_RECT_DXDY 0 0 -.MENU_ITEM_05_HIDE_MENU_ITEM 0 - -.MENU_ITEM_06_NAME "Blue LED" -.MENU_ITEM_06_TYPE CHECKBOX -.MENU_ITEM_06_HAS_SEPARATOR 0 -.MENU_ITEM_06_MOUSE_RECT_XY 6 40 -.MENU_ITEM_06_MOUSE_RECT_DXDY 15 12 -.MENU_ITEM_06_HIDE_MENU_ITEM 1 - -.MENU_ITEM_07_NAME "Green LED" -.MENU_ITEM_07_TYPE CHECKBOX -.MENU_ITEM_07_HAS_SEPARATOR 0 -.MENU_ITEM_07_MOUSE_RECT_XY 6 52 -.MENU_ITEM_07_MOUSE_RECT_DXDY 15 12 -.MENU_ITEM_07_HIDE_MENU_ITEM 1 - -.MENU_ITEM_08_NAME "FlightMode 1" -.MENU_ITEM_08_TYPE CHECKBOX -.MENU_ITEM_08_HAS_SEPARATOR 0 -.MENU_ITEM_08_MOUSE_RECT_XY 40 19 -.MENU_ITEM_08_MOUSE_RECT_DXDY 38 38 -.MENU_ITEM_08_HIDE_MENU_ITEM 1 - -.MENU_ITEM_09_NAME "FlightMode 2" -.MENU_ITEM_09_TYPE CHECKBOX -.MENU_ITEM_09_HAS_SEPARATOR 0 -.MENU_ITEM_09_MOUSE_RECT_XY 78 19 -.MENU_ITEM_09_MOUSE_RECT_DXDY 38 38 -.MENU_ITEM_09_HIDE_MENU_ITEM 1 - -.MENU_ITEM_10_NAME "FlightMode 3" -.MENU_ITEM_10_TYPE CHECKBOX -.MENU_ITEM_10_HAS_SEPARATOR 0 -.MENU_ITEM_10_MOUSE_RECT_XY 115 19 -.MENU_ITEM_10_MOUSE_RECT_DXDY 38 38 -.MENU_ITEM_10_HIDE_MENU_ITEM 1 diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/settings.cpp b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/settings.cpp deleted file mode 100644 index 6c19f91dc..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/settings.cpp +++ /dev/null @@ -1,98 +0,0 @@ -/** - ****************************************************************************** - * - * @file settings.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "settings.h" - -Settings::Settings(QString settingsPath, QObject *parent) : - QObject(parent) -{ - settings = new QSettings(settingsPath + "/cc_plugin.ini", QSettings::IniFormat); - // default settings - sendToHost = "127.0.0.1"; - sendToPort = 40100; - listenOnHost = "127.0.0.1"; - listenOnPort = 40200; - channels.reserve(60); - for (quint8 i = 0; i < 10; ++i) - inputMap << 255; - for (quint8 i = 0; i < 8; ++i) - outputMap << 255; - sendToRX = true; - takeFromTX = true; - videoModes << 1 << 50 << 50 << 800 << 600; -} - -void Settings::read() -{ - // network - listenOnHost = settings->value("listen_on_host", listenOnHost).toString(); - listenOnPort = settings->value("listen_on_port", listenOnPort).toInt(); - sendToHost = settings->value("send_to_host", sendToHost).toString(); - sendToPort = settings->value("send_to_port", sendToPort).toInt(); - - QString allChannels = settings->value("all_channels").toString(); - QString chan; - int i = 0; - foreach (chan, allChannels.split(" ")) - channels.insert(chan, i++); - - // inputs - QString num = ""; - QString map = ""; - for (quint8 i = 0; i < 10; ++i) { - num = QString::number(i+1); - map = settings->value("Input/cc_channel_" + num).toString(); - inputMap[i] = channels.value(map, inputMap.at(i)); - } - - QString sendTo = settings->value("Input/send_to", "RX").toString(); - sendToRX = (sendTo == "RX") ? true : false; - - // outputs - for (quint8 i = 0; i < 8; ++i) { - num = QString::number(i+1); - map = settings->value("Output/sim_channel_" + num).toString(); - outputMap[i] = channels.value(map, outputMap.at(i)); - } - - QString takeFrom = settings->value("Output/take_from", "TX").toString(); - takeFromTX = (takeFrom == "TX") ? true : false; - - // video - quint8 resolutionNum = settings->value("Video/number_of_resolutions", 0).toInt(); - if (resolutionNum > 0) { - videoModes.clear(); - videoModes << resolutionNum; - for (quint8 i = 0; i < resolutionNum; ++i) { - num = QString::number(i+1); - QString modes = settings->value("Video/resolution_" + num, "0, 0, 640, 480").toString(); - QString mode; - foreach (mode, modes.split(" ")) - videoModes << mode.toInt(); - } - } -} diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/settings.h b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/settings.h deleted file mode 100644 index 5bc39135d..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/settings.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - ****************************************************************************** - * - * @file settings.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef SETTINGS_H -#define SETTINGS_H - -#include -#include -#include -#include -#include -#include - -class Settings : public QObject -{ -public: - explicit Settings(QString settingsPath, QObject *parent = 0); - void read(); - QString remoteHost() { return sendToHost; } - quint16 remotePort() { return sendToPort; } - QString localHost() { return listenOnHost; } - quint16 localPort() { return listenOnPort; } - QList getInputMap() { return inputMap; } - QList getOutputMap() { return outputMap; } - bool isToRX() { return sendToRX; } - bool isFromTX() { return takeFromTX; } - QList getVideoModes() { return videoModes; } - -private: - QHash channels; - QSettings *settings; - QString sendToHost; - quint16 sendToPort; - QString listenOnHost; - quint16 listenOnPort; - QList inputMap; - QList outputMap; - bool sendToRX; - bool takeFromTX; - QList videoModes; -}; - -#endif // SETTINGS_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udpconnect.cpp b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udpconnect.cpp deleted file mode 100644 index 0448a705a..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udpconnect.cpp +++ /dev/null @@ -1,228 +0,0 @@ -/** - ****************************************************************************** - * - * @file udpconnect.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "udpconnect.h" -#include "enums.h" - -UdpSender::UdpSender(const QList map, - bool isTX, - QObject *parent) - : QObject(parent) -{ - qDebug() << this << "UdpSender::UdpSender thread:" << thread(); - outSocket = NULL; - for (int i = 0; i < 8; ++i) - channels << 0.0; - channelsMap = map; - takeFromTX = isTX; - packetsSended = 0; -} - -UdpSender::~UdpSender() -{ - qDebug() << this << "UdpSender::~UdpSender"; - if (outSocket) - delete outSocket; -} - -// public -void UdpSender::init(const QString &remoteHost, quint16 remotePort) -{ - qDebug() << this << "UdpSender::init"; - outHost = remoteHost; - outPort = remotePort; - outSocket = new QUdpSocket(); -} - -void UdpSender::sendDatagram(const simToPlugin *stp) -{ - QByteArray data; - data.resize(188); - QDataStream out(&data, QIODevice::WriteOnly); - out.setFloatingPointPrecision(QDataStream::SinglePrecision); - - // magic header, "AERO" - out << quint32(0x4153494D); - // simulation step - out << stp->simTimeStep; - // home location - out << stp->initPosX << stp->initPosY << stp->initPosZ; - out << stp->wpHomeX << stp->wpHomeY << stp->wpHomeLat << stp->wpHomeLong; - // position - out << stp->posX << stp->posY << stp->posZ; - // velocity (world) - out << stp->velX << stp->velY << stp->velZ; - // angular velocity (model) - out << stp->angVelXm << stp->angVelYm << stp->angVelZm; - // acceleration (model) - out << stp->accelXm << stp->accelYm << stp->accelZm; - // coordinates - out << stp->latitude << stp->longitude; - // sonar - out << stp->AGL; - // attitude - out << stp->heading << stp->pitch << stp->roll; - // electric - out << stp->voltage << stp->current; - // matrix - out << stp->axisXx << stp->axisXy << stp->axisXz; - out << stp->axisYx << stp->axisYy << stp->axisYz; - out << stp->axisZx << stp->axisZy << stp->axisZz; - // channels - for (int i = 0; i < 8; ++i) { - quint8 mapTo = channelsMap.at(i); - if (mapTo == 255) // unused channel - out << 0.0; - else if (takeFromTX) // use values from simulators transmitter - out << stp->chSimTX[mapTo]; - else // direct use values from ESC/motors/ailerons/etc - out << stp->chSimRX[mapTo]; - } - - // packet counter - out << packetsSended; - - outSocket->writeDatagram(data, outHost, outPort); - ++packetsSended; -} - -//----------------------------------------------------------------------------- - -UdpReceiver::UdpReceiver(const QList map, - bool isRX, - QObject *parent) - : QThread(parent) -{ - qDebug() << this << "UdpReceiver::UdpReceiver thread:" << thread(); - - stopped = false; - inSocket = NULL; - for (int i = 0; i < 10; ++i) - channels << -1.0; - channelsMap = map; - sendToRX = isRX; - armed = 0; - mode = 0; - packetsRecived = 1; -} - -UdpReceiver::~UdpReceiver() -{ - qDebug() << this << "UdpReceiver::~UdpReceiver"; - if (inSocket) - delete inSocket; -} - -// public -void UdpReceiver::init(const QString &localHost, quint16 localPort) -{ - qDebug() << this << "UdpReceiver::init"; - - inSocket = new QUdpSocket(); - qDebug() << this << "inSocket constructed" << inSocket->thread(); - - inSocket->bind(QHostAddress(localHost), localPort); -} - -void UdpReceiver::run() -{ - qDebug() << this << "UdpReceiver::run start"; - while (!stopped) - onReadyRead(); - qDebug() << this << "UdpReceiver::run ended"; -} - -void UdpReceiver::stop() -{ - qDebug() << this << "UdpReceiver::stop"; - stopped = true; -} - -void UdpReceiver::setChannels(pluginToSim *pts) -{ - QMutexLocker locker(&mutex); - - for (int i = 0; i < 10; ++i) { - quint8 mapTo = channelsMap.at(i); - if (mapTo != 255) { - float channelValue = qBound(-1.0f, channels.at(i), 1.0f); - if (sendToRX) { - // direct connect to ESC/motors/ailerons/etc - pts->chNewRX[mapTo] = channelValue; - pts->chOverRX[mapTo] = true; - } else { - // replace simulators transmitter - pts->chNewTX[mapTo] = channelValue; - pts->chOverTX[mapTo] = true; - } - } - } -} - -void UdpReceiver::getFlighStatus(quint8 &arm, quint8 &mod) -{ - QMutexLocker locker(&mutex); - - arm = armed; - mod = mode; -} - -// private -void UdpReceiver::onReadyRead() -{ - if (!inSocket->waitForReadyRead(8)) // 1/60fps ~= 16.7ms, 1/120fps ~= 8.3ms - return; - // TODO: add failsafe - // if a command not recieved then slowly return all channel to neutral - // - while (inSocket->hasPendingDatagrams()) { - QByteArray datagram; - datagram.resize(inSocket->pendingDatagramSize()); - quint64 datagramSize; - datagramSize = inSocket->readDatagram(datagram.data(), datagram.size()); - - processDatagram(datagram); - } -} - -void UdpReceiver::processDatagram(QByteArray &datagram) -{ - QDataStream stream(datagram); - stream.setFloatingPointPrecision(QDataStream::SinglePrecision); - // check magic header - quint32 magic; - stream >> magic; - if (magic != 0x52434D44) // "RCMD" - return; - // read channels - for (int i = 0; i < 10; ++i) - stream >> channels[i]; - // read flight mode - stream >> armed >> mode; - // read counter - stream >> packetsRecived; -} diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udpconnect.h b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udpconnect.h deleted file mode 100644 index ead07f046..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udpconnect.h +++ /dev/null @@ -1,90 +0,0 @@ -/** - ****************************************************************************** - * - * @file udpconnect.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef UDPCONNECT_H -#define UDPCONNECT_H - -#include -#include -#include -#include -#include -#include -#include "aerosimrcdatastruct.h" - -class UdpSender : public QObject -{ -// Q_OBJECT -public: - explicit UdpSender(const QList map, bool isTX, QObject *parent = 0); - ~UdpSender(); - void init(const QString &remoteHost, quint16 remotePort); - void sendDatagram(const simToPlugin *stp); - quint32 pcks() { return packetsSended; } - -private: - QUdpSocket *outSocket; - QHostAddress outHost; - quint16 outPort; - QList channels; - QList channelsMap; - bool takeFromTX; - quint32 packetsSended; -}; - - -class UdpReceiver : public QThread -{ -// Q_OBJECT -public: - explicit UdpReceiver(const QList map, bool isRX, QObject *parent = 0); - ~UdpReceiver(); - void init(const QString &localHost, quint16 localPort); - void run(); - void stop(); - // function getChannels for other threads - void setChannels(pluginToSim *pts); - void getFlighStatus(quint8 &arm, quint8 &mod); - quint8 getArmed() { return armed; } - quint8 getMode() { return mode; } - quint32 pcks() { return packetsRecived; } - -private: - volatile bool stopped; - QMutex mutex; - QUdpSocket *inSocket; - QList channels; - QList channelsMap; - bool sendToRX; - quint8 armed; - quint8 mode; - quint32 packetsRecived; - void onReadyRead(); - void processDatagram(QByteArray &datagram); -}; - -#endif // UDPCONNECT_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptest.pro b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptest.pro deleted file mode 100644 index ac63be5ae..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptest.pro +++ /dev/null @@ -1,17 +0,0 @@ -include(../../../../../openpilotgcs.pri) - -QT += core gui network - -TEMPLATE = app -TARGET = udp_test -DESTDIR = $$GCS_APP_PATH - -HEADERS += \ - udptestwidget.h - -SOURCES += \ - udptestmain.cpp \ - udptestwidget.cpp - -FORMS += \ - udptestwidget.ui diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestmain.cpp b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestmain.cpp deleted file mode 100644 index 744e4bf25..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestmain.cpp +++ /dev/null @@ -1,38 +0,0 @@ -/** - ****************************************************************************** - * - * @file udptestmain.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin test utility - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include -#include "udptestwidget.h" - -int main(int argc, char *argv[]) -{ - QApplication a(argc, argv); - Widget w; - w.show(); - - return a.exec(); -} diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.cpp b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.cpp deleted file mode 100644 index 9ab45e45a..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.cpp +++ /dev/null @@ -1,537 +0,0 @@ -/** - ****************************************************************************** - * - * @file udptestwidget.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin test utility - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "udptestwidget.h" -#include "ui_udptestwidget.h" - -Widget::Widget(QWidget *parent) : - QWidget(parent), - ui(new Ui::Widget) -{ - ui->setupUi(this); - - inSocket = NULL; - outSocket = NULL; - screenTimeout.start(); - packetCounter = 0; - - autoSendTimer = new QTimer(this); - connect(autoSendTimer, SIGNAL(timeout()), this, SLOT(sendDatagram()), Qt::DirectConnection); -} - -Widget::~Widget() -{ - if(outSocket) { - delete outSocket; - } - if(inSocket) { - delete inSocket; - } - delete ui; -} - -// private slots ////////////////////////////////////////////////////////////// - -void Widget::on_btReciveStart_clicked() -{ - on_btReciveStop_clicked(); - - inSocket = new QUdpSocket(); - QString host = ui->localHost->text(); - quint16 port = ui->localPort->text().toInt(); - - if (inSocket->bind(QHostAddress(host), port)) { - connect(inSocket, SIGNAL(readyRead()), - this, SLOT(readDatagram()), Qt::DirectConnection); - - ui->listWidget->addItem("bind ok"); - ui->btReciveStop->setEnabled(1); - ui->localHost->setDisabled(1); - ui->localPort->setDisabled(1); - ui->btReciveStart->setDisabled(1); - } else { - ui->listWidget->addItem("bind error: " + inSocket->errorString()); - } -} - -void Widget::on_btReciveStop_clicked() -{ - if(inSocket) { - delete inSocket; - inSocket = NULL; - ui->listWidget->addItem("unbind ok"); - } else { - ui->listWidget->addItem("socket not found"); - } - ui->btReciveStart->setEnabled(1); - ui->localHost->setEnabled(1); - ui->localPort->setEnabled(1); - ui->btReciveStop->setDisabled(1); -} - -void Widget::on_btTransmitStart_clicked() -{ - on_btTransmitStop_clicked(); - - outSocket = new QUdpSocket(); - outHost = ui->simHost->text(); - outPort = ui->simPort->text().toInt(); - - ui->listWidget->addItem("transmit started"); - ui->btTransmitStop->setEnabled(1); - ui->simHost->setDisabled(1); - ui->simPort->setDisabled(1); - ui->btTransmitStart->setDisabled(1); -} - -void Widget::on_btTransmitStop_clicked() -{ - if(outSocket) { - delete outSocket; - outSocket = NULL; - ui->listWidget->addItem("transmit stopped"); - } else { - ui->listWidget->addItem("transmit socket not found"); - } - ui->btTransmitStart->setEnabled(1); - ui->simHost->setEnabled(1); - ui->simPort->setEnabled(1); - ui->btTransmitStop->setDisabled(1); -} - -void Widget::readDatagram() -{ - while (inSocket->hasPendingDatagrams()) { - QByteArray datagram; - datagram.resize(inSocket->pendingDatagramSize()); - QHostAddress sender; - quint16 senderPort; - quint64 datagramSize = inSocket->readDatagram(datagram.data(), datagram.size(), - &sender, &senderPort); - Q_UNUSED(datagramSize); - - processDatagram(datagram); - if (ui->autoAnswer->isChecked()) - sendDatagram(); - } -} - -// private //////////////////////////////////////////////////////////////////// - -void Widget::processDatagram(const QByteArray &data) -{ - QByteArray buf = data; - QDataStream stream(&buf, QIODevice::ReadOnly); - stream.setFloatingPointPrecision(QDataStream::SinglePrecision); - - // check magic header - quint32 magic; - stream >> magic; - if (magic == 0x4153494D) { // "AERO" - float timeStep, - homeX, homeY, homeZ, - WpHX, WpHY, WpLat, WpLon, - posX, posY, posZ, - velX, velY, velZ, - angX, angY, angZ, - accX, accY, accZ, - lat, lon, alt, - head, pitch, roll, - volt, curr, - rx, ry, rz, fx, fy, fz, ux, uy, uz, - chAil, chEle, chThr, chRud, chPlg1, chPlg2, chFpv1, chFpv2; - - stream >> timeStep; - stream >> homeX >> homeY >> homeZ; - stream >> WpHX >> WpHY >> WpLat >> WpLon; - stream >> posX >> posY >> posZ; - stream >> velX >> velY >> velZ; - stream >> angX >> angY >> angZ; - stream >> accX >> accY >> accZ; - stream >> lat >> lon >> alt; - stream >> head >> pitch >> roll; - stream >> volt >> curr; - stream >> rx >> ry >> rz >> fx >> fy >> fz >> ux >> uy >> uz; - stream >> chAil >> chEle >> chThr >> chRud >> chPlg1 >> chPlg2 >> chFpv1 >> chFpv2; - stream >> packetCounter; - - if(ui->tabWidget->currentIndex() != 0) - return; - - if (screenTimeout.elapsed() < 200) - return; - - ui->listWidget->clear(); - /* - ui->listWidget->addItem("time step (s)"); - ui->listWidget->addItem(QString("%1") - .arg(timeStep); - ui->listWidget->addItem("home location (m)"); - ui->listWidget->addItem(QString("%1, %2, %3") - .arg(homeX, 7, 'f', 4) - .arg(homeY, 7, 'f', 4) - .arg(homeZ, 7, 'f', 4)); - ui->listWidget->addItem("home waypoint"); - ui->listWidget->addItem(QString("%1, %2, %3, %4") - .arg(WpHX, 7, 'f', 4) - .arg(WpHY, 7, 'f', 4) - .arg(WpLat, 7, 'f', 4) - .arg(WpLon, 7, 'f', 4)); - ui->listWidget->addItem("model position (m)"); - ui->listWidget->addItem(QString("%1, %2, %3") - .arg(posX, 7, 'f', 4) - .arg(posY, 7, 'f', 4) - .arg(posZ, 7, 'f', 4)); - ui->listWidget->addItem("model velocity (m/s)"); - ui->listWidget->addItem(QString("%1, %2, %3") - .arg(velX, 7, 'f', 4) - .arg(velY, 7, 'f', 4) - .arg(velZ, 7, 'f', 4)); - ui->listWidget->addItem("model angular velocity (rad/s)"); - ui->listWidget->addItem(QString("%1, %2, %3") - .arg(angX, 7, 'f', 4) - .arg(angY, 7, 'f', 4) - .arg(angZ, 7, 'f', 4)); - ui->listWidget->addItem("model acceleration (m/s/s)"); - ui->listWidget->addItem(QString("%1, %2, %3") - .arg(accX, 7, 'f', 4) - .arg(accY, 7, 'f', 4) - .arg(accZ, 7, 'f', 4)); - ui->listWidget->addItem("model coordinates (deg, deg, m)"); - ui->listWidget->addItem(QString("%1, %2, %3") - .arg(lat, 7, 'f', 4) - .arg(lon, 7, 'f', 4) - .arg(alt, 7, 'f', 4)); - ui->listWidget->addItem("model electrics"); - ui->listWidget->addItem(QString("%1V, %2A") - .arg(volt, 7, 'f', 4) - .arg(curr, 7, 'f', 4)); - ui->listWidget->addItem("channels"); - ui->listWidget->addItem(QString("%1 %2 %3 %4 %5 %6 %7 %8") - .arg(chAil, 6, 'f', 3) - .arg(chEle, 6, 'f', 3) - .arg(chThr, 6, 'f', 3) - .arg(chRud, 6, 'f', 3) - .arg(chPlg1, 6, 'f', 3) - .arg(chPlg2, 6, 'f', 3) - .arg(chFpv1, 6, 'f', 3) - .arg(chFpv2, 6, 'f', 3)); - ui->listWidget->addItem("datagram size (bytes), packet counter"); - ui->listWidget->addItem(QString("%1 %2") - .arg(data.size()) - .arg(packetCounter)); -*/ - - // matrix calculation start - // model matrix - QMatrix4x4 m = QMatrix4x4( fy, fx, -fz, 0.0, - ry, rx, -rz, 0.0, - -uy, -ux, uz, 0.0, - 0.0, 0.0, 0.0, 1.0); - m.optimize(); - - // world matrix - QMatrix4x4 w = m.inverted(); - - // model quat - QQuaternion q; - asMatrix2Quat(m, q); - - // model roll, pitch, yaw - QVector3D rpy; - asMatrix2RPY(m, rpy); - - // sonar - float sAlt = 5.0; - if ((alt < (sAlt * 2.0)) && (roll < 0.35) && (pitch < 0.35)) { - float x = alt * qTan(roll); - float y = alt * qTan(pitch); - float h = QVector3D(x, y, alt).length(); - sAlt = qMin(h, sAlt); - } - - ui->listWidget->addItem("sonar altitude"); - ui->listWidget->addItem(QString("%1") - .arg(sAlt, 8, 'f', 5)); - ui->listWidget->addItem("vectors"); - ui->listWidget->addItem(QString(" X Y Z")); - ui->listWidget->addItem(QString("R: %1 %2 %3\nF: %4 %5 %6\nU: %7 %8 %9") - .arg(rx, 8, 'f', 5).arg(ry, 8, 'f', 5).arg(rz, 8, 'f', 5) - .arg(fx, 8, 'f', 5).arg(fy, 8, 'f', 5).arg(fz, 8, 'f', 5) - .arg(ux, 8, 'f', 5).arg(uy, 8, 'f', 5).arg(uz, 8, 'f', 5)); - ui->listWidget->addItem("CC model matrix"); - ui->listWidget->addItem(QString(" %1 %2 %3\n %4 %5 %6\n %7 %8 %9") - .arg(m(0, 0), 8, 'f', 5).arg(m(0, 1), 8, 'f', 5).arg(m(0, 2), 8, 'f', 5) - .arg(m(1, 0), 8, 'f', 5).arg(m(1, 1), 8, 'f', 5).arg(m(1, 2), 8, 'f', 5) - .arg(m(2, 0), 8, 'f', 5).arg(m(2, 1), 8, 'f', 5).arg(m(2, 2), 8, 'f', 5)); - ui->listWidget->addItem("CC world matrix"); - ui->listWidget->addItem(QString(" %1 %2 %3\n %4 %5 %6\n %7 %8 %9") - .arg(w(0, 0), 8, 'f', 5).arg(w(0, 1), 8, 'f', 5).arg(w(0, 2), 8, 'f', 5) - .arg(w(1, 0), 8, 'f', 5).arg(w(1, 1), 8, 'f', 5).arg(w(1, 2), 8, 'f', 5) - .arg(w(2, 0), 8, 'f', 5).arg(w(2, 1), 8, 'f', 5).arg(w(2, 2), 8, 'f', 5)); - ui->listWidget->addItem("CC quaternion"); - ui->listWidget->addItem(QString("%1, %2, %3, %4") - .arg(q.x(), 7, 'f', 4) - .arg(q.y(), 7, 'f', 4) - .arg(q.z(), 7, 'f', 4) - .arg(q.scalar(), 7, 'f', 4)); - ui->listWidget->addItem("model attitude (deg)"); - ui->listWidget->addItem(QString("%1, %2, %3") - .arg(roll*RAD2DEG, 7, 'f', 4) - .arg(pitch*RAD2DEG, 7, 'f', 4) - .arg(head*RAD2DEG, 7, 'f', 4)); - ui->listWidget->addItem("CC attitude calculated (deg)"); - ui->listWidget->addItem(QString("%1, %2, %3") - .arg(rpy.x(), 7, 'f', 4) - .arg(rpy.y(), 7, 'f', 4) - .arg(rpy.z(), 7, 'f', 4)); - - screenTimeout.restart(); - - } else if (magic == 0x52434D44) { // "RCMD" - qreal ch1, ch2, ch3, ch4, ch5, ch6, ch7, ch8, ch9, ch10; - stream >> ch1 >> ch2 >> ch3 >> ch4 >> ch5 >> ch6 >> ch7 >> ch8 >> ch9 >> ch10; - quint8 armed, mode; - stream >> armed >> mode; - - if(ui->tabWidget->currentIndex() == 0) { - if (screenTimeout.elapsed() < 200) - return; - ui->listWidget->clear(); - ui->listWidget->addItem("channels"); - ui->listWidget->addItem("CH1: " + QString::number(ch1)); - ui->listWidget->addItem("CH2: " + QString::number(ch2)); - ui->listWidget->addItem("CH3: " + QString::number(ch3)); - ui->listWidget->addItem("CH4: " + QString::number(ch4)); - ui->listWidget->addItem("CH5: " + QString::number(ch5)); - ui->listWidget->addItem("CH6: " + QString::number(ch6)); - ui->listWidget->addItem("CH7: " + QString::number(ch7)); - ui->listWidget->addItem("CH8: " + QString::number(ch8)); - ui->listWidget->addItem("CH9: " + QString::number(ch9)); - ui->listWidget->addItem("CH10:" + QString::number(ch10)); - ui->listWidget->addItem("armed:" + QString::number(armed)); - ui->listWidget->addItem("fmode:" + QString::number(mode)); - } - screenTimeout.restart(); - } else { - qDebug() << "unknown magic:" << magic; - } -} - -void Widget::sendDatagram() -{ - if(!outSocket) - return; - - float ch[10]; // = {0,0,0,0,0,0,0,0,0,0}; - quint8 armed; - quint8 fmode; - const float coeff = 1.0 / 512.0; - - ch[0] = ui->ch1->value() * coeff; - ch[1] = ui->ch2->value() * coeff; - ch[2] = ui->ch3->value() * coeff; - ch[3] = ui->ch4->value() * coeff; - ch[4] = ui->ch5->value() * coeff; - ch[5] = ui->ch6->value() * coeff; - ch[6] = ui->ch7->value() * coeff; - ch[7] = ui->ch8->value() * coeff; - ch[8] = ui->ch9->value() * coeff; - ch[9] = ui->ch10->value() * coeff; - - armed = (ui->disarmed->isChecked()) ? 0 : (ui->arming->isChecked()) ? 1 : 2; - fmode = ui->flightMode->value(); - - QByteArray data; - // 50 - current size of values, 4(quint32) + 10*4(float) + 2*1(quint8) + 4(quint32) - data.resize(50); - QDataStream stream(&data, QIODevice::WriteOnly); - stream.setFloatingPointPrecision(QDataStream::SinglePrecision); - - // magic header, "RCMD" - stream << quint32(0x52434D44); - // send channels - for (int i = 0; i < 10; ++i) { - stream << ch[i]; - } - // send armed and mode - stream << armed << fmode; - // send readed counter - stream << packetCounter; - - if (outSocket->writeDatagram(data, outHost, outPort) == -1) { - qDebug() << "write failed: outHost" << outHost << " " - << "outPort " << outPort << " " - << outSocket->errorString(); - } -} - -void Widget::on_autoSend_clicked() -{ - autoSendTimer->start(100); - qDebug() << "timer start"; -} - -void Widget::on_autoAnswer_clicked() -{ - autoSendTimer->stop(); - qDebug() << "timer stop"; -} - -// transfomations - -void Widget::asMatrix2Quat(const QMatrix4x4 &m, QQuaternion &q) -{ - qreal w, x, y, z; - - // w always >= 0 - w = qSqrt(qMax(0.0, 1.0 + m(0, 0) + m(1, 1) + m(2, 2))) / 2.0; - x = qSqrt(qMax(0.0, 1.0 + m(0, 0) - m(1, 1) - m(2, 2))) / 2.0; - y = qSqrt(qMax(0.0, 1.0 - m(0, 0) + m(1, 1) - m(2, 2))) / 2.0; - z = qSqrt(qMax(0.0, 1.0 - m(0, 0) - m(1, 1) + m(2, 2))) / 2.0; - - x = copysign(x, (m(1, 2) - m(2, 1))); - y = copysign(y, (m(2, 0) - m(0, 2))); - z = copysign(z, (m(0, 1) - m(1, 0))); - - q.setScalar(w); - q.setX(x); - q.setY(y); - q.setZ(z); -} - -void Widget::asQuat2RPY(const QQuaternion &q, QVector3D &rpy) -{ - qreal roll; - qreal pitch; - qreal yaw; - - const qreal d2 = 2.0; - const qreal qss = q.scalar() * q.scalar(); - const qreal qxx = q.x() * q.x(); - const qreal qyy = q.y() * q.y(); - const qreal qzz = q.z() * q.z(); - - qreal test = -d2 * (q.x() * q.z() - q.scalar() * q.y()); - if (qFabs(test) > 0.998) { - // ~86.3°, gimbal lock - qreal R10 = d2 * (q.x() * q.y() - q.scalar() * q.z()); - qreal R11 = qss - qxx + qyy - qzz; - - roll = 0.0; - pitch = copysign(M_PI_2, test); - yaw = qAtan2(-R10, R11); - } else { - qreal R12 = d2 * (q.y() * q.z() + q.scalar() * q.x()); - qreal R22 = qss - qxx - qyy + qzz; - qreal R01 = d2 * (q.x() * q.y() + q.scalar() * q.z()); - qreal R00 = qss + qxx - qyy - qzz; - - roll = qAtan2(R12, R22); - pitch = qAsin(test); - yaw = qAtan2(R01, R00); - } - rpy.setX(RAD2DEG * roll); - rpy.setY(RAD2DEG * pitch); - rpy.setZ(RAD2DEG * yaw); -} - -void Widget::asMatrix2RPY(const QMatrix4x4 &m, QVector3D &rpy) -{ - qreal roll; - qreal pitch; - qreal yaw; - - if (qFabs(m(0, 2)) > 0.998) { - // ~86.3°, gimbal lock - roll = 0.0; - pitch = copysign(M_PI_2, -m(0, 2)); - yaw = qAtan2(-m(1, 0), m(1, 1)); - } else { - roll = qAtan2(m(1, 2), m(2, 2)); - pitch = qAsin(-m(0, 2)); - yaw = qAtan2(m(0, 1), m(0, 0)); - } - - rpy.setX(roll * RAD2DEG); - rpy.setY(pitch * RAD2DEG); - rpy.setZ(yaw * RAD2DEG); -} - -/* // not used - -void Widget::ccRPY2Quat(const QVector3D &rpy, QQuaternion &q) -{ - float phi, theta, psi; - float cphi, sphi, ctheta, stheta, cpsi, spsi; - - phi = rpy.x() / 2; - theta = rpy.y() / 2; - psi = rpy.z() / 2; - cphi = cosf(phi); - sphi = sinf(phi); - ctheta = cosf(theta); - stheta = sinf(theta); - cpsi = cosf(psi); - spsi = sinf(psi); - - q.setScalar(cphi * ctheta * cpsi + sphi * stheta * spsi); - q.setX(sphi * ctheta * cpsi - cphi * stheta * spsi); - q.setY(cphi * stheta * cpsi + sphi * ctheta * spsi); - q.setZ(cphi * ctheta * spsi - sphi * stheta * cpsi); - - if (q.scalar() < 0) { // q0 always positive for uniqueness - q.setScalar(-q.scalar()); - q.setX(-q.x()); - q.setY(-q.y()); - q.setZ(-q.z()); - } -} - -void Widget::ccQuat2Matrix(const QQuaternion &q, QMatrix4x4 &m) -{ - float q0s = q.scalar() * q.scalar(); - float q1s = q.x() * q.x(); - float q2s = q.y() * q.y(); - float q3s = q.z() * q.z(); - - float m00 = q0s + q1s - q2s - q3s; - float m01 = 2 * (q.x() * q.y() + q.scalar() * q.z()); - float m02 = 2 * (q.x() * q.z() - q.scalar() * q.y()); - float m10 = 2 * (q.x() * q.y() - q.scalar() * q.z()); - float m11 = q0s - q1s + q2s - q3s; - float m12 = 2 * (q.y() * q.z() + q.scalar() * q.x()); - float m20 = 2 * (q.x() * q.z() + q.scalar() * q.y()); - float m21 = 2 * (q.y() * q.z() - q.scalar() * q.x()); - float m22 = q0s - q1s - q2s + q3s; - - m = QMatrix4x4(m00, m01, m02, 0, - m10, m11, m12, 0, - m20, m21, m22, 0, - 0, 0, 0, 1); -} -*/ diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.h b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.h deleted file mode 100644 index 500f35482..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.h +++ /dev/null @@ -1,91 +0,0 @@ -/** - ****************************************************************************** - * - * @file udptestwidget.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup 3rdParty Third-party integration - * @{ - * @addtogroup AeroSimRC AeroSimRC proxy plugin - * @{ - * @brief AeroSimRC simulator to HITL proxy plugin test utility - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef UDPTESTWIDGET_H -#define UDPTESTWIDGET_H - -#include -#include -#include -#include -#include -#include -#include -#include - -namespace Ui { - class Widget; -} - -const float RAD2DEG = (float)(180.0/M_PI); -const float DEG2RAD = (float)(M_PI/180.0); - -class Widget : public QWidget -{ - Q_OBJECT - -public: - explicit Widget(QWidget *parent = 0); - ~Widget(); - -private slots: - void on_btReciveStart_clicked(); - void on_btReciveStop_clicked(); - void on_btTransmitStart_clicked(); - void on_btTransmitStop_clicked(); - - void readDatagram(); - void sendDatagram(); - - void on_autoSend_clicked(); - - void on_autoAnswer_clicked(); - -private: - Ui::Widget *ui; - - QTime screenTimeout; - QUdpSocket *inSocket; - QUdpSocket *outSocket; - QHostAddress outHost; - quint16 outPort; - quint32 packetCounter; - - void processDatagram(const QByteArray &data); - QTimer *autoSendTimer; - - void asMatrix2Quat(const QMatrix4x4 &m, QQuaternion &q); - void asMatrix2RPY(const QMatrix4x4 &m, QVector3D &rpy); - void asQuat2RPY(const QQuaternion &q, QVector3D &rpy); - -/* // not used - * void ccRPY2Quat(const QVector3D &rpy, QQuaternion &q); - * void ccQuat2Matrix(const QQuaternion &q, QMatrix4x4 &m); - */ -}; - -#endif // UDPTESTWIDGET_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.ui b/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.ui deleted file mode 100644 index a060a6042..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/aerosimrc/src/udptestwidget.ui +++ /dev/null @@ -1,940 +0,0 @@ - - - Widget - - - - 0 - 0 - 440 - 525 - - - - udp_test - - - - - - - - - - - - 60 - 0 - - - - Connect - - - - - - - true - - - - 0 - 0 - - - - - 50 - 0 - - - - 40100 - - - 5 - - - - - - - true - - - - 0 - 0 - - - - 127.0.0.1 - - - - - - - sim host - - - - - - - local host: - - - - - - - local port: - - - - - - - false - - - - 60 - 0 - - - - Disconnect - - - - - - - true - - - - 0 - 0 - - - - 127.0.0.1 - - - - - - - sim port - - - - - - - - 0 - 0 - - - - - 50 - 0 - - - - 40200 - - - 5 - - - - - - - - 60 - 0 - - - - Transmit - - - - - - - false - - - - 60 - 0 - - - - Stop - - - - - - - - - 0 - - - - raw data - - - - - - - Terminal - 10 - - - - - - - - - channels - - - - 0 - - - 9 - - - - - send data - - - - 6 - - - 9 - - - 0 - - - 3 - - - - - true - - - answer on recieve - - - true - - - - - - - true - - - auto send - - - false - - - - - - - - - - Flight mode - - - - 6 - - - 9 - - - 0 - - - 3 - - - - - 6 - - - 1 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 1 - - - - - - - - - - Armed state - - - - 6 - - - 9 - - - 0 - - - 3 - - - - - Disarmed - - - true - - - - - - - Arming - - - - - - - Armed - - - - - - - - - - Channels - - - - 9 - - - 0 - - - 9 - - - 3 - - - 3 - - - - - CH1 - - - Qt::AlignCenter - - - - - - - -511 - - - 512 - - - 16 - - - 32 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 128 - - - - - - - - 0 - 0 - - - - - 30 - 0 - - - - 0 - - - - - - - CH2 - - - Qt::AlignCenter - - - - - - - -511 - - - 512 - - - 16 - - - 32 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 128 - - - - - - - - 0 - 0 - - - - - 30 - 0 - - - - 0 - - - - - - - CH3 - - - Qt::AlignCenter - - - - - - - -511 - - - 512 - - - 16 - - - 32 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 128 - - - - - - - - 0 - 0 - - - - - 30 - 0 - - - - 0 - - - - - - - CH4 - - - Qt::AlignCenter - - - - - - - -511 - - - 512 - - - 16 - - - 32 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 128 - - - - - - - - 0 - 0 - - - - - 30 - 0 - - - - 0 - - - - - - - CH5 - - - Qt::AlignCenter - - - - - - - -511 - - - 512 - - - 16 - - - 32 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 128 - - - - - - - - 0 - 0 - - - - - 30 - 0 - - - - 0 - - - - - - - CH6 - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 30 - 0 - - - - 0 - - - - - - - Ch7 - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 30 - 0 - - - - 0 - - - - - - - Ch8 - - - Qt::AlignCenter - - - - - - - - 0 - 0 - - - - - 30 - 0 - - - - 0 - - - - - - - Ch9 - - - Qt::AlignCenter - - - - - - - -511 - - - 512 - - - 16 - - - 32 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 128 - - - - - - - - 0 - 0 - - - - - 30 - 0 - - - - 0 - - - - - - - Ch10 - - - Qt::AlignCenter - - - - - - - -511 - - - 512 - - - 16 - - - 32 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 128 - - - - - - - - 0 - 0 - - - - - 30 - 0 - - - - 0 - - - - - - - -511 - - - 512 - - - 16 - - - 32 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 128 - - - - - - - -511 - - - 512 - - - 16 - - - 32 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 128 - - - - - - - -511 - - - 512 - - - 16 - - - 32 - - - Qt::Horizontal - - - QSlider::TicksAbove - - - 128 - - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pluginspec b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pluginspec deleted file mode 100644 index 26fede385..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pluginspec +++ /dev/null @@ -1,12 +0,0 @@ - - The OpenPilot Project - (C) 2011 OpenPilot Project - The GNU Public License (GPL) Version 3 - Hardware In The Loop Simulation (v2) - http://www.openpilot.org - - - - - - diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pro b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pro deleted file mode 100644 index 132fbe8ee..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2.pro +++ /dev/null @@ -1,5 +0,0 @@ -TEMPLATE = subdirs - -SUBDIRS = plugin aerosimrc - -plugin.file = plugin.pro diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2_dependencies.pri b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2_dependencies.pri deleted file mode 100644 index 50268face..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2_dependencies.pri +++ /dev/null @@ -1,4 +0,0 @@ -include(../../plugins/uavobjects/uavobjects.pri) -include(../../plugins/uavtalk/uavtalk.pri) -#include(../../plugins/coreplugin/coreplugin.pri) -#include(../../libs/utils/utils.pri) diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2configuration.cpp b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2configuration.cpp deleted file mode 100644 index 5977e5220..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2configuration.cpp +++ /dev/null @@ -1,178 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2configuration.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "hitlv2configuration.h" - -HITLConfiguration::HITLConfiguration(QString classId, - QSettings* qSettings, - QObject *parent) - : IUAVGadgetConfiguration(classId, parent) -{ -// qDebug() << "HITLV2Configuration"; - // default values - QString simulatorId = "ASimRC"; - QString hostAddress = "127.0.0.1"; - int inPort = 40100; - QString remoteAddress = "127.0.0.1"; - int outPort = 40200; - QString binPath = ""; - QString dataPath = ""; - - bool homeLocation = true; - quint16 homeLocRate = 0; - - bool attRaw = true; - quint8 attRawRate = 20; - - bool attActual = true; - bool attActHW = false; - bool attActSim = true; - bool attActCalc = false; - - bool sonarAltitude = false; - float sonarMaxAlt = 5.0; - quint16 sonarAltRate = 50; - - bool gpsPosition = true; - quint16 gpsPosRate = 200; - - bool inputCommand = true; - bool gcsReciever = true; - bool manualControl = false; - - bool manualOutput = false; - quint8 outputRate = 20; - - // if a saved configuration exists load it - if (qSettings != 0) { - settings.simulatorId = qSettings->value("simulatorId", simulatorId).toString(); - settings.hostAddress = qSettings->value("hostAddress", hostAddress).toString(); - settings.inPort = qSettings->value("inPort", inPort).toInt(); - settings.remoteAddress = qSettings->value("remoteAddress", remoteAddress).toString(); - settings.outPort = qSettings->value("outPort", outPort).toInt(); - settings.binPath = qSettings->value("binPath", binPath).toString(); - settings.dataPath = qSettings->value("dataPath", dataPath).toString(); - - settings.homeLocation = qSettings->value("homeLocation", homeLocation).toBool(); - settings.homeLocRate = qSettings->value("homeLocRate", homeLocRate).toInt(); - - settings.attRaw = qSettings->value("attRaw", attRaw).toBool(); - settings.attRawRate = qSettings->value("attRawRate", attRawRate).toInt(); - - settings.attActual = qSettings->value("attActual", attActual).toBool(); - settings.attActHW = qSettings->value("attActHW", attActHW).toBool(); - settings.attActSim = qSettings->value("attActSim", attActSim).toBool(); - settings.attActCalc = qSettings->value("attActCalc", attActCalc).toBool(); - - settings.sonarAltitude = qSettings->value("sonarAltitude", sonarAltitude).toBool(); - settings.sonarMaxAlt = qSettings->value("sonarMaxAlt", sonarMaxAlt).toFloat(); - settings.sonarAltRate = qSettings->value("sonarAltRate", sonarAltRate).toInt(); - - settings.gpsPosition = qSettings->value("gpsPosition", gpsPosition).toBool(); - settings.gpsPosRate = qSettings->value("gpsPosRate", gpsPosRate).toInt(); - - settings.inputCommand = qSettings->value("inputCommand", inputCommand).toBool(); - settings.gcsReciever = qSettings->value("gcsReciever", gcsReciever).toBool(); - settings.manualControl = qSettings->value("manualControl", manualControl).toBool(); - settings.manualOutput = qSettings->value("manualOutput", manualOutput).toBool(); - settings.outputRate = qSettings->value("outputRate", outputRate).toInt(); - } else { - settings.simulatorId = simulatorId; - settings.hostAddress = hostAddress; - settings.inPort = inPort; - settings.remoteAddress = remoteAddress; - settings.outPort = outPort; - settings.binPath = binPath; - settings.dataPath = dataPath; - - settings.homeLocation = homeLocation; - settings.homeLocRate = homeLocRate; - - settings.attRaw = attRaw; - settings.attRawRate = attRawRate; - - settings.attActual = attActual; - settings.attActHW = attActHW; - settings.attActSim = attActSim; - settings.attActCalc = attActCalc; - - settings.sonarAltitude = sonarAltitude; - settings.sonarMaxAlt = sonarMaxAlt; - settings.sonarAltRate = sonarAltRate; - - settings.gpsPosition = gpsPosition; - settings.gpsPosRate = gpsPosRate; - - settings.inputCommand = inputCommand; - settings.gcsReciever = gcsReciever; - settings.manualControl = manualControl; - settings.manualOutput = manualOutput; - settings.outputRate = outputRate; - } -} - -IUAVGadgetConfiguration *HITLConfiguration::clone() -{ - HITLConfiguration *m = new HITLConfiguration(this->classId()); - m->settings = settings; - return m; -} - -void HITLConfiguration::saveConfig(QSettings* qSettings) const -{ - qSettings->setValue("simulatorId", settings.simulatorId); - qSettings->setValue("hostAddress", settings.hostAddress); - qSettings->setValue("inPort", settings.inPort); - qSettings->setValue("remoteAddress", settings.remoteAddress); - qSettings->setValue("outPort", settings.outPort); - qSettings->setValue("binPath", settings.binPath); - qSettings->setValue("dataPath", settings.dataPath); - - qSettings->setValue("homeLocation", settings.homeLocation); - qSettings->setValue("homeLocRate", settings.homeLocRate); - - qSettings->setValue("attRaw", settings.attRaw); - qSettings->setValue("attRawRate", settings.attRawRate); - - qSettings->setValue("attActual", settings.attActual); - qSettings->setValue("attActHW", settings.attActHW); - qSettings->setValue("attActSim", settings.attActSim); - qSettings->setValue("attActCalc", settings.attActCalc); - - qSettings->setValue("sonarAltitude", settings.sonarAltitude); - qSettings->setValue("sonarMaxAlt", settings.sonarMaxAlt); - qSettings->setValue("sonarAltRate", settings.sonarAltRate); - - qSettings->setValue("gpsPosition", settings.gpsPosition); - qSettings->setValue("gpsPosRate", settings.gpsPosRate); - - qSettings->setValue("inputCommand", settings.inputCommand); - qSettings->setValue("gcsReciever", settings.gcsReciever); - qSettings->setValue("manualControl", settings.manualControl); - qSettings->setValue("manualOutput", settings.manualOutput); - qSettings->setValue("outputRate", settings.outputRate); -} diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2configuration.h b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2configuration.h deleted file mode 100644 index 3e6a96df6..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2configuration.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2configuration.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef HITLV2CONFIGURATION_H -#define HITLV2CONFIGURATION_H - -#include -#include -#include -#include - -using namespace Core; - -class HITLConfiguration : public IUAVGadgetConfiguration -{ - - Q_OBJECT - - Q_PROPERTY(SimulatorSettings settings READ Settings WRITE setSimulatorSettings) - -public: - explicit HITLConfiguration(QString classId, QSettings* qSettings = 0, QObject *parent = 0); - - void saveConfig(QSettings* settings) const; - IUAVGadgetConfiguration *clone(); - - SimulatorSettings Settings() const { return settings; } - -public slots: - void setSimulatorSettings (const SimulatorSettings& params ) { settings = params; } - - -private: - SimulatorSettings settings; -}; - -#endif // HITLV2CONFIGURATION_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2factory.cpp b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2factory.cpp deleted file mode 100644 index c9e52ebb4..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2factory.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2factory.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "hitlv2factory.h" -#include "hitlv2widget.h" -#include "hitlv2gadget.h" -#include "hitlv2configuration.h" -#include "hitlv2optionspage.h" -#include - -HITLFactory::HITLFactory(QObject *parent) - : IUAVGadgetFactory(QString("HITLv2"), tr("HITL Simulation (v2)"), parent) -{ -} - -HITLFactory::~HITLFactory() -{ -} - -Core::IUAVGadget* HITLFactory::createGadget(QWidget *parent) -{ - HITLWidget* gadgetWidget = new HITLWidget(parent); - return new HITLGadget(QString("HITLv2"), gadgetWidget, parent); -} - -IUAVGadgetConfiguration *HITLFactory::createConfiguration(QSettings* qSettings) -{ - return new HITLConfiguration(QString("HITLv2"), qSettings); -} - -IOptionsPage *HITLFactory::createOptionsPage(IUAVGadgetConfiguration *config) -{ - return new HITLOptionsPage(qobject_cast(config)); -} - diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2factory.h b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2factory.h deleted file mode 100644 index cfa91750d..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2factory.h +++ /dev/null @@ -1,52 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2factory.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef HITLV2FACTORY_H -#define HITLV2FACTORY_H - -#include - -namespace Core { -class IUAVGadget; -class IUAVGadgetFactory; -} - -using namespace Core; - -class HITLFactory : public Core::IUAVGadgetFactory -{ - Q_OBJECT -public: - HITLFactory(QObject *parent = 0); - ~HITLFactory(); - - IUAVGadget *createGadget(QWidget *parent); - IUAVGadgetConfiguration *createConfiguration(QSettings* qSettings); - IOptionsPage *createOptionsPage(IUAVGadgetConfiguration *config); -}; - -#endif // HITLV2FACTORY_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2gadget.cpp b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2gadget.cpp deleted file mode 100644 index b114cbde5..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2gadget.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2gadget.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "hitlv2gadget.h" -#include "hitlv2widget.h" -#include "hitlv2configuration.h" -#include "simulatorv2.h" - -HITLGadget::HITLGadget(QString classId, HITLWidget *widget, QWidget *parent) : - IUAVGadget(classId, parent), - m_widget(widget) -{ - connect(this, SIGNAL(changeConfiguration(void)), m_widget, SLOT(stopButtonClicked(void))); -} - -HITLGadget::~HITLGadget() -{ - delete m_widget; -} - -void HITLGadget::loadConfiguration(IUAVGadgetConfiguration* config) -{ - HITLConfiguration *m = qobject_cast(config); - emit changeConfiguration(); - m_widget->setSettingParameters(m->Settings()); -} diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2gadget.h b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2gadget.h deleted file mode 100644 index 45302abb8..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2gadget.h +++ /dev/null @@ -1,60 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2gadget.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef HITLV2_H -#define HITLV2_H - -#include -#include "hitlv2widget.h" - -class IUAVGadget; -class QWidget; -class QString; -class Simulator; - -using namespace Core; - -class HITLGadget : public Core::IUAVGadget -{ - Q_OBJECT -public: - HITLGadget(QString classId, HITLWidget *widget, QWidget *parent = 0); - ~HITLGadget(); - - QWidget *widget() { return m_widget; } - void loadConfiguration(IUAVGadgetConfiguration* config); - -signals: - void changeConfiguration(); - -private: - HITLWidget* m_widget; - Simulator* simulator; -}; - - -#endif // HITLV2_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.cpp b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.cpp deleted file mode 100644 index 280ccf030..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.cpp +++ /dev/null @@ -1,146 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2optionspage.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "hitlv2optionspage.h" -#include "hitlv2configuration.h" -#include "ui_hitlv2optionspage.h" -#include "hitlv2plugin.h" - -#include -#include -#include -#include "simulatorv2.h" - -HITLOptionsPage::HITLOptionsPage(HITLConfiguration *conf, QObject *parent) : - IOptionsPage(parent), - config(conf) -{ -} - -QWidget *HITLOptionsPage::createPage(QWidget *parent) -{ -// qDebug() << "HITLOptionsPage::createPage"; - // Create page - m_optionsPage = new Ui::HITLOptionsPage(); - QWidget* optionsPageWidget = new QWidget; - m_optionsPage->setupUi(optionsPageWidget); - int index = 0; - foreach (SimulatorCreator* creator, HITLPlugin::typeSimulators) - m_optionsPage->chooseFlightSimulator->insertItem(index++, creator->Description(), creator->ClassId()); - - m_optionsPage->executablePath->setExpectedKind(Utils::PathChooser::File); - m_optionsPage->executablePath->setPromptDialogTitle(tr("Choose flight simulator executable")); - m_optionsPage->dataPath->setExpectedKind(Utils::PathChooser::Directory); - m_optionsPage->dataPath->setPromptDialogTitle(tr("Choose flight simulator data directory")); - - // Restore the contents from the settings: - foreach (SimulatorCreator* creator, HITLPlugin::typeSimulators) { - QString id = config->Settings().simulatorId; - if (creator->ClassId() == id) - m_optionsPage->chooseFlightSimulator->setCurrentIndex(HITLPlugin::typeSimulators.indexOf(creator)); - } - - m_optionsPage->hostAddress->setText(config->Settings().hostAddress); - m_optionsPage->inputPort->setText(QString::number(config->Settings().inPort)); - m_optionsPage->remoteAddress->setText(config->Settings().remoteAddress); - m_optionsPage->outputPort->setText(QString::number(config->Settings().outPort)); - m_optionsPage->executablePath->setPath(config->Settings().binPath); - m_optionsPage->dataPath->setPath(config->Settings().dataPath); - - m_optionsPage->homeLocation->setChecked(config->Settings().homeLocation); - m_optionsPage->homeLocRate->setValue(config->Settings().homeLocRate); - - m_optionsPage->attRaw->setChecked(config->Settings().attRaw); - m_optionsPage->attRawRate->setValue(config->Settings().attRawRate); - - m_optionsPage->attActual->setChecked(config->Settings().attActual); - m_optionsPage->attActHW->setChecked(config->Settings().attActHW); - m_optionsPage->attActSim->setChecked(config->Settings().attActSim); - m_optionsPage->attActCalc->setChecked(config->Settings().attActCalc); - - m_optionsPage->sonarAltitude->setChecked(config->Settings().sonarAltitude); - m_optionsPage->sonarMaxAlt->setValue(config->Settings().sonarMaxAlt); - m_optionsPage->sonarAltRate->setValue(config->Settings().sonarAltRate); - - m_optionsPage->gpsPosition->setChecked(config->Settings().gpsPosition); - m_optionsPage->gpsPosRate->setValue(config->Settings().gpsPosRate); - - m_optionsPage->inputCommand->setChecked(config->Settings().inputCommand); - m_optionsPage->gcsReciever->setChecked(config->Settings().gcsReciever); - m_optionsPage->manualControl->setChecked(config->Settings().manualControl); - - m_optionsPage->manualOutput->setChecked(config->Settings().manualOutput); - m_optionsPage->outputRate->setValue(config->Settings().outputRate); - - return optionsPageWidget; -} - -void HITLOptionsPage::apply() -{ - SimulatorSettings settings; - int i = m_optionsPage->chooseFlightSimulator->currentIndex(); - - settings.simulatorId = m_optionsPage->chooseFlightSimulator->itemData(i).toString(); - settings.hostAddress = m_optionsPage->hostAddress->text(); - settings.inPort = m_optionsPage->inputPort->text().toInt(); - settings.remoteAddress = m_optionsPage->remoteAddress->text(); - settings.outPort = m_optionsPage->outputPort->text().toInt(); - settings.binPath = m_optionsPage->executablePath->path(); - settings.dataPath = m_optionsPage->dataPath->path(); - - settings.homeLocation = m_optionsPage->homeLocation->isChecked(); - settings.homeLocRate = m_optionsPage->homeLocRate->value(); - - settings.attRaw = m_optionsPage->attRaw->isChecked(); - settings.attRawRate = m_optionsPage->attRawRate->value(); - - settings.attActual = m_optionsPage->attActual->isChecked(); - settings.attActHW = m_optionsPage->attActHW->isChecked(); - settings.attActSim = m_optionsPage->attActSim->isChecked(); - settings.attActCalc = m_optionsPage->attActCalc->isChecked(); - - settings.sonarAltitude = m_optionsPage->sonarAltitude->isChecked(); - settings.sonarMaxAlt = m_optionsPage->sonarMaxAlt->value(); - settings.sonarAltRate = m_optionsPage->sonarAltRate->value(); - - settings.gpsPosition = m_optionsPage->gpsPosition->isChecked(); - settings.gpsPosRate = m_optionsPage->gpsPosRate->value(); - - settings.inputCommand = m_optionsPage->inputCommand->isChecked(); - settings.gcsReciever = m_optionsPage->gcsReciever->isChecked(); - settings.manualControl = m_optionsPage->manualControl->isChecked(); - - settings.manualOutput = m_optionsPage->manualOutput->isChecked(); - settings.outputRate = m_optionsPage->outputRate->value(); - - config->setSimulatorSettings(settings); -} - -void HITLOptionsPage::finish() -{ - delete m_optionsPage; -} diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.h b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.h deleted file mode 100644 index dbfe028bc..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.h +++ /dev/null @@ -1,61 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2optionspage.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef HITLV2OPTIONSPAGE_H -#define HITLV2OPTIONSPAGE_H - -#include - -namespace Core { -class IUAVGadgetConfiguration; -} - -class HITLConfiguration; - -using namespace Core; - -namespace Ui { -class HITLOptionsPage; -} - -class HITLOptionsPage : public IOptionsPage -{ - Q_OBJECT -public: - explicit HITLOptionsPage(HITLConfiguration *conf, QObject *parent = 0); - - QWidget *createPage(QWidget *parent); - void apply(); - void finish(); - bool isDecorated() const { return true; } - -private: - HITLConfiguration* config; - Ui::HITLOptionsPage* m_optionsPage; -}; - -#endif // HITLV2OPTIONSPAGE_H diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.ui b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.ui deleted file mode 100644 index 00a2f60aa..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2optionspage.ui +++ /dev/null @@ -1,639 +0,0 @@ - - - HITLOptionsPage - - - - 0 - 0 - 403 - 400 - - - - Form - - - - 3 - - - 0 - - - 0 - - - 0 - - - 3 - - - - - - - Choose flight simulator: - - - - - - - - - - - - - - Local interface (IP): - - - - - - - For communication with sim computer via network. Should be the IP address of one of the interfaces of the GCS computer. - - - - - - - Remote interface (IP): - - - - - - - Only required if running simulator on remote machine. Should be the IP of the machine on which the simulator is running. - - - - - - - Input Port: - - - - - - - For receiving data from sim - - - - - - - Output Port: - - - - - - - For sending data to sim - - - - - - - - - QFormLayout::AllNonFixedFieldsGrow - - - - - - 0 - 0 - - - - Path executable: - - - - - - - - - - - 0 - 0 - - - - Data directory: - - - - - - - - - - - - - - Attitude data - - - - 3 - - - 3 - - - 3 - - - 3 - - - 0 - - - - - AttitudeRaw (gyro, accels) - - - true - - - true - - - false - - - - 3 - - - 3 - - - 0 - - - 0 - - - - - Refresh rate - - - - - - - ms - - - 10 - - - 100 - - - 20 - - - - - - - - - - AttitudeActual - - - true - - - true - - - false - - - - 3 - - - 3 - - - 0 - - - 0 - - - - - send raw data to board - - - - - - - - 75 - true - - - - - - - use values from simulator - - - true - - - - - - - - - - calculate from AttitudeRaw - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - Other data - - - - 3 - - - 3 - - - 3 - - - 3 - - - 0 - - - - - HomeLocation - - - true - - - true - - - false - - - - 3 - - - 3 - - - 0 - - - 0 - - - - - Refresh rate - - - - - - - 0 - update once, or every N seconds - - - sec - - - 10 - - - - - - - - - - GPSPosition - - - true - - - true - - - false - - - - 3 - - - 3 - - - 0 - - - 0 - - - - - Refresh rate - - - - - - - ms - - - 100 - - - 2000 - - - 500 - - - - - - - - - - SonarAltitude - - - true - - - true - - - false - - - - 3 - - - 6 - - - 3 - - - 0 - - - 0 - - - - - - - Range detectioon - - - - - - - m - - - 1 - - - 10 - - - 5 - - - - - - - Refresh rate - - - - - - - ms - - - 20 - - - 2000 - - - 10 - - - 50 - - - - - - - - - - - - Map command from simulator - - - true - - - true - - - false - - - - 3 - - - 3 - - - 0 - - - 0 - - - - - - 75 - true - - - - to GCSReciver - - - true - - - - - - - false - - - to ManualCtrll (not implemented) - - - - - - - - - - 6 - - - - - Maximum output rate - - - - - - - ms - - - 10 - - - 100 - - - 5 - - - 15 - - - - - - - - - Qt::Vertical - - - - 20 - 40 - - - - - - - - - - - - - - Utils::PathChooser - QWidget -

utils/pathchooser.h
- 1 - - - - chooseFlightSimulator - hostAddress - inputPort - remoteAddress - outputPort - - - - diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2plugin.cpp b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2plugin.cpp deleted file mode 100644 index c63ba5c86..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2plugin.cpp +++ /dev/null @@ -1,71 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2plugin.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "hitlv2plugin.h" -#include "hitlv2factory.h" -#include -#include -#include - -#include "aerosimrc.h" - -QList HITLPlugin::typeSimulators; - -HITLPlugin::HITLPlugin() -{ - // Do nothing -} - -HITLPlugin::~HITLPlugin() -{ - // Do nothing -} - -bool HITLPlugin::initialize(const QStringList& args, QString *errMsg) -{ - Q_UNUSED(args); - Q_UNUSED(errMsg); - mf = new HITLFactory(this); - - addAutoReleasedObject(mf); - - addSimulator(new AeroSimRCSimulatorCreator("ASimRC", "AeroSimRC")); - - return true; -} - -void HITLPlugin::extensionsInitialized() -{ - // Do nothing -} - -void HITLPlugin::shutdown() -{ - // Do nothing -} -Q_EXPORT_PLUGIN(HITLPlugin) - diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2plugin.h b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2plugin.h deleted file mode 100644 index 3e83915b3..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2plugin.h +++ /dev/null @@ -1,67 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2plugin.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef HITLV2PLUGIN_H -#define HITLV2PLUGIN_H - -#include -#include - -#include - -class HITLFactory; - -class HITLPlugin : public ExtensionSystem::IPlugin -{ -public: - HITLPlugin(); - ~HITLPlugin(); - - void extensionsInitialized(); - bool initialize(const QStringList & arguments, QString * errorString); - void shutdown(); - - static void addSimulator(SimulatorCreator* creator) - { - HITLPlugin::typeSimulators.append(creator); - } - - static SimulatorCreator* getSimulatorCreator(const QString classId) - { - foreach(SimulatorCreator* creator, HITLPlugin::typeSimulators) { - if(classId == creator->ClassId()) - return creator; - } - return 0; - } - - static QList typeSimulators; - -private: - HITLFactory *mf; -}; -#endif /* HITLV2PLUGIN_H */ diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.cpp b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.cpp deleted file mode 100644 index 8933d7748..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.cpp +++ /dev/null @@ -1,188 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2widget.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "hitlv2widget.h" -#include "ui_hitlv2widget.h" -#include -#include -#include -#include -#include - -#include "hitlv2plugin.h" -#include "simulatorv2.h" -#include "uavobjectmanager.h" -#include -#include - -QStringList Simulator::instances; - -HITLWidget::HITLWidget(QWidget *parent) - : QWidget(parent), - simulator(0) -{ - widget = new Ui_HITLWidget(); - widget->setupUi(this); - widget->startButton->setEnabled(true); - widget->stopButton->setEnabled(false); - - strAutopilotDisconnected = " AP OFF "; - strSimulatorDisconnected = " Sim OFF "; - strAutopilotConnected = " AP ON "; -// strSimulatorConnected = " Sim ON "; - strStyleEnable = "QFrame{background-color: green; color: white}"; - strStyleDisable = "QFrame{background-color: red; color: grey}"; - - widget->apLabel->setText(strAutopilotDisconnected); - widget->simLabel->setText(strSimulatorDisconnected); - - connect(widget->startButton, SIGNAL(clicked()), this, SLOT(startButtonClicked())); - connect(widget->stopButton, SIGNAL(clicked()), this, SLOT(stopButtonClicked())); - connect(widget->buttonClearLog, SIGNAL(clicked()), this, SLOT(buttonClearLogClicked())); -} - -HITLWidget::~HITLWidget() -{ - delete widget; -} - -void HITLWidget::startButtonClicked() -{ - // allow only one instance per simulator - if (Simulator::Instances().indexOf(settings.simulatorId) != -1) { - widget->textBrowser->append(settings.simulatorId + " alreary started!"); - return; - } - - if (!HITLPlugin::typeSimulators.size()) { - widget->textBrowser->append("There is no registered simulators, add through HITLPlugin::addSimulator"); - return; - } - - // Stop running process if one is active - if (simulator) { - QMetaObject::invokeMethod(simulator, "onDeleteSimulator", Qt::QueuedConnection); - simulator = NULL; - } - - if (settings.hostAddress == "" || settings.inPort == 0) { - widget->textBrowser->append("Before start, set UDP parameters in options page!"); - return; - } - - SimulatorCreator* creator = HITLPlugin::getSimulatorCreator(settings.simulatorId); - simulator = creator->createSimulator(settings); - simulator->setName(creator->Description()); - simulator->setSimulatorId(creator->ClassId()); - - connect(simulator, SIGNAL(processOutput(QString)), this, SLOT(onProcessOutput(QString))); - - // Setup process - onProcessOutput(QString("[%1] Starting %2... ") - .arg(QTime::currentTime().toString("hh:mm:ss")) - .arg(creator->Description())); - - // Start bridge - bool ret = QMetaObject::invokeMethod(simulator, "setupProcess", Qt::QueuedConnection); - if (ret) { - Simulator::setInstance(settings.simulatorId); - - connect(this, SIGNAL(deleteSimulator()), simulator, SLOT(onDeleteSimulator()), Qt::QueuedConnection); - - widget->startButton->setEnabled(false); - widget->stopButton->setEnabled(true); - - connect(simulator, SIGNAL(autopilotConnected()), this, SLOT(onAutopilotConnect()), Qt::QueuedConnection); - connect(simulator, SIGNAL(autopilotDisconnected()), this, SLOT(onAutopilotDisconnect()), Qt::QueuedConnection); - connect(simulator, SIGNAL(simulatorConnected()), this, SLOT(onSimulatorConnect()), Qt::QueuedConnection); - connect(simulator, SIGNAL(simulatorDisconnected()), this, SLOT(onSimulatorDisconnect()), Qt::QueuedConnection); - - // Initialize connection status - if (simulator->isAutopilotConnected()) - onAutopilotConnect(); - else - onAutopilotDisconnect(); - - if (simulator->isSimulatorConnected()) - onSimulatorConnect(); - else - onSimulatorDisconnect(); - } -} - -void HITLWidget::stopButtonClicked() -{ - if (simulator) - widget->textBrowser->append(QString("[%1] Terminate %2 ") - .arg(QTime::currentTime().toString("hh:mm:ss")) - .arg(simulator->Name())); - - widget->startButton->setEnabled(true); - widget->stopButton->setEnabled(false); - widget->apLabel->setStyleSheet(QString::fromUtf8("QFrame{background-color: transparent; color: white}")); - widget->simLabel->setStyleSheet(QString::fromUtf8("QFrame{background-color: transparent; color: white}")); - widget->apLabel->setText(strAutopilotDisconnected); - widget->simLabel->setText(strSimulatorDisconnected); - if (simulator) { - QMetaObject::invokeMethod(simulator, "onDeleteSimulator", Qt::QueuedConnection); - simulator = NULL; - } -} - -void HITLWidget::buttonClearLogClicked() -{ - widget->textBrowser->clear(); -} - -void HITLWidget::onProcessOutput(QString text) -{ - widget->textBrowser->append(text); -} - -void HITLWidget::onAutopilotConnect() -{ - widget->apLabel->setStyleSheet(strStyleEnable); - widget->apLabel->setText(strAutopilotConnected); -} - -void HITLWidget::onAutopilotDisconnect() -{ - widget->apLabel->setStyleSheet(strStyleDisable); - widget->apLabel->setText(strAutopilotDisconnected); -} - -void HITLWidget::onSimulatorConnect() -{ - widget->simLabel->setStyleSheet(strStyleEnable); - widget->simLabel->setText(" " + simulator->Name() + " ON "); -} - -void HITLWidget::onSimulatorDisconnect() -{ - widget->simLabel->setStyleSheet(strStyleDisable); - widget->simLabel->setText(" " + simulator->Name() + " OFF "); -} diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.h b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.h deleted file mode 100644 index 6cf1c66c7..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.h +++ /dev/null @@ -1,72 +0,0 @@ -/** - ****************************************************************************** - * - * @file hitlv2widget.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef HITLV2WIDGET_H -#define HITLV2WIDGET_H - -#include -#include -#include "simulatorv2.h" - -class Ui_HITLWidget; - -class HITLWidget : public QWidget -{ - Q_OBJECT - -public: - HITLWidget(QWidget *parent = 0); - ~HITLWidget(); - - void setSettingParameters(const SimulatorSettings& params) { settings = params; } - -signals: - void deleteSimulator(); - -private slots: - void startButtonClicked(); - void stopButtonClicked(); - void buttonClearLogClicked(); - void onProcessOutput(QString text); - void onAutopilotConnect(); - void onAutopilotDisconnect(); - void onSimulatorConnect(); - void onSimulatorDisconnect(); - -private: - Ui_HITLWidget* widget; - Simulator* simulator; - SimulatorSettings settings; - - QString strAutopilotDisconnected; - QString strSimulatorDisconnected; - QString strAutopilotConnected; -// QString strSimulatorConnected; - QString strStyleEnable; - QString strStyleDisable; -}; -#endif /* HITLV2WIDGET_H */ diff --git a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.ui b/ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.ui deleted file mode 100644 index 48d2c2db2..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/hitlv2widget.ui +++ /dev/null @@ -1,314 +0,0 @@ - - - HITLWidget - - - - 0 - 0 - 477 - 300 - - - - - 0 - 0 - - - - Form - - - - -QScrollBar:vertical { - border: 1px solid grey; - background: grey; - margin: 22px 0 22px 0; - } - -QScrollBar:vertical:disabled { - border: 1px solid grey; - - background-color: grey; - margin: 22px 0 22px 0; - } - - QScrollBar::handle:vertical { -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(120, 120, 255, 255), stop:1 rgba(80, 80, 160, 255)); - min-height: 20px; - } - -QScrollBar::handle:vertical:disabled{ -background-color: grey; - min-height: 20px; - } - - - QScrollBar::handle:vertical:pressed { - - background-color: rgb(85, 85, 255); -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(170, 170, 255, 255), stop:1 rgba(80, 80, 160, 255)); - - min-height: 20px; - } - - QScrollBar::add-line:vertical { - border: 1px solid black; -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(48, 48, 48, 255), stop:1 rgba(120, 120, 120, 255)); - height: 20px; - subcontrol-position: bottom; - subcontrol-origin: margin; - } - - QScrollBar::add-line:vertical:disabled { -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(100, 100, 100, 255)); - border: 1px solid grey; - - } - - QScrollBar::sub-line:vertical:disabled { -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(100, 100, 100, 255)); - border: 1px solid grey; - - } - - QScrollBar::add-line:vertical:pressed { -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(255, 255, 255, 200), stop:1 rgba(180, 180, 180, 200)); - } - - QScrollBar::sub-line:vertical:pressed { -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(255, 255, 255, 200), stop:1 rgba(180, 180, 180, 200)); - } - - QScrollBar::sub-line:vertical { - border: 1px solid black; -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(48, 48, 48, 255), stop:1 rgba(120, 120, 120, 255)); - height: 20px; - subcontrol-position: top; - subcontrol-origin: margin; - } - QScrollBar::down-arrow:vertical { - - image: url(:/hitlnew/images/arrow-down2.png); - } - - QScrollBar::up-arrow:vertical { - image: url(:/hitlnew/images/arrow-up2.png); - } - - QScrollBar::add-page:vertical, QScrollBar::sub-page:vertical { - background: none; - } - - -QPushButton { -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(110, 110, 110, 255), stop:1 rgba(71, 71, 71, 255)); - - color: rgb(255, 255, 255); -border: 1px solid black; -width: 66px; -height: 20px; -} - -QPushButton:disabled { -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(120, 120, 120, 255)); - color: rgb(194, 194, 194); -border: 1px solid gray; -width: 66px; -height: 20px; -} - -QPushButton:hover { -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(255, 255, 255, 200), stop:1 rgba(180, 180, 180, 200)); -color: rgb(255, 255, 255); -border: 0px; -} -QPushButton:pressed { -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(48, 48, 48, 255), stop:1 rgba(120, 120, 120, 255)); -color: rgb(255, 255, 255); -border: 0px; -} - -QPushButton:checked { -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(48, 48, 48, 255), stop:1 rgba(120, 120, 120, 255)); -color: rgb(255, 255, 255); -border: 0px; -} - - - - 0 - - - - - - 0 - 0 - - - - - 0 - 0 - - - - - 16777215 - 16777215 - - - - - -QFrame{ -background-color: qlineargradient(spread:pad, x1:0.5, y1:0, x2:0.5, y2:1, stop:0 rgba(110, 110, 110, 255), stop:1 rgba(71, 71, 71, 255)); -color: rgba(0, 0, 0, 128); -} - - - - QFrame::StyledPanel - - - QFrame::Raised - - - - QLayout::SetMaximumSize - - - - - QLayout::SetDefaultConstraint - - - - - Request update - - - - - - Start - - - - - - - false - - - Send update - - - Stop - - - - - - - - 0 - 22 - - - - - 50 - false - - - - Qt::LeftToRight - - - false - - - color: rgb(255, 255, 255); - - - AP OFF - - - Qt::AlignCenter - - - - - - - - 0 - 22 - - - - color: rgb(255, 255, 255); - - - Sim OFF - - - Qt::AlignCenter - - - - - - - Clear Log - - - - - - - - - - 0 - 0 - - - - - 0 - 0 - - - - false - - - QTextEdit { - background-color: white; - color: rgb(0, 0, 0); -} - - - QFrame::NoFrame - - - QFrame::Plain - - - Qt::ScrollBarAlwaysOn - - - - - - - - - - - diff --git a/ground/openpilotgcs/src/plugins/hitlv2/plugin.pro b/ground/openpilotgcs/src/plugins/hitlv2/plugin.pro deleted file mode 100644 index 2d375e426..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/plugin.pro +++ /dev/null @@ -1,32 +0,0 @@ -TEMPLATE = lib -TARGET = HITLv2 -QT += network - -include(../../openpilotgcsplugin.pri) -include(hitlv2_dependencies.pri) - -HEADERS += \ - aerosimrc.h \ - hitlv2configuration.h \ - hitlv2factory.h \ - hitlv2gadget.h \ - hitlv2optionspage.h \ - hitlv2plugin.h \ - hitlv2widget.h \ - simulatorv2.h - -SOURCES += \ - aerosimrc.cpp \ - hitlv2configuration.cpp \ - hitlv2factory.cpp \ - hitlv2gadget.cpp \ - hitlv2optionspage.cpp \ - hitlv2plugin.cpp \ - hitlv2widget.cpp \ - simulatorv2.cpp - -FORMS += \ - hitlv2optionspage.ui \ - hitlv2widget.ui - -OTHER_FILES += hitlv2.pluginspec diff --git a/ground/openpilotgcs/src/plugins/hitlv2/simulatorv2.cpp b/ground/openpilotgcs/src/plugins/hitlv2/simulatorv2.cpp deleted file mode 100644 index bc5e0b0b1..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/simulatorv2.cpp +++ /dev/null @@ -1,341 +0,0 @@ -/** - ****************************************************************************** - * - * @file simulatorv2.cpp - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#include "simulatorv2.h" -#include -#include -#include - -volatile bool Simulator::isStarted = false; - -const float Simulator::GEE = 9.81; -const float Simulator::FT2M = 0.3048; -const float Simulator::KT2MPS = 0.514444444; -const float Simulator::INHG2KPA = 3.386; -const float Simulator::FPS2CMPS = 30.48; -const float Simulator::DEG2RAD = (M_PI/180.0); -const float Simulator::RAD2DEG = (180.0/M_PI); - - -Simulator::Simulator(const SimulatorSettings& params) : - inSocket(NULL), - outSocket(NULL), - settings(params), - updatePeriod(50), - simTimeout(2000), - autopilotConnectionStatus(false), - simConnectionStatus(false), - txTimer(NULL), - simTimer(NULL), - name("") -{ - // move to thread - moveToThread(Core::ICore::instance()->threadManager()->getRealTimeThread()); - connect(this, SIGNAL(myStart()), this, SLOT(onStart()), Qt::QueuedConnection); - emit myStart(); -} - -Simulator::~Simulator() -{ -// qDebug() << "Simulator::~Simulator"; - if (inSocket) { - delete inSocket; - inSocket = NULL; - } - if (outSocket) { - delete outSocket; - outSocket = NULL; - } - if (txTimer) { - delete txTimer; - txTimer = NULL; - } - if (simTimer) { - delete simTimer; - simTimer = NULL; - } -} - -void Simulator::onDeleteSimulator(void) -{ -// qDebug() << "Simulator::onDeleteSimulator"; - resetAllObjects(); - - Simulator::setStarted(false); - Simulator::Instances().removeOne(simulatorId); - - disconnect(this); - delete this; -} - -void Simulator::onStart() -{ -// qDebug() << "Simulator::onStart"; - QMutexLocker locker(&lock); - - // Get required UAVObjects - ExtensionSystem::PluginManager* pm = ExtensionSystem::PluginManager::instance(); - UAVObjectManager* objManager = pm->getObject(); - -// actDesired = ActuatorDesired::GetInstance(objManager); -// manCtrlCommand = ManualControlCommand::GetInstance(objManager); -// velActual = VelocityActual::GetInstance(objManager); -// posActual = PositionActual::GetInstance(objManager); -// altActual = BaroAltitude::GetInstance(objManager); -// camDesired = CameraDesired::GetInstance(objManager); -// acsDesired = AccessoryDesired::GetInstance(objManager); - posHome = HomeLocation::GetInstance(objManager); - accels = Accels::GetInstance(objManager); - gyros = Gyros::GetInstance(objManager); - attActual = AttitudeActual::GetInstance(objManager); - gpsPosition = GPSPosition::GetInstance(objManager); - flightStatus = FlightStatus::GetInstance(objManager); - gcsReceiver = GCSReceiver::GetInstance(objManager); - actCommand = ActuatorCommand::GetInstance(objManager); - attSettings = AttitudeSettings::GetInstance(objManager); - sonarAlt = SonarAltitude::GetInstance(objManager); - - telStats = GCSTelemetryStats::GetInstance(objManager); - - // Listen to autopilot connection events - TelemetryManager* telMngr = pm->getObject(); - connect(telMngr, SIGNAL(connected()), this, SLOT(onAutopilotConnect())); - connect(telMngr, SIGNAL(disconnected()), this, SLOT(onAutopilotDisconnect())); - - // If already connect setup autopilot - GCSTelemetryStats::DataFields stats = telStats->getData(); - if (stats.Status == GCSTelemetryStats::STATUS_CONNECTED) - onAutopilotConnect(); - - emit processOutput("Local interface: " + settings.hostAddress + ":" + \ - QString::number(settings.inPort) + "\n" + \ - "Remote interface: " + settings.remoteAddress + ":" + \ - QString::number(settings.outPort) + "\n"); - - inSocket = new QUdpSocket(); - outSocket = new QUdpSocket(); - setupUdpPorts(settings.hostAddress, settings.inPort, settings.outPort); - - connect(inSocket, SIGNAL(readyRead()), this, SLOT(receiveUpdate())/*, Qt::DirectConnection*/); - - // Setup transmit timer - if (settings.manualOutput) { - txTimer = new QTimer(); - connect(txTimer, SIGNAL(timeout()), this, SLOT(transmitUpdate())/*, Qt::DirectConnection*/); - txTimer->setInterval(settings.outputRate); - txTimer->start(); - } - - // Setup simulator connection timer - simTimer = new QTimer(); - connect(simTimer, SIGNAL(timeout()), this, SLOT(onSimulatorConnectionTimeout())/*, Qt::DirectConnection*/); - simTimer->setInterval(simTimeout); - simTimer->start(); - -#ifdef DBG_TIMERS - timeRX = QTime(); - timeRX.start(); - timeTX = QTime(); - timeTX.start(); -#endif - - setupObjects(); -} - -void Simulator::receiveUpdate() -{ - // Update connection timer and status - simTimer->start(); - if (!simConnectionStatus) { - simConnectionStatus = true; - emit simulatorConnected(); - } - - // Process data - while (inSocket->hasPendingDatagrams()) { - // Receive datagram - QByteArray datagram; - datagram.resize(inSocket->pendingDatagramSize()); - QHostAddress sender; - quint16 senderPort; - inSocket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort); - // Process incomming data - processUpdate(datagram); - } - if (!settings.manualOutput) - transmitUpdate(); -} - -void Simulator::setupObjects() -{ - if (settings.gcsReciever) { - setupInputObject(actCommand, settings.outputRate); - setupOutputObject(gcsReceiver); - } else if (settings.manualControl) { -// setupInputObject(actDesired); -// setupInputObject(camDesired); -// setupInputObject(acsDesired); -// setupOutputObject(manCtrlCommand); - qDebug() << "ManualControlCommand not implemented yet"; - } - - if (settings.homeLocation) - setupOutputObject(posHome); - - if (settings.sonarAltitude) - setupOutputObject(sonarAlt); - - if (settings.gpsPosition) - setupOutputObject(gpsPosition); - - if (settings.attRaw || settings.attActual) { - setupOutputObject(accels); - setupOutputObject(gyros); - } - - if (settings.attActual && !settings.attActHW) - setupOutputObject(attActual); - else - setupWatchedObject(attActual); -} - -void Simulator::resetAllObjects() -{ - setupDefaultObject(posHome); - setupDefaultObject(accels); - setupDefaultObject(gyros); - setupDefaultObject(attActual); - setupDefaultObject(gpsPosition); - setupDefaultObject(gcsReceiver); - setupDefaultObject(actCommand); - setupDefaultObject(sonarAlt); -// setupDefaultObject(manCtrlCommand); -// setupDefaultObject(actDesired); -// setupDefaultObject(camDesired); -// setupDefaultObject(acsDesired); -// setupDefaultObject(altActual); -// setupDefaultObject(posActual); -// setupDefaultObject(velActual); -} - -void Simulator::setupInputObject(UAVObject* obj, quint32 updateRate) -{ - UAVObject::Metadata mdata; - mdata = obj->getDefaultMetadata(); - - UAVObject::SetGcsAccess(mdata, UAVObject::ACCESS_READONLY); - UAVObject::SetGcsTelemetryAcked(mdata, false); - UAVObject::SetGcsTelemetryUpdateMode(mdata, UAVObject::UPDATEMODE_MANUAL); - mdata.gcsTelemetryUpdatePeriod = 0; - - UAVObject::SetFlightAccess(mdata, UAVObject::ACCESS_READWRITE); - UAVObject::SetFlightTelemetryAcked(mdata, false); - - if (settings.manualOutput) { - UAVObject::SetFlightTelemetryUpdateMode(mdata, UAVObject::UPDATEMODE_PERIODIC); - mdata.flightTelemetryUpdatePeriod = updateRate; - } else { - UAVObject::SetFlightTelemetryUpdateMode(mdata, UAVObject::UPDATEMODE_ONCHANGE); - mdata.flightTelemetryUpdatePeriod = 0; - } - - obj->setMetadata(mdata); -} - -void Simulator::setupWatchedObject(UAVObject *obj) -{ - UAVObject::Metadata mdata; - mdata = obj->getDefaultMetadata(); - - UAVObject::SetGcsAccess(mdata, UAVObject::ACCESS_READONLY); - UAVObject::SetGcsTelemetryAcked(mdata, false); - UAVObject::SetGcsTelemetryUpdateMode(mdata, UAVObject::UPDATEMODE_MANUAL); - mdata.gcsTelemetryUpdatePeriod = 0; - - UAVObject::SetFlightAccess(mdata, UAVObject::ACCESS_READWRITE); - UAVObject::SetFlightTelemetryAcked(mdata, false); - UAVObject::SetFlightTelemetryUpdateMode(mdata, UAVObject::UPDATEMODE_PERIODIC); - mdata.flightTelemetryUpdatePeriod = 100; - - obj->setMetadata(mdata); -} - -void Simulator::setupOutputObject(UAVObject* obj) -{ - UAVObject::Metadata mdata; - mdata = obj->getDefaultMetadata(); - - UAVObject::SetGcsAccess(mdata, UAVObject::ACCESS_READWRITE); - UAVObject::SetGcsTelemetryAcked(mdata, false); - UAVObject::SetGcsTelemetryUpdateMode(mdata, UAVObject::UPDATEMODE_ONCHANGE); - mdata.gcsTelemetryUpdatePeriod = 0; - - UAVObject::SetFlightAccess(mdata, UAVObject::ACCESS_READONLY); - UAVObject::SetFlightTelemetryAcked(mdata, false); - UAVObject::SetFlightTelemetryUpdateMode(mdata, UAVObject::UPDATEMODE_MANUAL); - mdata.flightTelemetryUpdatePeriod = 0; - - obj->setMetadata(mdata); -} - -void Simulator::setupDefaultObject(UAVObject *obj) -{ - UAVObject::Metadata mdata; - mdata = obj->getDefaultMetadata(); - - obj->setMetadata(mdata); -} - -void Simulator::onAutopilotConnect() -{ - autopilotConnectionStatus = true; - emit autopilotConnected(); -} - -void Simulator::onAutopilotDisconnect() -{ - autopilotConnectionStatus = false; - emit autopilotDisconnected(); -} - -void Simulator::onSimulatorConnectionTimeout() -{ - if (simConnectionStatus) { - simConnectionStatus = false; - emit simulatorDisconnected(); - } -} - -void Simulator::telStatsUpdated(UAVObject* obj) -{ - GCSTelemetryStats::DataFields stats = telStats->getData(); - if (!autopilotConnectionStatus && stats.Status == GCSTelemetryStats::STATUS_CONNECTED) - onAutopilotConnect(); - else if (autopilotConnectionStatus && stats.Status != GCSTelemetryStats::STATUS_CONNECTED) - onAutopilotDisconnect(); -} - diff --git a/ground/openpilotgcs/src/plugins/hitlv2/simulatorv2.h b/ground/openpilotgcs/src/plugins/hitlv2/simulatorv2.h deleted file mode 100644 index 445358a22..000000000 --- a/ground/openpilotgcs/src/plugins/hitlv2/simulatorv2.h +++ /dev/null @@ -1,222 +0,0 @@ -/** - ****************************************************************************** - * - * @file simulatorv2.h - * @author The OpenPilot Team, http://www.openpilot.org Copyright (C) 2010-2012. - * @addtogroup GCSPlugins GCS Plugins - * @{ - * @addtogroup HITLPlugin HITLv2 Plugin - * @{ - * @brief The Hardware In The Loop plugin version 2 - *****************************************************************************/ -/* - * 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, write to the Free Software Foundation, Inc., - * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ - -#ifndef ISIMULATORV2_H -#define ISIMULATORV2_H - -#include -#include -#include -#include -#include -#include -#include "uavtalk/telemetrymanager.h" -#include "uavobjectmanager.h" -#include "homelocation.h" -#include "accels.h" -#include "gyros.h" -#include "attitudeactual.h" -#include "gpsposition.h" -#include "flightstatus.h" -#include "gcsreceiver.h" -#include "actuatorcommand.h" -#include "gcstelemetrystats.h" -#include "attitudesettings.h" -#include "sonaraltitude.h" - -//#define DBG_TIMERS -#undef DBG_TIMERS - -/** - * just imagine this was a class without methods and all public properties - */ - -typedef struct _CONNECTION -{ - QString simulatorId; - QString hostAddress; - int inPort; - QString remoteAddress; - int outPort; - QString binPath; - QString dataPath; - - bool homeLocation; - quint16 homeLocRate; - - bool attRaw; - quint8 attRawRate; - - bool attActual; - bool attActHW; - bool attActSim; - bool attActCalc; - - bool sonarAltitude; - float sonarMaxAlt; - quint16 sonarAltRate; - - bool gpsPosition; - quint16 gpsPosRate; - - bool inputCommand; - bool gcsReciever; - bool manualControl; - bool manualOutput; - quint8 outputRate; - -} SimulatorSettings; - -class Simulator : public QObject -{ - Q_OBJECT - -public: - Simulator(const SimulatorSettings& params); - virtual ~Simulator(); - - bool isAutopilotConnected() const { return autopilotConnectionStatus; } - bool isSimulatorConnected() const { return simConnectionStatus; } - - QString Name() const { return name; } - void setName(QString str) { name = str; } - - QString SimulatorId() const { return simulatorId; } - void setSimulatorId(QString str) { simulatorId = str; } - - static bool IsStarted() { return isStarted; } - static void setStarted(bool val) { isStarted = val; } - - static QStringList& Instances() { return Simulator::instances; } - static void setInstance(const QString& str) { Simulator::instances.append(str); } - - virtual void stopProcess() {} - virtual void setupUdpPorts(const QString& host, int inPort, int outPort) { Q_UNUSED(host) Q_UNUSED(inPort) Q_UNUSED(outPort)} - -signals: - void processOutput(QString str); - void autopilotConnected(); - void autopilotDisconnected(); - void simulatorConnected(); - void simulatorDisconnected(); - void myStart(); - -public slots: - Q_INVOKABLE virtual bool setupProcess() { return true; } - -private slots: - void onStart(); - void receiveUpdate(); - void onAutopilotConnect(); - void onAutopilotDisconnect(); - void onSimulatorConnectionTimeout(); - void telStatsUpdated(UAVObject* obj); - Q_INVOKABLE void onDeleteSimulator(void); - - virtual void transmitUpdate() = 0; - virtual void processUpdate(const QByteArray& data) = 0; - -protected: - static const float GEE; - static const float FT2M; - static const float KT2MPS; - static const float INHG2KPA; - static const float FPS2CMPS; - static const float DEG2RAD; - static const float RAD2DEG; - -#ifdef DBG_TIMERS - QTime timeRX; - QTime timeTX; -#endif - - QUdpSocket* inSocket; - QUdpSocket* outSocket; - -// ActuatorDesired* actDesired; -// ManualControlCommand* manCtrlCommand; -// VelocityActual* velActual; -// PositionActual* posActual; -// BaroAltitude* altActual; -// CameraDesired *camDesired; -// AccessoryDesired *acsDesired; - Accels *accels; - Gyros *gyros; - AttitudeActual *attActual; - HomeLocation *posHome; - FlightStatus *flightStatus; - GPSPosition *gpsPosition; - GCSReceiver *gcsReceiver; - ActuatorCommand *actCommand; - AttitudeSettings *attSettings; - SonarAltitude *sonarAlt; - - GCSTelemetryStats* telStats; - SimulatorSettings settings; - - QMutex lock; - -private: - int updatePeriod; - int simTimeout; - volatile bool autopilotConnectionStatus; - volatile bool simConnectionStatus; - QTimer* txTimer; - QTimer* simTimer; - QString name; - QString simulatorId; - volatile static bool isStarted; - static QStringList instances; - - void setupObjects(); - void resetAllObjects(); - void setupInputObject(UAVObject* obj, quint32 updateRate); - void setupOutputObject(UAVObject* obj); - void setupWatchedObject(UAVObject *obj); - void setupDefaultObject(UAVObject *obj); -}; - -class SimulatorCreator -{ -public: - SimulatorCreator(QString id, QString descr) : - classId(id), - description(descr) - {} - virtual ~SimulatorCreator() {} - - QString ClassId() const { return classId; } - QString Description() const { return description; } - - virtual Simulator* createSimulator(const SimulatorSettings& params) = 0; - -private: - QString classId; - QString description; -}; - -#endif // ISIMULATORV2_H