20#include "pedigree/kernel/debugger/DebuggerIO.h"
21#include "pedigree/kernel/debugger/commands/DevicesCommand.h"
22#include "pedigree/kernel/machine/Device.h"
23#include "pedigree/kernel/utilities/String.h"
24#include "pedigree/kernel/utilities/utility.h"
35 pScreen->disableCli();
39 int nLines = ((pScreen->getHeight() - 2) * 3) / 4;
43 tree.resize(pScreen->
getWidth(), nLines);
44 tree.setScrollKeys(
'o',
'p');
47 info.move(0, nLines + 2);
48 info.resize(pScreen->
getWidth(), pScreen->getHeight() - nLines - 3);
49 info.setScrollKeys(
'j',
'k');
51 pScreen->disableRefreshes();
52 drawBackground(nLines, pScreen);
53 tree.refresh(pScreen);
54 info.refresh(pScreen);
58 bool bContinue =
true;
61 while ((c = pScreen->
getChar()) == 0)
68 tree.centreOn(tree.m_Line);
69 tree.refresh(pScreen);
70 info.setDevice(tree.getDevForIndex(tree.m_Line));
71 info.refresh(pScreen);
72 }
else if (c ==
'p') {
73 if (tree.m_Line < tree.getLineCount() - 1)
75 tree.centreOn(tree.m_Line);
76 tree.refresh(pScreen);
77 info.setDevice(tree.getDevForIndex(tree.m_Line));
78 info.refresh(pScreen);
79 }
else if (c ==
'j') {
81 info.refresh(pScreen);
82 }
else if (c ==
'k') {
84 info.refresh(pScreen);
85 }
else if (c ==
'd') {
88 info.getDevice()->dump(str);
89 drawBackground(0, pScreen);
90 pScreen->
drawString(
"Querying device - press any key to exit. ", 1, 0, DebuggerIO::White,
92 pScreen->
drawString(str.cstr(), 2, 0, DebuggerIO::LightGrey, DebuggerIO::Black);
93 while ((c = pScreen->
getChar()) == 0)
95 drawBackground(nLines, pScreen);
96 tree.refresh(pScreen);
97 info.refresh(pScreen);
106void DevicesCommand::drawBackground(
size_t nLines,
DebuggerIO* pScreen) {
114 DebuggerIO::White, DebuggerIO::Green);
116 pScreen->
drawString(
"Pedigree debugger - Device tree", 0, 0, DebuggerIO::White,
119 pScreen->
drawString(
"", pScreen->getHeight() - 1, 0, DebuggerIO::White, DebuggerIO::Green);
125DevicesCommand::DeviceTree::DeviceTree() : m_Line(0), m_LinearTree() {
128 auto pusher = [
this](
Device* p) {
129 m_LinearTree.pushBack(p);
133 auto callback = pedigree_std::make_callable(pusher);
139void DevicesCommand::DeviceTree::probeDev(
Device* pDev) {
146const char* DevicesCommand::DeviceTree::getLine1(
size_t index,
DebuggerIO::Colour& colour,
151 Device* pDev = m_LinearTree[index];
154 colour = DebuggerIO::Yellow;
158 bgColour = DebuggerIO::Blue;
171const char* DevicesCommand::DeviceTree::getLine2(
size_t index,
size_t& colOffset,
177 Device* pDev = m_LinearTree[index];
180 colour = DebuggerIO::White;
200 if (m_Line == index) {
201 bgColour = DebuggerIO::Blue;
203 str.pad(m_width - colOffset);
208size_t DevicesCommand::DeviceTree::getLineCount() {
209 return m_LinearTree.count();
212Device* DevicesCommand::DeviceTree::getDevForIndex(
size_t index) {
213 return m_LinearTree[index];
216DevicesCommand::DeviceInfo::DeviceInfo() : m_pDev(0) {}
218void DevicesCommand::DeviceInfo::setDevice(
Device* dev) {
222const char* DevicesCommand::DeviceInfo::getLine1(
size_t index,
DebuggerIO::Colour& colour,
224 colour = DebuggerIO::Yellow;
229 return "(Abstract) type";
231 return "(Specific) type";
241const char* DevicesCommand::DeviceInfo::getLine2(
size_t index,
size_t& colOffset,
251 m_pDev->getName(str2);
256 str +=
static_cast<unsigned int>(m_pDev->getType());
259 str += m_pDev->getSpecificType();
262 str += m_pDev->getInterruptNumber();
265 unsigned int i = index - 4;
266 if (i >= m_pDev->addresses().count())
269 str += address->m_Name;
270 if (address->m_IsIoSpace)
274 str.append(address->m_Address, 16);
276 str.append(address->m_Address + address->m_Size, 16);
283size_t DevicesCommand::DeviceInfo::getLineCount() {
285 return 4 + m_pDev->addresses().count();
virtual void enableCli()=0
virtual void enableRefreshes()=0
virtual void drawString(const char *str, size_t row, size_t col, Colour foreColour, Colour backColour)=0
virtual size_t getWidth()=0
virtual void drawHorizontalLine(char c, size_t row, size_t colStart, size_t colEnd, Colour foreColour, Colour backColour)=0
Device * getChild(size_t n)
static void foreach(Callback callback, Device *root=0)
virtual const String & getSpecificType()
virtual void getName(String &str)
Device * getParent() const
bool execute(const HugeStaticString &input, HugeStaticString &output, InterruptState &state, DebuggerIO *screen)
void autocomplete(const HugeStaticString &input, HugeStaticString &output)
void pushBack(const T &value)