dbus-top: initial commits
This commit covers the basic functionalities of the dbus-top tool.
The UI is divided into 3 windows as follows:
+--------------------------+ Window list
| Window A | A: Summary statistics
+------------+-------------+ B: Sensor list or detail
| Window B | Window C | C: Detailed statistics
+------------+-------------+
To navigate the UI:
* Use tab to navigate each window
When a window is highlighted:
In Window B:
* Press esc key 3 times to leave the current sensor selection
In Window C:
* Press [Enter] to show/hide pop-up menu for column selectio
* Press [Left] to move highlight cursor to the left
* Press [Right] to move highlight cursor to the right
* Press [A] to sort by the highlighted column in ascending order
* Press [D] to sort by the highlighted column in descending order
To add recipe to Yocto and build the recipe:
1) Copy and paste the content of the .bb file into a folder that can be
detected by bitbake, such as meta-phosphor/recipes-phosphor/ipmi.
2) run "devtool modify -n dbus-top (path_to_openbmc_tools)/dbus-top/".
Signed-off-by: Adedeji Adebisi <adedejiadebisi01@gmail.com>
Change-Id: Id58ba30b815cfd9d18f54cf477d749dbdbc4545b
diff --git a/dbus-top/menu.hpp b/dbus-top/menu.hpp
new file mode 100644
index 0000000..afb4110
--- /dev/null
+++ b/dbus-top/menu.hpp
@@ -0,0 +1,122 @@
+// Copyright 2021 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+#pragma once
+#include "main.hpp"
+
+#include <ncurses.h>
+
+#include <string>
+#include <vector>
+class DBusTopWindow;
+class ArrowKeyNavigationMenu
+{
+ public:
+ explicit ArrowKeyNavigationMenu(WINDOW* win) :
+ win_(win), h_padding_(2), col_width_(15), h_spacing_(2), idx0_(INVALID),
+ idx1_(INVALID), choice_(INVALID), parent_(nullptr)
+ {}
+ explicit ArrowKeyNavigationMenu(DBusTopWindow* view);
+ void LoadDummyValues()
+ {
+ items_.clear();
+ items_.push_back("Sender");
+ items_.push_back("Destination");
+ items_.push_back("Interface");
+ items_.push_back("Path");
+ items_.push_back("Member");
+ }
+
+ void OnKeyDown(const std::string& key);
+ void Render();
+ void MoveCursorAlongSecondaryAxis(int delta);
+ void MoveCursorAlongPrimaryAxis(int delta);
+ int DispEntriesPerRow()
+ {
+ int ncols = 0;
+ while (true)
+ {
+ int next = ncols + 1;
+ int w = 2 * h_padding_ + col_width_ * next;
+ if (next > 1)
+ w += (next - 1) * h_spacing_;
+ if (w <= rect_.w - 2)
+ {
+ ncols = next;
+ }
+ else
+ {
+ break;
+ }
+ }
+ return ncols;
+ }
+
+ int DispEntriesPerColumn()
+ {
+ return rect_.h;
+ }
+
+ void SetRect(const Rect& rect)
+ {
+ rect_ = rect;
+ }
+
+ enum Order
+ {
+ ColumnMajor,
+ RowMajor,
+ };
+
+ void SetOrder(Order o)
+ {
+ order = o;
+ }
+
+ int Choice()
+ {
+ return choice_;
+ }
+
+ void Deselect()
+ {
+ choice_ = INVALID;
+ }
+
+ bool Empty()
+ {
+ return items_.empty();
+ }
+
+ void SetChoiceAndConstrain(int c);
+ Rect rect_;
+ void AddItem(const std::string& s);
+ bool RemoveHighlightedItem(std::string* ret); // returns true if successful
+ std::vector<std::string> Items()
+ {
+ return items_;
+ }
+
+ void do_Render(bool is_column_major);
+ std::vector<std::string> items_;
+ WINDOW* win_;
+ int h_padding_;
+ int col_width_;
+ int h_spacing_;
+ int idx0_, idx1_;
+ int choice_;
+ DBusTopWindow* parent_;
+ Order order;
+};
+