1717#include " Framework/DataProcessingStates.h"
1818#include " InspectorHelpers.h"
1919#include " PaletteHelpers.h"
20- #include " Framework/Logger.h"
21- #include < iostream>
20+ #include " FrameworkGUIDataRelayerUsage.h"
2221#include < cstring>
2322#include < cmath>
2423
@@ -27,11 +26,11 @@ static inline ImVec2 operator-(const ImVec2& lhs, const ImVec2& rhs) { return Im
2726
2827namespace o2 ::framework::gui
2928{
30-
3129// This is to display the information in the data relayer
3230struct HeatMapHelper {
3331 template <typename RECORD, typename ITEM>
34- static void draw (const char * name,
32+ static void draw (const char * /* name*/ ,
33+ int & v,
3534 ImVec2 const & sizeHint,
3635 std::function<size_t ()> const & getNumInputs,
3736 std::function<size_t()> const & getNumRecords,
@@ -42,21 +41,69 @@ struct HeatMapHelper {
4241 std::function<ImU32(int value)> const & getColor,
4342 std::function<void(int row, int column)> const & describeCell)
4443 {
45- ImVec2 size = ImVec2 (sizeHint.x , std::min (sizeHint.y , 16 .f * getNumItems (0 ) + 2 ));
46- ImU32 BORDER_COLOR = ImColor (200 , 200 , 200 , 255 );
47- ImU32 BACKGROUND_COLOR = ImColor (20 , 20 , 20 , 255 );
44+ float padding = 1 ;
45+ // add slider to scroll between the grid display windows
46+ size_t nw = getNumRecords () / WND;
47+ ImGui::PushItemWidth (sizeHint.x );
48+ ImGui::SliderInt (" ##window" , &v, 1 , nw, " wnd: %d" , ImGuiSliderFlags_AlwaysClamp);
49+ ImVec2 sliderMin = ImGui::GetItemRectMin ();
50+
4851 constexpr float MAX_BOX_X_SIZE = 16 .f ;
4952 constexpr float MAX_BOX_Y_SIZE = 16 .f ;
53+
54+ ImVec2 size = ImVec2 (sizeHint.x , std::min (sizeHint.y , MAX_BOX_Y_SIZE * getNumItems (0 ) + 2 ));
55+ ImU32 BORDER_COLOR = ImColor (200 , 200 , 200 , 255 );
56+ ImU32 BACKGROUND_COLOR = ImColor (20 , 20 , 20 , 255 );
57+ ImU32 BORDER_COLOR_A = ImColor (200 , 200 , 200 , 0 );
58+ ImU32 BACKGROUND_COLOR_A = ImColor (0 , 0 , 0 , 0 );
59+
5060 ImDrawList* drawList = ImGui::GetWindowDrawList ();
51- ImVec2 winPos = ImGui::GetCursorScreenPos () + ImVec2{0 , 7 };
52- auto records = getNumRecords ();
53- auto boxSizeX = std::min (size.x / records, MAX_BOX_X_SIZE);
54- auto numInputs = getNumInputs ();
61+ ImVec2 winPos = sliderMin;
5562
63+ // overlay activity indicator on the slider
64+ auto xsz = size.x / nw;
65+ drawList->AddRectFilled (
66+ ImVec2{0 ., 0 .} + winPos,
67+ ImVec2{size.x , size.y } + winPos,
68+ BACKGROUND_COLOR_A);
69+ drawList->AddRect (
70+ ImVec2{0 . - 1 , -1 } + winPos,
71+ ImVec2{size.x + 1 , size.y - 1 } + winPos,
72+ BORDER_COLOR_A);
73+
74+ const static auto colorA = ImColor (ImVec4{0.945 , 0.096 , 0.278 , 0.5 });
75+ const static auto colorE = ImColor (ImVec4{0 , 0 , 0 , 0 });
76+
77+ drawList->PrimReserve (nw * 6 , nw * 4 );
78+ for (size_t iw = 0 ; iw < nw; ++iw) {
79+ ImVec2 xOffset{iw * xsz + 2 * padding, 0 };
80+ ImVec2 xSize{xsz - 2 * padding, 0 };
81+ ImVec2 yOffset{0 , 2 * padding};
82+ ImVec2 ySize{0 , 16 - 4 * padding};
83+ bool active = 0 ;
84+ for (size_t ir = iw; ir < ((iw + WND > getNumRecords ()) ? getNumRecords () : iw + WND); ++ir) {
85+ for (size_t i = 0 ; i < getNumItems (ir); ++i) {
86+ active = getValue (*getItem (ir, i)) > 0 ;
87+ if (active) {
88+ break ;
89+ }
90+ }
91+ }
92+ drawList->PrimRect (
93+ xOffset + yOffset + winPos,
94+ xOffset + xSize + yOffset + ySize + winPos,
95+ active ? colorA : colorE);
96+ }
97+
98+ // display the grid
99+ size_t recordsWindow = v * WND;
100+ auto boxSizeX = std::min (size.x / WND, MAX_BOX_X_SIZE);
101+ auto numInputs = getNumInputs ();
102+ winPos = ImGui::GetCursorScreenPos () + ImVec2{0 , 7 };
56103 ImGui::InvisibleButton (" sensible area" , ImVec2 (size.x , size.y ));
57104 if (ImGui::IsItemHovered ()) {
58105 auto pos = ImGui::GetMousePos () - winPos;
59- auto slot = std::lround (std::trunc (pos.x / size.x * records ));
106+ auto slot = (v - 1 ) * WND + std::lround (std::trunc (pos.x / size.x * WND ));
60107 auto row = std::lround (std::trunc (pos.y / size.y * numInputs));
61108 describeCell (row, slot);
62109 }
@@ -69,21 +116,21 @@ struct HeatMapHelper {
69116 ImVec2 (0 . - 1 , -1 ) + winPos,
70117 ImVec2{size.x + 1 , size.y - 1 } + winPos,
71118 BORDER_COLOR);
72- float padding = 1 ;
73119
74120 size_t totalRects = 0 ;
75- for (size_t ri = 0 , re = getNumRecords () ; ri < re ; ri++) {
121+ for (size_t ri = (v - 1 ) * WND ; ri < recordsWindow ; ri++) {
76122 auto record = getRecord (ri);
77123 totalRects += getNumItems (record);
78124 }
79125
80126 drawList->PrimReserve (totalRects * 6 , totalRects * 4 );
81- for (size_t ri = 0 , re = getNumRecords () ; ri < re ; ri++) {
127+ for (size_t ri = (v - 1 ) * WND ; ri < recordsWindow ; ri++) {
82128 auto record = getRecord (ri);
83- ImVec2 xOffset{(ri * boxSizeX) + padding, 0 };
129+ ImVec2 xOffset{((ri - (v - 1 ) * WND) * boxSizeX) + padding, 0 };
84130 ImVec2 xSize{boxSizeX - 2 * padding, 0 };
85- auto boxSizeY = std::min (size.y / getNumItems (record), MAX_BOX_Y_SIZE);
86- for (size_t mi = 0 , me = getNumItems (record); mi < me; mi++) {
131+ auto me = getNumItems (record);
132+ auto boxSizeY = std::min (size.y / me, MAX_BOX_Y_SIZE);
133+ for (size_t mi = 0 ; mi < me; mi++) {
87134 ImVec2 yOffSet{0 , (mi * boxSizeY) + padding};
88135 ImVec2 ySize{0 , boxSizeY - 2 * padding};
89136
@@ -98,11 +145,12 @@ struct HeatMapHelper {
98145 }
99146};
100147
101- void displayDataRelayer (DeviceMetricsInfo const & metrics,
102- DeviceInfo const & info,
148+ void displayDataRelayer (DeviceMetricsInfo const & /* metrics*/ ,
149+ DeviceInfo const & /* info*/ ,
103150 DeviceSpec const & spec,
104151 DataProcessingStates const & states,
105- ImVec2 const & size)
152+ ImVec2 const & size,
153+ int & v)
106154{
107155 auto getNumInputs = [&states]() -> size_t {
108156 auto & inputsView = states.statesViews [(int )ProcessingStateId::DATA_QUERIES];
@@ -146,7 +194,7 @@ void displayDataRelayer(DeviceMetricsInfo const& metrics,
146194 }
147195 char const * const beginData = strchr (buffer + view.first , ' ' ) + 1 ;
148196 // Protect against buffer overflows
149- if (view.size <= beginData - buffer + i - view.first ) {
197+ if (( size_t ) view.size <= beginData - buffer + i - view.first ) {
150198 return &error;
151199 }
152200 return (int8_t const *)beginData + i; };
@@ -184,7 +232,7 @@ void displayDataRelayer(DeviceMetricsInfo const& metrics,
184232 if ((end - input) == 0 ) {
185233 continue ;
186234 }
187- if (i == row) {
235+ if (i == ( size_t ) row) {
188236 ImGui::Text (" %d %.*s (%s)" , row, int (end - input), input, InspectorHelpers::getLifeTimeStr (spec.inputs [i].matcher .lifetime ).c_str ());
189237 break ;
190238 }
@@ -226,6 +274,7 @@ void displayDataRelayer(DeviceMetricsInfo const& metrics,
226274
227275 if (getNumRecords ()) {
228276 HeatMapHelper::draw<int , int8_t >(" DataRelayer" ,
277+ v,
229278 size,
230279 getNumInputs,
231280 getNumRecords,
0 commit comments