File: meter.h

package info (click to toggle)
wfview 2.11-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 15,256 kB
  • sloc: cpp: 43,386; ansic: 3,196; sh: 32; xml: 29; makefile: 11
file content (158 lines) | stat: -rw-r--r-- 4,774 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#ifndef METER_H
#define METER_H

#include <QDebug>
#include <QStandardItemModel>
#include <QComboBox>
#include <QWidget>
#include <QPainter>
#include <QImage>
#include <QFontMetrics>
#include <vector>
#include <algorithm>
#include <numeric>
#include <math.h>
#include <cmath>

#include "rigcommander.h" // for meter types
#include "audiotaper.h"

class meter : public QWidget
{
    Q_OBJECT
public:
    explicit meter(QWidget *parent = nullptr);

signals:
    void configureMeterSignal(meter_t type);

public slots:
    void paintEvent(QPaintEvent *);

    void updateDrawing(int num);
    void setLevels(double current, double peak, double average);
    void setLevels(double current, double peak); // calculate avg
    void setLevel(double current);
    void setCompReverse(bool reverse);
    void setUseGradients(bool useGrads);
    void clearMeterOnPTTtoggle();
    void clearMeter();
    void setMeterType(meter_t type);
    void setMeterShortString(QString);
    QString getMeterShortString();
    meter_t getMeterType();
    void setColors(QColor current, QColor peakScale, QColor peakLevel,
                   QColor average, QColor lowLine,
                   QColor lowText);
    void blockMeterType(meter_t type);

    void enableCombo(bool en) { combo->setEnabled(en); }
    void setMeterExtremities(double min, double max, double redline);

private slots:
    void acceptComboItem(int item);

private:
    //QPainter painter;
    bool eventFilter(QObject *object, QEvent *event);
    void handleDoubleClick();
    bool freezeDrawing = false;
    QComboBox *combo = NULL;
    QImage *scaleCache = NULL;
    bool scaleReady = false;
    meter_t meterType;
    meter_t lastDrawMeterType;
    bool recentlyChangedParameters = false;
    QString meterShortString;
    double scaleMin = 0;
    double scaleMax = 255;
    double scaleRedline = 128;
    bool haveExtremities = false;
    bool haveUpdatedData = false;
    bool haveReceivedSomeData = false;
    int fontSize = 10;
    int length=30;
    double current=0.0;
    double peak = 0.0;
    double average = 0.0;
    int currentRect = 0;
    int averageRect = 0;
    int peakRect = 0;

    bool reverseCompMeter = true;

    int averageBalisticLength = 30;
    int peakBalisticLength = 30;
    int avgPosition=0;
    int peakPosition=0;
    std::vector<double_t> avgLevels;
    std::vector<double_t> peakLevels;

    int peakRedLevel=0;
    bool drawLabels = true;
    int labelWidth = 0;
    bool useGradients = true;
    int mXstart = 0; // Starting point for S=0.
    int mYstart = 14; // height, down from top, where the drawing starts
    int barHeight = 10; // Height of meter "bar" indicators
    int scaleLineYstart = 12;
    int scaleTextYstart = 10;

    int widgetWindowHeight = mYstart + barHeight + 0; // height of drawing canvis.

    // These functions scale the data to fit the meter:
    void prepareValue_dBuEMFdBm();
    void scaleLinearNumbersForDrawing(); // input = current, average, peak, output = currentRect, averageRect, peakRect
    void scaleLogNumbersForDrawing(); // for audio
    double getValueFromPixelScale(int p); // pixel (0-255) scale to values
    int getPixelScaleFromValue(double v); // scale value to pixel (0-255)
    int nearestStep(double val, int stepSize); // round to nearest step

    // These functions draw the rectangular bars
    // for the level(s) to be represented:
    void drawValue_Linear(QPainter *qp, bool reverse); // anything you wish 0-255
    void drawValue_Log(QPainter *qp);
    void drawValue_Center(QPainter *qp);


    // These functions draw the meter scale:
    void regenerateScale(QPainter *screenPainterHints);
    void recallScale(QPainter *qp);
    void drawScaleS(QPainter *qp);
    void drawScaleCenter(QPainter *qp);
    void drawScalePo(QPainter *qp);
    void drawScaleRxdB(QPainter *qp);
    void drawScaleALC(QPainter *qp);
    void drawScaleSWR(QPainter *qp);
    void drawScaleVd(QPainter *qp);
    void drawScaleId(QPainter *qp);
    void drawScaleComp(QPainter *qp);
    void drawScaleCompInverted(QPainter *qp);
    void drawScale_dBFs(QPainter *qp);
    void drawScaleRaw(QPainter *qp);
    void drawScaledBPositive(QPainter *qp);
    void drawScaledBNegative(QPainter *qp);

    void drawLabel(QPainter *qp);
    void muteSingleComboItem(QComboBox *comboBox, int index);
    void enableAllComboBoxItems(QComboBox *combobox, bool en=true);
    void setComboBoxItemEnabled(QComboBox * comboBox, int index, bool enabled);

    QString label;

    QColor currentColor;
    QColor averageColor;
    QColor peakColor;
    // S0-S9:
    QColor lowTextColor;
    QColor lowLineColor;
    // S9+:
    QColor highTextColor;
    QColor highLineColor;

    QColor midScaleColor;
    QColor centerTuningColor;

};

#endif // METER_H