|
|
@ -32,6 +32,10 @@ This file is part of the QGROUNDCONTROL project |
|
|
|
#include "ui_SlugsHilSim.h" |
|
|
|
#include "ui_SlugsHilSim.h" |
|
|
|
#include "LinkManager.h" |
|
|
|
#include "LinkManager.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "SlugsMAV.h" |
|
|
|
|
|
|
|
#include "qbytearray.h" |
|
|
|
|
|
|
|
#include "qhostaddress.h" |
|
|
|
|
|
|
|
|
|
|
|
SlugsHilSim::SlugsHilSim(QWidget *parent) : |
|
|
|
SlugsHilSim::SlugsHilSim(QWidget *parent) : |
|
|
|
QWidget(parent), |
|
|
|
QWidget(parent), |
|
|
|
ui(new Ui::SlugsHilSim) |
|
|
|
ui(new Ui::SlugsHilSim) |
|
|
@ -49,6 +53,18 @@ SlugsHilSim::SlugsHilSim(QWidget *parent) : |
|
|
|
connect(rxSocket, SIGNAL(readyRead()), this, SLOT(readDatagram())); |
|
|
|
connect(rxSocket, SIGNAL(readyRead()), this, SLOT(readDatagram())); |
|
|
|
|
|
|
|
|
|
|
|
linksAvailable.clear(); |
|
|
|
linksAvailable.clear(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
memset(&tmpAirData, 0, sizeof(mavlink_air_data_t)); |
|
|
|
|
|
|
|
memset(&tmpAttitudeData, 0, sizeof(mavlink_attitude_t)); |
|
|
|
|
|
|
|
memset(&tmpGpsData, 0, sizeof(mavlink_gps_raw_t)); |
|
|
|
|
|
|
|
memset(&tmpGpsTime, 0, sizeof(mavlink_gps_date_time_t)); |
|
|
|
|
|
|
|
memset(&tmpLocalPositionData, 0, sizeof(mavlink_sensor_bias_t)); |
|
|
|
|
|
|
|
memset(&tmpRawImuData, 0, sizeof(mavlink_raw_imu_t)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
foreach (LinkInterface* link, LinkManager::instance()->getLinks()) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
addToCombo(link); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
SlugsHilSim::~SlugsHilSim() |
|
|
|
SlugsHilSim::~SlugsHilSim() |
|
|
@ -121,6 +137,10 @@ void SlugsHilSim::readDatagram(void){ |
|
|
|
|
|
|
|
|
|
|
|
if (datagram.size() == 113) { |
|
|
|
if (datagram.size() == 113) { |
|
|
|
processHilDatagram(&datagram); |
|
|
|
processHilDatagram(&datagram); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sendMessageToSlugs(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
commandDatagramToSimulink(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
ui->ed_count->setText(QString::number(count++)); |
|
|
|
ui->ed_count->setText(QString::number(count++)); |
|
|
@ -143,11 +163,6 @@ void SlugsHilSim::processHilDatagram(const QByteArray* datagram) |
|
|
|
|
|
|
|
|
|
|
|
mavlink_message_t msg; |
|
|
|
mavlink_message_t msg; |
|
|
|
|
|
|
|
|
|
|
|
// GPS
|
|
|
|
|
|
|
|
mavlink_gps_raw_t tmpGpsRaw; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mavlink_gps_date_time_t tmpGpsTime; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tmpGpsTime.year = datagram->at(i++); |
|
|
|
tmpGpsTime.year = datagram->at(i++); |
|
|
|
tmpGpsTime.month = datagram->at(i++); |
|
|
|
tmpGpsTime.month = datagram->at(i++); |
|
|
|
tmpGpsTime.day = datagram->at(i++); |
|
|
|
tmpGpsTime.day = datagram->at(i++); |
|
|
@ -155,31 +170,73 @@ void SlugsHilSim::processHilDatagram(const QByteArray* datagram) |
|
|
|
tmpGpsTime.min = datagram->at(i++); |
|
|
|
tmpGpsTime.min = datagram->at(i++); |
|
|
|
tmpGpsTime.sec = datagram->at(i++); |
|
|
|
tmpGpsTime.sec = datagram->at(i++); |
|
|
|
|
|
|
|
|
|
|
|
tmpGpsRaw.lat = getFloatFromDatagram(datagram, &i); |
|
|
|
tmpGpsData.lat = getFloatFromDatagram(datagram, &i); |
|
|
|
tmpGpsRaw.lon = getFloatFromDatagram(datagram, &i); |
|
|
|
tmpGpsData.lon = getFloatFromDatagram(datagram, &i); |
|
|
|
tmpGpsRaw.alt = getFloatFromDatagram(datagram, &i); |
|
|
|
tmpGpsData.alt = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
|
|
|
|
tmpGpsRaw.hdg = getUint16FromDatagram(datagram, &i); |
|
|
|
tmpGpsData.hdg = getUint16FromDatagram(datagram, &i); |
|
|
|
tmpGpsRaw.v = getUint16FromDatagram(datagram, &i); |
|
|
|
tmpGpsData.v = getUint16FromDatagram(datagram, &i); |
|
|
|
tmpGpsRaw.eph = getUint16FromDatagram(datagram, &i); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tmpGpsRaw.fix_type = datagram->at(i++); |
|
|
|
tmpGpsData.eph = getUint16FromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpGpsData.fix_type = datagram->at(i++); |
|
|
|
tmpGpsTime.visSat = datagram->at(i++); |
|
|
|
tmpGpsTime.visSat = datagram->at(i++); |
|
|
|
|
|
|
|
i++; |
|
|
|
|
|
|
|
|
|
|
|
mavlink_msg_gps_date_time_encode(MG::SYSTEM::ID,MG::SYSTEM::COMPID, &msg, &tmpGpsTime); |
|
|
|
tmpAirData.dynamicPressure= getFloatFromDatagram(datagram, &i); |
|
|
|
activeUas->sendMessage(hilLink, msg); |
|
|
|
tmpAirData.staticPressure= getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpAirData.temperature= getUint16FromDatagram(datagram, &i); |
|
|
|
|
|
|
|
|
|
|
|
memset(&msg, 0, sizeof(mavlink_message_t)); |
|
|
|
// TODO Salto en el Datagrama
|
|
|
|
|
|
|
|
i=i+8; |
|
|
|
|
|
|
|
|
|
|
|
mavlink_msg_gps_raw_encode(MG::SYSTEM::ID,MG::SYSTEM::COMPID, &msg, &tmpGpsRaw); |
|
|
|
tmpRawImuData.xgyro = getUint16FromDatagram(datagram, &i); |
|
|
|
activeUas->sendMessage(hilLink,msg); |
|
|
|
tmpRawImuData.ygyro = getUint16FromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpRawImuData.zgyro = getUint16FromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpRawImuData.xacc = getUint16FromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpRawImuData.yacc = getUint16FromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpRawImuData.zacc = getUint16FromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpRawImuData.xmag = getUint16FromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpRawImuData.ymag = getUint16FromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpRawImuData.zmag = getUint16FromDatagram(datagram, &i); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tmpAttitudeData.roll = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpAttitudeData.pitch = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpAttitudeData.yaw = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tmpAttitudeData.rollspeed = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpAttitudeData.pitchspeed = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpAttitudeData.yawspeed = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// TODO Crear Paquete SYNC TIME
|
|
|
|
|
|
|
|
i=i+2; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
tmpLocalPositionData.x = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpLocalPositionData.y = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpLocalPositionData.z = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpLocalPositionData.vx = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpLocalPositionData.vy = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
tmpLocalPositionData.vz = getFloatFromDatagram(datagram, &i); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// mavlink_msg_gps_date_time_encode(MG::SYSTEM::ID,MG::SYSTEM::COMPID, &msg, &tmpGpsTime);
|
|
|
|
|
|
|
|
// activeUas->sendMessage(hilLink, msg);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// memset(&msg, 0, sizeof(mavlink_message_t));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// mavlink_msg_gps_raw_encode(MG::SYSTEM::ID,MG::SYSTEM::COMPID, &msg, &tmpGpsRaw);
|
|
|
|
|
|
|
|
// activeUas->sendMessage(hilLink,msg);
|
|
|
|
|
|
|
|
|
|
|
|
// TODO: this is legacy of old HIL datagram. Need to remove from Simulink model
|
|
|
|
// TODO: this is legacy of old HIL datagram. Need to remove from Simulink model
|
|
|
|
i++; |
|
|
|
i++; |
|
|
|
|
|
|
|
|
|
|
|
ui->ed_1->setText(QString::number(tmpGpsRaw.hdg)); |
|
|
|
ui->ed_1->setText(QString::number(tmpRawImuData.xacc)); |
|
|
|
ui->ed_2->setText(QString::number(tmpGpsRaw.v)); |
|
|
|
ui->ed_2->setText(QString::number(tmpRawImuData.yacc)); |
|
|
|
ui->ed_3->setText(QString::number(tmpGpsRaw.eph)); |
|
|
|
ui->ed_3->setText(QString::number(tmpRawImuData.zacc)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ui->tbA->setText(QString::number(tmpRawImuData.xgyro)); |
|
|
|
|
|
|
|
ui->tbB->setText(QString::number(tmpRawImuData.ygyro)); |
|
|
|
|
|
|
|
ui->tbC->setText(QString::number(tmpRawImuData.zgyro)); |
|
|
|
|
|
|
|
|
|
|
|
#else |
|
|
|
#else |
|
|
|
Q_UNUSED(datagram); |
|
|
|
Q_UNUSED(datagram); |
|
|
|
#endif |
|
|
|
#endif |
|
|
@ -209,9 +266,93 @@ uint16_t SlugsHilSim::getUint16FromDatagram (const QByteArray* datagram, unsigne |
|
|
|
void SlugsHilSim::linkSelected(int cbIndex){ |
|
|
|
void SlugsHilSim::linkSelected(int cbIndex){ |
|
|
|
#ifdef MAVLINK_ENABLED_SLUGS |
|
|
|
#ifdef MAVLINK_ENABLED_SLUGS |
|
|
|
// HIL code to go here...
|
|
|
|
// HIL code to go here...
|
|
|
|
//hilLink = linksAvailable
|
|
|
|
//hilLink = linksAvailable
|
|
|
|
Q_UNUSED(cbIndex); |
|
|
|
// FIXME Mariano
|
|
|
|
#else |
|
|
|
|
|
|
|
Q_UNUSED(cbIndex); |
|
|
|
hilLink = LinkManager::instance()->getLinkForId(cbIndex); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SlugsHilSim::sendMessageToSlugs() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
mavlink_message_t msg; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mavlink_msg_local_position_encode(MG::SYSTEM::ID, |
|
|
|
|
|
|
|
MG::SYSTEM::COMPID, |
|
|
|
|
|
|
|
&msg, |
|
|
|
|
|
|
|
&tmpLocalPositionData); |
|
|
|
|
|
|
|
activeUas->sendMessage(hilLink, msg); |
|
|
|
|
|
|
|
memset(&msg, 0, sizeof(mavlink_message_t)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mavlink_msg_attitude_encode(MG::SYSTEM::ID, |
|
|
|
|
|
|
|
MG::SYSTEM::COMPID, |
|
|
|
|
|
|
|
&msg, |
|
|
|
|
|
|
|
&tmpAttitudeData); |
|
|
|
|
|
|
|
activeUas->sendMessage(hilLink, msg); |
|
|
|
|
|
|
|
memset(&msg, 0, sizeof(mavlink_message_t)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mavlink_msg_raw_imu_encode(MG::SYSTEM::ID, |
|
|
|
|
|
|
|
MG::SYSTEM::COMPID, |
|
|
|
|
|
|
|
&msg, |
|
|
|
|
|
|
|
&tmpRawImuData); |
|
|
|
|
|
|
|
activeUas->sendMessage(hilLink, msg); |
|
|
|
|
|
|
|
memset(&msg, 0, sizeof(mavlink_message_t)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mavlink_msg_air_data_encode(MG::SYSTEM::ID, |
|
|
|
|
|
|
|
MG::SYSTEM::COMPID, |
|
|
|
|
|
|
|
&msg, |
|
|
|
|
|
|
|
&tmpAirData); |
|
|
|
|
|
|
|
activeUas->sendMessage(hilLink, msg); |
|
|
|
|
|
|
|
memset(&msg, 0, sizeof(mavlink_message_t)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mavlink_msg_gps_raw_encode(MG::SYSTEM::ID, |
|
|
|
|
|
|
|
MG::SYSTEM::COMPID, |
|
|
|
|
|
|
|
&msg, |
|
|
|
|
|
|
|
&tmpGpsData); |
|
|
|
|
|
|
|
activeUas->sendMessage(hilLink, msg); |
|
|
|
|
|
|
|
memset(&msg, 0, sizeof(mavlink_message_t)); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mavlink_msg_gps_date_time_encode(MG::SYSTEM::ID, |
|
|
|
|
|
|
|
MG::SYSTEM::COMPID, |
|
|
|
|
|
|
|
&msg, |
|
|
|
|
|
|
|
&tmpGpsTime); |
|
|
|
|
|
|
|
activeUas->sendMessage(hilLink, msg); |
|
|
|
|
|
|
|
memset(&msg, 0, sizeof(mavlink_message_t)); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SlugsHilSim::commandDatagramToSimulink() |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
//mavlink_pwm_commands_t* pwdC = (static_cast<SlugsMAV*>(activeUas))->getPwmCommands();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mavlink_pwm_commands_t* pwdC; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(pwdC != NULL){ |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
QByteArray data; |
|
|
|
|
|
|
|
data.resize(22); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
unsigned char i=0; |
|
|
|
|
|
|
|
setUInt16ToDatagram(data, &i, 1);//pwdC->dt_c);
|
|
|
|
|
|
|
|
setUInt16ToDatagram(data, &i, 2);//pwdC->dla_c);
|
|
|
|
|
|
|
|
setUInt16ToDatagram(data, &i, 3);//pwdC->dra_c);
|
|
|
|
|
|
|
|
setUInt16ToDatagram(data, &i, 4);//pwdC->dr_c);
|
|
|
|
|
|
|
|
setUInt16ToDatagram(data, &i, 5);//pwdC->dle_c);
|
|
|
|
|
|
|
|
setUInt16ToDatagram(data, &i, 6);//pwdC->dre_c);
|
|
|
|
|
|
|
|
setUInt16ToDatagram(data, &i, 7);//pwdC->dlf_c);
|
|
|
|
|
|
|
|
setUInt16ToDatagram(data, &i, 8);//pwdC->drf_c);
|
|
|
|
|
|
|
|
setUInt16ToDatagram(data, &i, 9);//pwdC->aux1);
|
|
|
|
|
|
|
|
setUInt16ToDatagram(data, &i, 10);//pwdC->aux2);
|
|
|
|
|
|
|
|
setUInt16ToDatagram(data, &i, 11);//value default
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
txSocket->writeDatagram(data, QHostAddress::Broadcast, ui->ed_txPort->text().toInt()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SlugsHilSim::setUInt16ToDatagram(QByteArray& datagram, unsigned char* pos, uint16_t value) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
tUint16ToChar tmpUnion; |
|
|
|
|
|
|
|
tmpUnion.uiData= value; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
datagram[(*pos)++]= tmpUnion.chData[0]; |
|
|
|
|
|
|
|
datagram[(*pos)++]= tmpUnion.chData[1]; |
|
|
|
} |
|
|
|
} |
|
|
|