完成了升降速率和顶部状态

This commit is contained in:
2020-01-14 20:02:07 +08:00
parent a96e9c3b07
commit 466b08de1f
3 changed files with 361 additions and 95 deletions
+335 -51
View File
@@ -66,7 +66,12 @@ Cockpit::Cockpit(QWidget *parent): QWidget(parent)
m_StatusColor = QColor("#00FF00");
m_WColor = QColor("#458B00");
m_WColor = QColor("#000000");
m_SPD_HOLD = "V/S";
m_HDG_HOLD = "HDG_HOLD";
m_ALT_HOLD = "SPD_HOLD";
//setMinimumSize(QSize(10, 10));
@@ -76,22 +81,24 @@ Cockpit::Cockpit(QWidget *parent): QWidget(parent)
//初始化完成后打开定时器开始计数刷新
UpdateTimer = new QTimer;
//UpdateTimer = new QTimer;
connect(UpdateTimer,SIGNAL(timeout()),
this,SLOT(UpdateTimeout()));
//connect(UpdateTimer,SIGNAL(timeout()),
// this,SLOT(UpdateTimeout()));
UpdateTimer->start(1000);
//UpdateTimer->start(1000);
}
Cockpit::~Cockpit()
{
/*
if(UpdateTimer->isActive())
{
UpdateTimer->stop();
UpdateTimer->deleteLater();
}
*/
}
@@ -111,13 +118,6 @@ void Cockpit::mouseReleaseEvent(QMouseEvent *e)
void Cockpit::mousePressEvent(QMouseEvent *e)
{
qDebug() << "press" << e;
m_LedColor = Qt::blue;
m_c = this->pos();
//setPitch(m_Attitude.pitch + e->x());
update();
}
@@ -138,16 +138,22 @@ void Cockpit::wheelEvent(QWheelEvent *e)
setAirSpeed(m_Attitude.airspeed +0.1f * e->angleDelta().y()/120.0f);
setGPSAltitude(m_GPS.altitude + 5.2f * e->angleDelta().y()/120.0f);
m_Target.altitude = 60;
m_Target.altitude += 120* e->angleDelta().y()/120.0f;;
m_Target.airspeed = 20;//0.1f * e->angleDelta().y()/120.0f;
m_Target.airspeed += 0.5f * e->angleDelta().y()/120.0f;;//0.1f * e->angleDelta().y()/120.0f;
m_Target.pitch += 0.2f * e->angleDelta().y()/120.0f;;
m_Target.yaw += 0.2f * e->angleDelta().y()/120.0f;
m_Attitude.distofly += 0.2f * e->angleDelta().y()/120.0f;
m_Target.verticalspeed += 0.1f * e->angleDelta().y()/120.0f;
m_Attitude.verticalspeed += 0.2f * e->angleDelta().y()/120.0f;
//qDebug() << "wheel event" << m_Attitude.roll << m_Attitude.pitch << m_Attitude.yaw << m_Target.airspeed;
update();
@@ -258,14 +264,16 @@ void Cockpit::setLed(QColor LED)
void Cockpit::paintEvent(QPaintEvent *)
{
float scale = 2500.0f;
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); /* 使用反锯齿(如果可用) */
painter.setRenderHint(QPainter::TextAntialiasing);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.translate(width() / 2, 2* height() / 6); /* 坐标变换为窗体中心 */
painter.translate(width() / 2, 4* height() / 10); /* 坐标变换为窗体中心 */
int side = qMin(width(), height()); /* 这一句决定了这个模块只能是方形 */
painter.scale(side / 2000.0, side / 2000.0); /* 比例缩放 */
painter.scale(side / scale, side / scale); /* 比例缩放 */
painter.setPen(Qt::NoPen);
//全局设置字体
@@ -285,8 +293,12 @@ void Cockpit::paintEvent(QPaintEvent *)
drawLeftScale(&painter);
drawRightScale(&painter);
drawVRate(&painter);
drawYawScale(&painter);
drawTopStatuts(&painter);
//drawCenterLine(&painter);
//drawText(&painter);
//drawGPS(&painter);
@@ -380,6 +392,68 @@ void Cockpit::drawPitch(QPainter *painter)
}
painter->restore();
painter->save();
//中间 两块黑块
static const QPointF points1[6] = {
QPointF(-475, 0),
QPointF(-275, 0),
QPointF(-275, 50),
QPointF(-300, 50),
QPointF(-300, 25),
QPointF(-475, 25)
};
static const QPointF points2[6] = {
QPointF(475, 0),
QPointF(275, 0),
QPointF(275, 50),
QPointF(300, 50),
QPointF(300, 25),
QPointF(475, 25)
};
QPen pen;
pen.setWidth(10);
pen.setColor(m_CurrentColor);
painter->setPen(pen);
painter->setBrush(QColor("#000000"));
painter->drawPolygon(points1, 6);
painter->drawPolygon(points2, 6);
painter->restore();
//画目标值
painter->save();
float tar_y = (m_Attitude.pitch - m_Target.pitch)/45.0f * 1000;
//qDebug() << "tar_y" << tar_y;
tar_y = (tar_y > 475)?(475):((tar_y<-525)?(-525):(tar_y));
painter->translate(0,tar_y);
static const QPointF PitchPoints_L[4] = {
QPointF(-275, 0),
QPointF(-300, 0),
QPointF(-300, 50),
QPointF(-275, 50),
};
static const QPointF PitchPoints_R[4] = {
QPointF( 275, 0),
QPointF( 300, 0),
QPointF( 300, 50),
QPointF( 275, 50),
};
pen.setWidth(10);
pen.setColor(m_TargetColor);
painter->setPen(pen);
//painter->setBrush(m_TargetColor);
painter->drawPolygon(PitchPoints_L,4);
painter->drawPolygon(PitchPoints_R,4);
painter->restore();
//画黑色背景
painter->save();
@@ -411,20 +485,31 @@ void Cockpit::drawRoll(QPainter *painter)
painter->rotate(m_Attitude.roll);
//画绿色W和顶部滚转
static const QPointF W_Line[7] = {
QPointF(-300, 0),
QPointF(-150, 0),
QPointF(-100, 0),
QPointF(-50, 100),
QPointF( 0,0),
QPointF( 50, 100),
QPointF( 100, 0),
QPointF( 300, 0)
QPointF( 150, 0)
};
QPen pen;
pen.setWidth(10);
pen.setColor(m_WColor);
pen.setCapStyle(Qt::RoundCap);
pen.setWidth(30);
pen.setColor(m_CentreLineColor);
painter->setPen(pen);
painter->drawPolyline(W_Line,7);
pen.setWidth(10);
pen.setColor(m_WColor);
painter->setPen(pen);
painter->drawPolyline(W_Line,7);
//画白色小三角形
static const QPointF points2[3] = {
QPointF(-30,-500),
@@ -475,31 +560,6 @@ void Cockpit::drawRollScale(QPainter *painter)
painter->setFont(font);
painter->drawArc(-450,-450,900,900,30*16,120*16);
//中间 两块黑块
static const QPointF points1[6] = {
QPointF(-475, 0),
QPointF(-275, 0),
QPointF(-275, 50),
QPointF(-300, 50),
QPointF(-300, 25),
QPointF(-475, 25)
};
static const QPointF points2[6] = {
QPointF(475, 0),
QPointF(275, 0),
QPointF(275, 50),
QPointF(300, 50),
QPointF(300, 25),
QPointF(475, 25)
};
painter->setBrush(QColor("#000000"));
painter->drawPolygon(points1, 6);
painter->drawPolygon(points2, 6);
//大刻度盘
for(int i = -60;i<=60;i+=10)
@@ -807,8 +867,22 @@ void Cockpit::drawLeftScale(QPainter *painter)
painter->restore();
//画顶部的目标值
painter->save();
painter->restore();
ePen.setColor(m_TargetColor);
ePen.setWidth(15);
font.setPixelSize(100);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
painter->setFont(font);
painter->drawText(QRect(0,-720,300,120),Qt::AlignRight|Qt::AlignVCenter,QString::number(m_Target.airspeed,'f',0));
painter->restore();//画顶部目标值结束
painter->restore();//全部结束
}
@@ -909,6 +983,22 @@ void Cockpit::drawRightScale(QPainter *painter)
painter->restore();
//画顶部目标值
painter->save();
ePen.setColor(m_TargetColor);
ePen.setWidth(15);
font.setPixelSize(100);
font.setWeight(QFont::ExtraLight);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
painter->setFont(font);
painter->drawText(QRect(0,-720,330,100),Qt::AlignLeft|Qt::AlignVCenter,QString::number(m_Target.altitude,'f',0));
painter->restore();
//画最底下的黑色单位显示框
painter->save();
@@ -926,7 +1016,7 @@ void Cockpit::drawRightScale(QPainter *painter)
painter->setBrush(QColor("#000000"));
painter->drawRect(0,600,300,100);
painter->drawText(QRect(20,600,280,100),Qt::AlignLeft|Qt::AlignVCenter,"Hei " + QString::number(m_GPS.altitude));
painter->drawText(QRect(20,600,280,100),Qt::AlignLeft|Qt::AlignVCenter,"Hei " + QString::number(m_GPS.altitude,'f',0));
painter->restore();
@@ -995,7 +1085,7 @@ void Cockpit::drawRightScale(QPainter *painter)
painter->setPen(ePen);
painter->setFont(font);
painter->drawText(QRect(160,-50,90,100),Qt::AlignVCenter|Qt::AlignRight, thousandText);
qDebug() << "THOUN";
//qDebug() << "THOUN";
}
}
else if(int(m_GPS.altitude/1000) < 0)
@@ -1199,6 +1289,163 @@ void Cockpit::drawRightScale(QPainter *painter)
}
void Cockpit::drawVRate(QPainter *painter)
{
painter->save();
//平移坐标
painter->translate(950,0);
QPen ePen;
QFont font;
//画一个半透明的小方块
painter->save();
painter->setOpacity(0.3f);
static const QPointF Backpoints[10] = {
QPointF( 80,-150),
QPointF( 0,-200),
QPointF( 0,-460),
QPointF( 110,-460),
QPointF( 200,-250),
QPointF( 200, 250),
QPointF( 110, 460),
QPointF( 0, 460),
QPointF( 0, 200),
QPointF( 80, 150),
};
painter->setBrush(QColor("#7A7A7A"));
painter->drawPolygon(Backpoints,10);
painter->restore();//画底部结束
//画刻度
painter->save();
ePen.setWidth(8);
ePen.setColor(Qt::white);
painter->setPen(ePen);
for(int i = -7;i <= 7;i++)
{
painter->save();
ePen.setWidth(8);
ePen.setColor(Qt::white);
font.setPointSize(50);
font.setWeight(QFont::ExtraLight);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
painter->setFont(font);
painter->translate(80,((i<0)?(-1):(1))*log10(qAbs(i)) * 500);
if(i == 0)
{
painter->drawLine(0,0,40,0);
}
else
{
painter->drawLine(0,0,20,0);
}
if((qAbs(i)%2) == 1)
{
if(qAbs(i) != 1)//除去0位置
{
painter->drawText(QRect(-80,-40,60,80),Qt::AlignCenter,QString::number(qAbs(i)-1));
}
}
painter->restore();
}
painter->restore();//画刻度结束
//画当前值
painter->save();
painter->translate(80,0);
ePen.setWidth(8);
ePen.setColor(m_CurrentColor);
painter->setPen(ePen);
float cur_y = ((m_Attitude.verticalspeed<0)?(1):(-1))*log10(qAbs(m_Attitude.verticalspeed) + 1) * 500;
cur_y = (cur_y < -440)?(-440):((cur_y>440)?(440):(cur_y));//位置限幅
painter->drawLine(0,cur_y,20,cur_y);
painter->drawLine(20,cur_y,200,0);
//qDebug() << m_Attitude.verticalspeed;
painter->restore();//画当前值结束
//画当前值打补丁
painter->save();
painter->translate(200,0);
painter->setBrush(Qt::black);
painter->drawRect(0,-250,100,500);
painter->restore();//画当前值结束
//画目标标尺
painter->save();
float tar_y = ((m_Target.verticalspeed<0)?(1):(-1))*log10(qAbs(m_Target.verticalspeed) + 1) * 500;
tar_y = (tar_y < -440)?(-440):((tar_y>440)?(440):(tar_y));//位置限幅
painter->translate(80,tar_y);//+1是应为log 1= 0,偏移0的位置
//qDebug() << m_Target.verticalspeed;
static const QPointF Tarpoints[4] = {
QPointF( -8,-8),
QPointF( 28,-8),
QPointF( 28, 8),
QPointF( -8, 8)
};
ePen.setWidth(8);
ePen.setColor(m_TargetColor);
painter->setPen(ePen);
painter->drawPolygon(Tarpoints,4);
painter->restore();//画目标标尺结束
//画目标值
painter->save();
painter->translate(80,0);//+1是应为log 1= 0,偏移0的位置
ePen.setWidth(8);
ePen.setColor(m_TargetColor);
font.setPointSize(50);
font.setWeight(QFont::ExtraLight);
font.setFamily("Arial");//非衬线
painter->setPen(ePen);
painter->setFont(font);
painter->drawText(QRect(-80,-550,120,60),Qt::AlignHCenter|Qt::AlignLeft,QString::number(m_Target.verticalspeed,'f',(qAbs(m_Target.verticalspeed) < 10.0)?(1):(0)));
painter->restore();//画目标值结束
painter->restore();//全部结束
}
//画航向(位于底部的一个圈)
void Cockpit::drawYawScale(QPainter *painter)
{
@@ -1306,8 +1553,8 @@ void Cockpit::drawYawScale(QPainter *painter)
painter->save();
static const QPointF Rectpoints[4] = {
QPointF(-90,-610),
QPointF( 90,-610),
QPointF(-90,-620),
QPointF( 90,-620),
QPointF( 90, -540),
QPointF(-90, -540),
};
@@ -1322,7 +1569,7 @@ void Cockpit::drawYawScale(QPainter *painter)
font.setPointSize(60);
painter->setPen(ePen);
painter->setFont(font);
painter->drawText(QRect(-90,-610,180,60),Qt::AlignVCenter|Qt::AlignHCenter,QString::number(m_Attitude.yaw,'f',0));
painter->drawText(QRect(-90,-625,180,80),Qt::AlignCenter,QString::number(m_Attitude.yaw,'f',0));
painter->restore();
@@ -1441,4 +1688,41 @@ void Cockpit::drawYawScale(QPainter *painter)
painter->restore();//画YAW结束
}
void Cockpit::drawTopStatuts(QPainter *painter)
{
//画状态开始
painter->save();
QPen ePen;
QFont font;
painter->translate(0,-900);
//画底层
painter->save();
painter->setOpacity(0.3f);
painter->setBrush(QColor("#7A7A7A"));
painter->drawRect(-550,0,1100,150);
painter->setOpacity(1);
ePen.setColor(m_TargetColor);
ePen.setWidth(10);
painter->setPen(ePen);
painter->drawLine(-185,0,-185,150);
painter->drawLine( 185,0, 185,150);
painter->restore();//画底层结束
//画状态
painter->save();
ePen.setColor(m_StatusColor);
ePen.setWidth(10);
painter->setPen(ePen);
painter->drawRect(-530,10,320,80);
painter->drawRect(-160,10,320,80);
painter->drawRect( 210,10,320,80);
painter->restore();//画状态结束
painter->restore();//所有结束
}
+10 -10
View File
@@ -55,6 +55,8 @@ typedef struct {
float distofly;
}_attitude;
typedef struct {
@@ -79,7 +81,7 @@ typedef struct{
float position;//侧偏距
float altitude;//海拔
float verticalspeed;//纵向速度
}_target;
@@ -127,19 +129,13 @@ protected:
void drawRoll(QPainter *painter);
void drawRollScale(QPainter *painter);
void drawVRate(QPainter *painter);
void drawYawScale(QPainter *painter);
void drawLeftScale(QPainter *painter);
void drawRightScale(QPainter *painter);
void drawCenterLine(QPainter *painter);
void drawText(QPainter *painter);
void drawGPS(QPainter *painter);
void drawHight(QPainter *painter);
void drawSpeed(QPainter *painter);
void drawBattery(QPainter *painter);
void drawLowPanel(QPainter *painter);
void drawTopStatuts(QPainter *painter);
private slots:
@@ -155,6 +151,10 @@ private:
QString m_mode;//显示模式
QString m_SPD_HOLD;
QString m_HDG_HOLD;
QString m_ALT_HOLD;
double m_PitchValue;
double m_RollValue;