-
Notifications
You must be signed in to change notification settings - Fork 10
/
Copy pathwaterfall.h
172 lines (138 loc) · 4.26 KB
/
waterfall.h
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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#ifndef WATERFALL_H
#define WATERFALL_H
// This is the RGB Waterfall
#include <deque>
#include <memory>
#include <atomic>
#include <mutex>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <bits/shared_ptr.h>
#include <QObject>
#include <QWidget>
#include <QDebug>
#include <QMutex>
#include <QMutexLocker>
#include <QPainter>
#include <QTimer>
#include <QElapsedTimer>
#include <QDateTime>
#include "settings.h"
#include "startupOptions.h"
#include "frame_worker.h"
#include "rgbline.h"
#define MAX8(x) ((x>255)?255:x)
#define MAXWF(x,y) ((x>y)?x:y)
#define MINWF(x,y) ((x<y)?x:y)
#define TOP(x,top) ((x>top)?top:x)
#define BOT(x,bot) ((x<bot)?bot:x)
class waterfall : public QWidget
{
Q_OBJECT
frameWorker *fw;
int frHeight;
int frWidth;
startupOptionsType options;
unsigned int TARGET_WF_FRAMERATE = 29; // FPS
int WF_DISPLAY_PERIOD_MSECS = 1000 / TARGET_WF_FRAMERATE;
unsigned int TARGET_WF_FRAMERATE_SECONDARY = 24; // FPS
int WF_DISPLAY_PERIOD_MSECS_SECONDARY = 1000 / TARGET_WF_FRAMERATE_SECONDARY;
QTimer rendertimer;
QTimer FPSTimer;
QElapsedTimer FPSElapsedTimer;
unsigned int framesDelivered = 0;
void allocateBlankWF();
void copyPixToLine(float* image, float* dst, int pixPosition);
void copyPixToLine(uint16_t* image, float* dst, int pixPosition);
int maxWFlength = 1024;
void statusMessage(QString);
int wflength; // length of graphics drawn
int ceiling;
int floor;
// Row numbers:
int r_row;
int g_row;
int b_row;
// Strength multipliers:
double redLevel = 1.0;
double greenLevel = 1.0;
double blueLevel = 1.0;
double gammaLevel = 1.0;
bool useGamma = true;
rgbLine* wflines[1024];
int currentWFLine = 0;
unsigned int recordingStartLineNumber = 0;
bool justStartedRecording = false;
bool justStoppedRecording = false;
QMutex wfInUse;
unsigned char scaleDataPoint(float dataPt); // to ceiling and floor
void addNewFrame();
std::mutex addingFrame;
void processLineToRGB(rgbLine* line); // float data to scaled RGB values
void processLineToRGB_MP(rgbLine* line); // multi-processor version
void rescaleWF();
std::mutex scalingValues;
int vSize;
int hSize;
int vEdge;
int hEdge;
unsigned char opacity;
QImage *specImage = NULL;
QImage *priorSpecImage = NULL;
void redraw();
bool useDSF;
bool recordToJPG = false;
int jpgQuality = 75;
unsigned int frameCount = 0;
void prepareWfImage();
void saveImage();
bool saveImageReady = false;
bool isSecondary = false;
bool followingExternalSpecImage = false;
public:
explicit waterfall(frameWorker *fw, int vSize, int hSize, startupOptionsType options, QWidget *parent = nullptr);
explicit waterfall(QWidget *parent = nullptr);
void setup(frameWorker *fw, int vSize, int hSize, bool isSecondary, startupOptionsType options);
void process();
QImage* getImage();
void setSpecImage(bool followMe, QImage *specImage);
struct wfInfo_t {
int wflength = 100;
int ceiling = 255;
int floor = 0;
bool useDSF = false;
int r_row = 100;
int g_row = 102;
int b_row = 104;
double redLevel = 1.0;
double greenLevel = 1.0;
double blueLevel = 1.0;
double gammaLevel = 1.0;
bool recordToJPG = false;
int jpgQuality = 75;
};
wfInfo_t getSettings();
public slots:
void paintEvent(QPaintEvent *event);
void handleNewFrame();
void changeRGB(int r, int g, int b);
void setRGBLevels(double r, double g, double b, double gamma, bool reprocess);
void setRGBLevelsAndReprocess(double r, double g, double b, double gamma);
void changeWFLength(int length);
void setSpecOpacity(unsigned char opacity);
void updateCeiling(int c);
void updateFloor(int f);
void setUseDSF(bool useDSF);
void setRecordWFImage(bool recordImageOn);
void immediatelySaveImage(); // save image right now, no questions asked.
void setSecondaryWF(bool isSecondary);
void debugThis();
private slots:
void computeFPS();
void cheapRedraw(); // follows other waterfall, no calculation
signals:
void statusMessageOut(QString);
void wfReady();
};
#endif // WATERFALL_H