Browse Source

Merge branch 'master' of pixhawk.ethz.ch:groundcontrol

QGC4.4
pixhawk 15 years ago
parent
commit
64c3c5622b
  1. 3
      .gitignore
  2. BIN
      lib/flite/linux32/libflite_cmu_time_awb.a
  3. BIN
      lib/flite/linux32/libflite_cmu_us_awb.a
  4. BIN
      lib/flite/linux32/libflite_cmu_us_kal.a
  5. BIN
      lib/flite/linux32/libflite_cmu_us_kal16.a
  6. 11
      qgroundcontrol.pri
  7. 2
      qgroundcontrol.pro
  8. 37
      src/GAudioOutput.cc
  9. 6
      src/GAudioOutput.h
  10. 74
      src/ui/HUD.cc

3
.gitignore vendored

@ -15,5 +15,6 @@ qrc_*.cpp
tmp tmp
debug debug
release release
qgroundcontrol *.wav
qgroundcontrol.xcodeproj/** qgroundcontrol.xcodeproj/**
qgroundcontrol

BIN
lib/flite/linux32/libflite_cmu_time_awb.a

Binary file not shown.

BIN
lib/flite/linux32/libflite_cmu_us_awb.a

Binary file not shown.

BIN
lib/flite/linux32/libflite_cmu_us_kal.a

Binary file not shown.

BIN
lib/flite/linux32/libflite_cmu_us_kal16.a

Binary file not shown.

11
mavground.pri → qgroundcontrol.pri

@ -40,11 +40,6 @@ OBJECTS_DIR = $$BUILDDIR/obj
MOC_DIR = $$BUILDDIR/moc MOC_DIR = $$BUILDDIR/moc
UI_HEADERS_DIR = src/ui/generated UI_HEADERS_DIR = src/ui/generated
# Add external libraries
INCLUDEPATH += $$BASEDIR/lib/flite/include \
$$BASEDIR/lib/flite/lang
#$$BASEDIR/lib/qextserialport/include #$$BASEDIR/lib/qextserialport/include
# $$BASEDIR/lib/openjaus/libjaus/include \ # $$BASEDIR/lib/openjaus/libjaus/include \
# $$BASEDIR/lib/openjaus/libopenJaus/include # $$BASEDIR/lib/openjaus/libopenJaus/include
@ -99,7 +94,10 @@ linux-g++ {
release { release {
DESTDIR = $$BASEDIR DESTDIR = $$BASEDIR
} }
INCLUDEPATH += /usr/include INCLUDEPATH += /usr/include \
$$BASEDIR/lib/flite/include \
$$BASEDIR/lib/flite/lang
HARDWARE_PLATFORM = $$system(uname -a) HARDWARE_PLATFORM = $$system(uname -a)
contains( HARDWARE_PLATFORM, x86_64 ) { contains( HARDWARE_PLATFORM, x86_64 ) {
@ -114,7 +112,6 @@ linux-g++ {
message(Building for GNU/Linux 32bit/i386) message(Building for GNU/Linux 32bit/i386)
} }
LIBS += -lm \ LIBS += -lm \
-lflite_cmu_us_awb \
-lflite_cmu_us_rms \ -lflite_cmu_us_rms \
-lflite_cmu_us_slt \ -lflite_cmu_us_slt \
-lflite_usenglish \ -lflite_usenglish \

2
mavground.pro → qgroundcontrol.pro

@ -1,5 +1,5 @@
# Include general settings for MAVGround # Include general settings for MAVGround
include(mavground.pri) include(qgroundcontrol.pri)
# Include serial port library # Include serial port library
include(src/lib/qextserialport/qextserialport.pri) include(src/lib/qextserialport/qextserialport.pri)

37
src/GAudioOutput.cc

@ -54,8 +54,8 @@ extern "C" {
//#include <cmu_us_slt/voxdefs.h> //#include <cmu_us_slt/voxdefs.h>
//cst_voice *REGISTER_VOX(const char *voxdir); //cst_voice *REGISTER_VOX(const char *voxdir);
//void UNREGISTER_VOX(cst_voice *vox); //void UNREGISTER_VOX(cst_voice *vox);
cst_voice *register_cmu_us_awb(const char *voxdir); //cst_voice *register_cmu_us_awb(const char *voxdir);
void unregister_cmu_us_awb(cst_voice *vox); //void unregister_cmu_us_awb(cst_voice *vox);
cst_voice *register_cmu_us_slt(const char *voxdir); cst_voice *register_cmu_us_slt(const char *voxdir);
void unregister_cmu_us_slt(cst_voice *vox); void unregister_cmu_us_slt(cst_voice *vox);
cst_voice *register_cmu_us_rms(const char *voxdir); cst_voice *register_cmu_us_rms(const char *voxdir);
@ -92,9 +92,12 @@ emergency(false)
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX
flite_init(); flite_init();
#endif #endif
// Initialize audio output
m_media = new Phonon::MediaObject(this); m_media = new Phonon::MediaObject(this);
Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this); Phonon::AudioOutput *audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
createPath(m_media, audioOutput); createPath(m_media, audioOutput);
// Prepare regular emergency signal, will be fired off on calling startEmergency()
emergencyTimer = new QTimer(); emergencyTimer = new QTimer();
connect(emergencyTimer, SIGNAL(timeout()), this, SLOT(beep())); connect(emergencyTimer, SIGNAL(timeout()), this, SLOT(beep()));
@ -103,11 +106,8 @@ emergency(false)
case 0: case 0:
selectFemaleVoice(); selectFemaleVoice();
break; break;
case 1:
selectMaleVoice();
break;
default: default:
selectNeutralVoice(); selectMaleVoice();
break; break;
} }
} }
@ -133,7 +133,6 @@ bool GAudioOutput::say(QString text, int severity)
// file.fileName() returns the unique file name // file.fileName() returns the unique file name
cst_wave_save(wav, file.fileName().toStdString().c_str(), "riff"); cst_wave_save(wav, file.fileName().toStdString().c_str(), "riff");
m_media->setCurrentSource(Phonon::MediaSource(file.fileName().toStdString().c_str())); m_media->setCurrentSource(Phonon::MediaSource(file.fileName().toStdString().c_str()));
qDebug() << "TYPE:" << m_media->currentSource().type();
m_media->play(); m_media->play();
qDebug() << "Synthesized: " << text << ", tmp file:" << file.fileName().toStdString().c_str(); qDebug() << "Synthesized: " << text << ", tmp file:" << file.fileName().toStdString().c_str();
res = true; res = true;
@ -150,10 +149,6 @@ bool GAudioOutput::say(QString text, int severity)
SpeakString(str2); SpeakString(str2);
qDebug() << "Synthesized: " << text.toAscii(); qDebug() << "Synthesized: " << text.toAscii();
#endif #endif
#ifdef Q_OS_WIN32
qDebug() << "Synthesized: " << text << ", NO OUTPUT SUPPORT ON WINDOWS!";
#endif
} }
return res; return res;
} }
@ -228,28 +223,25 @@ void GAudioOutput::beep()
void GAudioOutput::selectFemaleVoice() void GAudioOutput::selectFemaleVoice()
{ {
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX
//this->voice = register_cmu_us_slt(NULL); this->voice = register_cmu_us_slt(NULL);
#endif #endif
} }
void GAudioOutput::selectMaleVoice() void GAudioOutput::selectMaleVoice()
{ {
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX
//this->voice = register_cmu_us_rms(NULL); this->voice = register_cmu_us_rms(NULL);
#endif #endif
} }
/*
void GAudioOutput::selectNeutralVoice() void GAudioOutput::selectNeutralVoice()
{ {
#ifdef Q_OS_LINUX #ifdef Q_OS_LINUX
//this->voice = register_cmu_us_awb(NULL); this->voice = register_cmu_us_awb(NULL);
#endif #endif
} }*/
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
QStringList GAudioOutput::listVoices(void) QStringList GAudioOutput::listVoices(void)
{ {
QStringList l; QStringList l;
@ -258,7 +250,7 @@ extern "C" {
const cst_val *v; const cst_val *v;
/*
printf("Voices available: "); printf("Voices available: ");
for (v=flite_voice_list; v; v=val_cdr(v)) for (v=flite_voice_list; v; v=val_cdr(v))
{ {
@ -269,11 +261,8 @@ extern "C" {
l.append(s); l.append(s);
} }
printf("\n"); printf("\n");
*/
#endif #endif
return l; return l;
} }
#ifdef __cplusplus
}
#endif /* __cplusplus */

6
src/GAudioOutput.h

@ -65,6 +65,10 @@ public:
static GAudioOutput* instance(); static GAudioOutput* instance();
/** @brief List available voices */ /** @brief List available voices */
QStringList listVoices(void); QStringList listVoices(void);
enum {
VOICE_MALE = 0,
VOICE_FEMALE
} QGVoice;
public slots: public slots:
/** @brief Say this text if current output priority matches */ /** @brief Say this text if current output priority matches */
@ -79,8 +83,6 @@ public slots:
void selectFemaleVoice(); void selectFemaleVoice();
/** @brief Select male voice */ /** @brief Select male voice */
void selectMaleVoice(); void selectMaleVoice();
/** @brief Select neutral voice */
void selectNeutralVoice();
/** @brief Play emergency sound */ /** @brief Play emergency sound */
void beep(); void beep();

74
src/ui/HUD.cc

@ -449,13 +449,12 @@ void HUD::paintText(QString text, QColor color, float fontSize, float refX, floa
void HUD::initializeGL() void HUD::initializeGL()
{ {
glEnable(GL_MULTISAMPLE);
bool antialiasing = true; bool antialiasing = true;
// Antialiasing setup // Antialiasing setup
if(antialiasing) if(antialiasing)
{ {
glEnable(GL_MULTISAMPLE);
glEnable(GL_BLEND); glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
@ -468,9 +467,9 @@ void HUD::initializeGL()
} }
else else
{ {
glDisable(GL_BLEND); //glDisable(GL_BLEND);
glDisable(GL_POINT_SMOOTH); //glDisable(GL_POINT_SMOOTH);
glDisable(GL_LINE_SMOOTH); //glDisable(GL_LINE_SMOOTH);
} }
} }
@ -513,6 +512,7 @@ void HUD::paintRollPitchStrips()
void HUD::paintGL() void HUD::paintGL()
{ {
// Read out most important values to limit hash table lookups // Read out most important values to limit hash table lookups
float roll = roll * 0.5 + 0.5 * values.value("roll", 0.0f); float roll = roll * 0.5 + 0.5 * values.value("roll", 0.0f);
float pitch = pitch * 0.5 + 0.5 * values.value("pitch", 0.0f); float pitch = pitch * 0.5 + 0.5 * values.value("pitch", 0.0f);
@ -527,7 +527,7 @@ void HUD::paintGL()
double scalingFactorH = this->height()/vheight; double scalingFactorH = this->height()/vheight;
if (scalingFactorH < scalingFactor) scalingFactor = scalingFactorH; if (scalingFactorH < scalingFactor) scalingFactor = scalingFactorH;
makeCurrent(); //makeCurrent();
glClear(GL_COLOR_BUFFER_BIT); glClear(GL_COLOR_BUFFER_BIT);
//if(!noCamera) glDrawPixels(glImage.width(), glImage.height(), GL_RGBA, GL_UNSIGNED_BYTE, glImage.bits()); //if(!noCamera) glDrawPixels(glImage.width(), glImage.height(), GL_RGBA, GL_UNSIGNED_BYTE, glImage.bits());
glDrawPixels(glImage.width(), glImage.height(), GL_RGBA, GL_UNSIGNED_BYTE, glImage.bits()); // FIXME Remove after testing glDrawPixels(glImage.width(), glImage.height(), GL_RGBA, GL_UNSIGNED_BYTE, glImage.bits()); // FIXME Remove after testing
@ -536,22 +536,7 @@ void HUD::paintGL()
// Blue / Brown background // Blue / Brown background
if (noCamera) paintCenterBackground(roll, pitch, yaw); if (noCamera) paintCenterBackground(roll, pitch, yaw);
glFlush(); //glFlush();
// Draw instruments
// TESTING THIS SHOULD BE MOVED INTO A QGRAPHICSVIEW
/*
QPainter painter(this);
painter.setRenderHint(QPainter::HighQualityAntialiasing);
const float gaugeWidth = 15.0f;
const QColor gaugeColor = QColor(200, 200, 200);
drawSystemIndicator(vwidth+10.0f-gaugeWidth/2.0f, 20.0f, 10.0f, 40.0f, 15.0f, &painter);
drawGauge(vwidth+10.0f, 50.0f, gaugeWidth/2.0f, 0, 1.0f, "thrust", values.value("thrust", 0.0f), gaugeColor, &painter, qMakePair(0.45f, 0.8f), qMakePair(0.8f, 1.0f), true);
drawGauge(vwidth+10.0f+gaugeWidth*1.7f, 50.0f, gaugeWidth/2.0f, 0, 10.0f, "altitude", values.value("altitude", 0.0f), gaugeColor, &painter, qMakePair(1.0f, 2.5f), qMakePair(0.0f, 0.5f), true);
*/
// END TESTING
// // Store current GL model view // // Store current GL model view
// glMatrixMode(GL_MODELVIEW); // glMatrixMode(GL_MODELVIEW);
@ -571,7 +556,7 @@ void HUD::paintGL()
QPainter painter(this); QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true); painter.setRenderHint(QPainter::Antialiasing, true);
painter.setRenderHint(QPainter::HighQualityAntialiasing, true); //painter.setRenderHint(QPainter::HighQualityAntialiasing, true);
painter.translate((this->vwidth/2.0+xCenterOffset)*scalingFactor, (this->vheight/2.0+yCenterOffset)*scalingFactor); painter.translate((this->vwidth/2.0+xCenterOffset)*scalingFactor, (this->vheight/2.0+yCenterOffset)*scalingFactor);
// COORDINATE FRAME IS NOW (0,0) at CENTER OF WIDGET // COORDINATE FRAME IS NOW (0,0) at CENTER OF WIDGET
@ -603,6 +588,8 @@ void HUD::paintGL()
painter.setPen(defaultColor); painter.setPen(defaultColor);
painter.drawPolyline(yawIndicator); painter.drawPolyline(yawIndicator);
// CENTER
// HEADING INDICATOR // HEADING INDICATOR
// //
// __ __ // __ __
@ -624,6 +611,23 @@ void HUD::paintGL()
painter.drawPolyline(hIndicator); painter.drawPolyline(hIndicator);
// SETPOINT
const float centerWidth = 4.0f;
painter.setPen(defaultColor);
painter.setBrush(Qt::NoBrush);
// TODO
//painter.drawEllipse(QPointF(refToScreenX(qMin(10.0f, values.value("roll desired", 0.0f) * 10.0f)), refToScreenY(qMin(10.0f, values.value("pitch desired", 0.0f) * 10.0f))), refToScreenX(centerWidth/2.0f), refToScreenX(centerWidth/2.0f));
const float centerCrossWidth = 10.0f;
// left
painter.drawLine(QPointF(refToScreenX(-centerWidth / 2.0f), refToScreenY(0.0f)), QPointF(refToScreenX(-centerCrossWidth / 2.0f), refToScreenY(0.0f)));
// right
painter.drawLine(QPointF(refToScreenX(centerWidth / 2.0f), refToScreenY(0.0f)), QPointF(refToScreenX(centerCrossWidth / 2.0f), refToScreenY(0.0f)));
// top
painter.drawLine(QPointF(refToScreenX(0.0f), refToScreenY(-centerWidth / 2.0f)), QPointF(refToScreenX(0.0f), refToScreenY(-centerCrossWidth / 2.0f)));
// COMPASS // COMPASS
const float compassY = -vheight/2.0f + 10.0f; const float compassY = -vheight/2.0f + 10.0f;
QRectF compassRect(QPointF(refToScreenX(-5.0f), refToScreenY(compassY)), QSizeF(refToScreenX(10.0f), refToScreenY(5.0f))); QRectF compassRect(QPointF(refToScreenX(-5.0f), refToScreenY(compassY)), QSizeF(refToScreenX(10.0f), refToScreenY(5.0f)));
@ -656,8 +660,6 @@ void HUD::paintGL()
// MOVING PARTS // MOVING PARTS
// Translate for yaw // Translate for yaw
const float maxYawTrans = 60.0f; const float maxYawTrans = 60.0f;
float yawDiff = valuesDot.value("yaw", 0.0f); float yawDiff = valuesDot.value("yaw", 0.0f);
@ -675,7 +677,7 @@ void HUD::paintGL()
yawInt *= 0.6f; yawInt *= 0.6f;
//qDebug() << "yaw translation" << yawTrans << "integral" << yawInt << "difference" << yawDiff << "yaw" << yaw << "asin(yawInt)" << asinYaw; //qDebug() << "yaw translation" << yawTrans << "integral" << yawInt << "difference" << yawDiff << "yaw" << yaw << "asin(yawInt)" << asinYaw;
painter.translate(0, (pitch/M_PI)* -180.0f * refToScreenY(2.0f)); painter.translate(0, (pitch/M_PI)* -180.0f * refToScreenY(1.8));
painter.translate(refToScreenX(yawTrans), 0); painter.translate(refToScreenX(yawTrans), 0);
@ -684,25 +686,7 @@ void HUD::paintGL()
// Rotate view and draw all roll-dependent indicators // Rotate view and draw all roll-dependent indicators
painter.rotate((roll/M_PI)* -180.0f); painter.rotate((roll/M_PI)* -180.0f);
qDebug() << "ROLL" << roll << "PITCH" << pitch << "YAW DIFF" << valuesDot.value("roll", 0.0f); //qDebug() << "ROLL" << roll << "PITCH" << pitch << "YAW DIFF" << valuesDot.value("roll", 0.0f);
// CENTER
// SETPOINT
const float centerWidth = 4.0f;
painter.setPen(defaultColor);
painter.setBrush(Qt::NoBrush);
// TODO
//painter.drawEllipse(QPointF(refToScreenX(qMin(10.0f, values.value("roll desired", 0.0f) * 10.0f)), refToScreenY(qMin(10.0f, values.value("pitch desired", 0.0f) * 10.0f))), refToScreenX(centerWidth/2.0f), refToScreenX(centerWidth/2.0f));
const float centerCrossWidth = 10.0f;
// left
painter.drawLine(QPointF(refToScreenX(-centerWidth / 2.0f), refToScreenY(0.0f)), QPointF(refToScreenX(-centerCrossWidth / 2.0f), refToScreenY(0.0f)));
// right
painter.drawLine(QPointF(refToScreenX(centerWidth / 2.0f), refToScreenY(0.0f)), QPointF(refToScreenX(centerCrossWidth / 2.0f), refToScreenY(0.0f)));
// top
painter.drawLine(QPointF(refToScreenX(0.0f), refToScreenY(-centerWidth / 2.0f)), QPointF(refToScreenX(0.0f), refToScreenY(-centerCrossWidth / 2.0f)));
// PITCH // PITCH

Loading…
Cancel
Save