It has been a while since I last worked on Aesalon proper.
[aesalon.git] / visualizer / src / visualization / VisualizationController.cpp
blobcfb9543a79a6d1ff5557c01cc12cafe996916ca5
1 #include <QThreadPool>
3 #include "VisualizationController.h"
4 #include "Visualization.h"
6 VisualizationController::VisualizationController(Module *module, Visualization *visualization)
7 : m_module(module), m_visualization(visualization) {
8 m_threadPool = VisualizationThreadPool::singleton();
9 m_visualization->setController(this);
10 qDebug("Max. threads: %i", m_threadPool->maxThreadCount());
11 m_totalRange.beginData() = 1e50;
12 m_totalRange.endData() = -1e50;
13 m_totalRange.beginTime() = 0;
14 m_totalRange.endTime() = 0;
17 VisualizationController::~VisualizationController() {
21 void VisualizationController::heartbeat(Timestamp timestamp) {
22 if(timestamp > m_totalRange.endTime()) m_totalRange.endTime() = timestamp;
25 void VisualizationController::modifiedPoint(DataCoord point) {
26 modifiedTime(point.time());
27 if(point.data() < m_totalRange.beginData()) m_totalRange.beginData() = point.data();
28 if(point.data() > m_totalRange.endData()) m_totalRange.endData() = point.data();
31 void VisualizationController::modifiedTime(Timestamp timestamp) {
32 if(timestamp < m_totalRange.beginTime() || m_totalRange.beginTime() == 0) {
33 qDebug("**** setting beginTime to %li . . .", timestamp);
34 m_totalRange.beginTime() = timestamp;
36 if(timestamp > m_totalRange.endTime() || m_totalRange.endTime() == 0) m_totalRange.endTime() = timestamp;
39 void VisualizationController::updateVisualization() {
40 DataRange range = m_visualization->range();
41 Timestamp tdiff = m_module->latestHeartbeat() - range.endTime();
43 heartbeat(m_module->latestHeartbeat());
45 shift(DataCoord(tdiff, 0.0));
47 qDebug("Update range: %lu %lu", range.beginTime(), range.endTime());
50 void VisualizationController::registerRequest(VisualizationRequest *request) {
51 if(request->category() == FullRequest) {
52 foreach(VisualizationRequest *request, m_requestSets[request->category()]) {
53 request->abort();
56 m_requestSets[request->category()].insert(request);
59 void VisualizationController::deregisterRequest(VisualizationRequest *request) {
60 m_requestSets[request->category()].remove(request);
63 void VisualizationController::fullVisualization() {
64 VisualizationRequest *request = new VisualizationRequest(this, m_visualization->range(), FullRequest);
65 /* Full visualization priority: 15. */
66 m_threadPool->start(request, 15);
69 void VisualizationController::renderRegion(const DataRange &range, RequestType type) {
70 processRequest(new VisualizationRequest(this, range, type));
73 void VisualizationController::shift(QPoint pixels) {
74 /*qDebug("Asked to shift visualization . . .");*/
75 /* Invert the X value. The Y value is already inverted due to the visualization coordinate system. */
76 pixels.setX(-pixels.x());
77 /*pixels.setY(-pixels.y());*/
79 /*pixels.setX(1);*/
81 shift(m_visualization->translateOffset(pixels));
84 void VisualizationController::shift(DataCoord by) {
85 /* Save the previous ranges. */
86 DataRange hRange = m_visualization->range();
87 DataRange vRange = m_visualization->range();
88 m_visualization->shift(by);
90 /* Handle the horizontal side . . .*/
91 if(by.time() < 0) {
92 hRange.endTime() = hRange.beginTime();
93 hRange.beginTime() += by.time();
94 qDebug("** rendering horizontal region . . .");
95 renderRegion(hRange, PartialRequest);
97 else if(by.time() > 0) {
98 hRange.beginTime() = hRange.endTime();
99 hRange.endTime() += by.time();
100 qDebug("** rendering horizontal region . . .");
101 renderRegion(hRange, PartialRequest);
103 /* Now for the vertical. */
104 if(by.data() < 0) {
105 vRange.endData() = vRange.beginData();
106 vRange.beginData() += by.data();
107 qDebug("** rendering vertical region . . .");
108 renderRegion(vRange, PartialRequest);
110 else if(by.data() > 0) {
111 vRange.beginData() = vRange.endData();
112 vRange.endData() += by.data();
113 qDebug("** rendering vertical region . . .");
114 renderRegion(vRange, PartialRequest);
117 /*renderRegion(vRange, PartialRequest);*/
118 /*renderRegion(m_visualization->range(), PartialRequest);*/
121 void VisualizationController::scale(qreal x, qreal y) {
122 m_visualization->scale(x, y);
125 void VisualizationController::processRequest(VisualizationRequest *request) {
126 /* Default priority: 10. */
127 m_threadPool->start(request, 10);