Refactored the Dashboard.

This commit is contained in:
CyrIng
2017-11-30 20:33:32 +01:00
parent 16fe89bdff
commit b6fe2e472c

View File

@@ -147,6 +147,13 @@ const char lcd[10][3][3] = {
#define MAX_WIDTH 132 #define MAX_WIDTH 132
#define MIN_WIDTH 80 #define MIN_WIDTH 80
#define LEADING_LEFT 1
#define LEADING_TOP 1
#define MARGIN_WIDTH 2
#define MARGIN_HEIGHT 1
#define INTER_WIDTH 3
#define INTER_HEIGHT (3 + 1)
char hSpace[] = " "" "" "" "" " \ char hSpace[] = " "" "" "" "" " \
" "" "" "" "" " \ " "" "" "" "" " \
" "" "" "" "" " \ " "" "" "" "" " \
@@ -1302,136 +1309,6 @@ void SysInfoKernel( SHM_STRUCT *Shm, CUINT width,
free(str); free(str);
} }
#define LEADING_LEFT 2
#define LEADING_TOP 1
#define MARGIN_WIDTH 2
#define MARGIN_HEIGHT 1
void LCD_Draw( CUINT col,
CUINT row,
char *thisView,
unsigned int thisNumber,
unsigned int thisDigit[] )
{
char lcdBuf[32];
CUINT j = (CUINT) Dec2Digit(thisNumber, thisDigit);
thisView[0] = '\0';
j = 4;
do {
CSINT offset = col + (4 - j) * 3;
sprintf(lcdBuf,
"\033[%hu;%hdH" "%.*s" \
"\033[%hu;%hdH" "%.*s" \
"\033[%hu;%hdH" "%.*s",
row , offset, 3, lcd[thisDigit[9 - j]][0],
row + 1 , offset, 3, lcd[thisDigit[9 - j]][1],
row + 2 , offset, 3, lcd[thisDigit[9 - j]][2]);
strcat(thisView, lcdBuf);
j--;
} while (j > 0) ;
}
void Dashboard( SHM_STRUCT *Shm,
CUINT leadingLeft,
CUINT leadingTop,
CUINT marginWidth,
CUINT marginHeight)
{
char *boardView = NULL,
*lcdView = NULL,
*cpuView = NULL,
*absMove = CUH CLS;
double minRatio=Shm->Proc.Boost[0], maxRatio=Shm->Proc.Boost[LAST_BOOST];
double medianRatio = (minRatio + maxRatio) / 2;
void FreeAll(void)
{
free(cpuView);
free(lcdView);
free(boardView);
}
void AllocAll()
{
// Up to 9 digits x 3 cols x 3 lines per digit
const size_t lcdSize = (9 * 3 * 3)
+ (9 * 3 * sizeof("\033[000;000H")) + 1;
lcdView = malloc(lcdSize);
const size_t cpuSize = (9 * 3) + sizeof("\033[000;000H")
+ (3 * sizeof(DoK)) + 1;
cpuView = malloc(cpuSize);
// All LCD views x total number of CPU
boardView = malloc(Shm->Proc.CPU.Count * (lcdSize + cpuSize));
}
AllocAll();
marginWidth += 12; // shifted by lcd width
marginHeight += 3 + 1; // shifted by lcd height + cpu frame
unsigned int cpu = 0;
while (!BITVAL(Shutdown, 0)) {
unsigned int digit[9];
CUINT X, Y;
while (!BITVAL(Shm->Proc.Sync, 0) && !BITVAL(Shutdown, 0))
nanosleep(&Shm->Proc.BaseSleep, NULL);
BITCLR(LOCKLESS, Shm->Proc.Sync, 0);
if (BITVAL(Shm->Proc.Sync, 63))
BITCLR(LOCKLESS, Shm->Proc.Sync, 63);
X = leadingLeft;
Y = leadingTop;
boardView[0] = '\0';
for (cpu = 0; (cpu < Shm->Proc.CPU.Count) && !BITVAL(Shutdown,0); cpu++)
if (!BITVAL(Shm->Cpu[cpu].OffLine, HW)) {
struct FLIP_FLOP *Flop =
&Shm->Cpu[cpu].FlipFlop[!Shm->Cpu[cpu].Toggle];
if (!BITVAL(Shm->Cpu[cpu].OffLine, OS)) {
LCD_Draw(X, Y, lcdView,
(unsigned int) Flop->Relative.Freq, digit);
sprintf(cpuView,
"\033[%hu;%huH"DoK"[ µ%-2u"WoK"%4u"DoK"C ]",
Y + 3, X, cpu, Flop->Thermal.Temp);
if (Flop->Relative.Ratio > medianRatio)
strcat(boardView, RoK);
else if (Flop->Relative.Ratio > minRatio)
strcat(boardView, YoK);
else
strcat(boardView, GoK);
} else {
sprintf(lcdView, "\033[%hu;%huH" "_ _ _ _",
Y + 1, X + 1);
sprintf(cpuView, "\033[%hu;%huH" "[ µ%-2u"" OFF ]",
Y + 3, X, cpu);
}
X += marginWidth;
if ((X - 3) >= (GetScreenSize().width - marginWidth)) {
X = leadingLeft;
Y += marginHeight;
absMove = CUH;
}
else
absMove = CUH CLS;
strcat(boardView, lcdView);
strcat(boardView, cpuView);
}
if (printf("%s" "%s", absMove, boardView) > 0)
fflush(stdout);
}
FreeAll();
}
void Counters(SHM_STRUCT *Shm) void Counters(SHM_STRUCT *Shm)
{ {
unsigned int cpu = 0; unsigned int cpu = 0;
@@ -2592,7 +2469,7 @@ enum VIEW {
#define LOAD_LEAD 4 #define LOAD_LEAD 4
void Top(SHM_STRUCT *Shm) void Top(SHM_STRUCT *Shm, char option)
{ {
/* /*
SCREEN SCREEN
@@ -2631,28 +2508,31 @@ void Top(SHM_STRUCT *Shm)
width : 4-3, // Valid width width : 4-3, // Valid width
daemon : 5-4, // Draw dynamic daemon : 5-4, // Draw dynamic
taskVal : 6-5, // Display task's value taskVal : 6-5, // Display task's value
avgOrPC : 7-6, // C-states average | % pkg states avgOrPC : 7-6, // C-states average || % pkg states
_pad : 32-7; _pad8 : 8-7,
disposal: 16-8,
_pad16 : 32-16;
}; };
enum VIEW view; enum VIEW view;
} drawFlag = { } drawFlag = {
.layout=0, .layout = 0,
.clear=0, .clear = 0,
.height=0, .height = 0,
.width=0, .width = 0,
.daemon=0, .daemon = 0,
.taskVal=0, .taskVal= 0,
.avgOrPC=0, .avgOrPC= 0,
.view=V_FREQ .view = V_FREQ,
.disposal= (option == 'd') ? 1 : 0
}; };
SCREEN_SIZE drawSize = {.width = 0, .height = 0}; SCREEN_SIZE drawSize = {.width = 0, .height = 0};
unsigned int cpu = 0,prevTopFreq = 0,digit[9],iClock = 0,ratioCount = 0,idx; unsigned int cpu = 0, prevTopFreq = 0, digit[9], iClock = 0, ratioCount = 0;
unsigned long prevFreeRAM = 0; unsigned long prevFreeRAM = 0;
int prevTaskCount = 0; int prevTaskCount = 0;
CUINT _col, _row, loadWidth = 0; CUINT loadWidth = 0;
CUINT MIN_HEIGHT = 0, CUINT MIN_HEIGHT = 0,
TOP_UPPER_FIRST = 1 + TOP_HEADER_ROW, TOP_UPPER_FIRST = 1 + TOP_HEADER_ROW,
TOP_LOWER_FIRST = 2+ TOP_HEADER_ROW + Shm->Proc.CPU.Count, TOP_LOWER_FIRST = 2+ TOP_HEADER_ROW + Shm->Proc.CPU.Count,
@@ -2666,11 +2546,11 @@ void Top(SHM_STRUCT *Shm)
typedef char HBCLK[11 + 1]; typedef char HBCLK[11 + 1];
HBCLK *hBClk; HBCLK *hBClk;
char *buffer = NULL, *viewMask = NULL; char *buffer = NULL, *console = NULL;
Coordinate *cTask; Coordinate *cTask;
for (idx = 1; idx < MAX_BOOST; idx++) for (unsigned int idx = 1; idx < MAX_BOOST; idx++)
if (Shm->Proc.Boost[idx] != 0) { if (Shm->Proc.Boost[idx] != 0) {
int sort = Shm->Proc.Boost[idx] - availRatio[ratioCount]; int sort = Shm->Proc.Boost[idx] - availRatio[ratioCount];
if (sort < 0) { if (sort < 0) {
@@ -2883,39 +2763,39 @@ void Top(SHM_STRUCT *Shm)
StoreTCell(wMenu, SCANKEY_NULL, " Window ", sameAttr); StoreTCell(wMenu, SCANKEY_NULL, " Window ", sameAttr);
StoreTCell(wMenu, SCANKEY_s, " Settings [s] ", skeyAttr); StoreTCell(wMenu, SCANKEY_s, " Settings [s] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_f, " Frequency [f] ", skeyAttr); StoreTCell(wMenu, SCANKEY_d, " Dashboard [d] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_p, " Processor [p] ", skeyAttr); StoreTCell(wMenu, SCANKEY_p, " Processor [p] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_a, " About [a] ", skeyAttr); StoreTCell(wMenu, SCANKEY_a, " About [a] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_i, " Inst cycles [i] ", skeyAttr); StoreTCell(wMenu, SCANKEY_f, " Frequency [f] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_m, " Topology [m] ", skeyAttr); StoreTCell(wMenu, SCANKEY_m, " Topology [m] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_F4, " Quit [F4] ", quitAttr); StoreTCell(wMenu, SCANKEY_F4, " Quit [F4] ", quitAttr);
StoreTCell(wMenu, SCANKEY_c, " Core cycles [c] ", skeyAttr); StoreTCell(wMenu, SCANKEY_i, " Inst cycles [i] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_e, " Features [e] ", skeyAttr); StoreTCell(wMenu, SCANKEY_e, " Features [e] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr); StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr);
StoreTCell(wMenu, SCANKEY_l, " Idle C-States [l] ", skeyAttr); StoreTCell(wMenu, SCANKEY_c, " Core cycles [c] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_SHIFT_i," ISA Extensions [I] ", skeyAttr); StoreTCell(wMenu, SCANKEY_SHIFT_i," ISA Extensions [I] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr); StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr);
StoreTCell(wMenu, SCANKEY_g, " Package cycles [g] ", skeyAttr); StoreTCell(wMenu, SCANKEY_l, " Idle C-States [l] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_t, " Technologies [t] ", skeyAttr); StoreTCell(wMenu, SCANKEY_t, " Technologies [t] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr); StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr);
StoreTCell(wMenu, SCANKEY_x, " Tasks Monitoring [x] ", gateAttr); StoreTCell(wMenu, SCANKEY_g, " Package cycles [g] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_o, " Perf. Monitoring [o] ", skeyAttr); StoreTCell(wMenu, SCANKEY_o, " Perf. Monitoring [o] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr); StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr);
StoreTCell(wMenu, SCANKEY_q, " System Interrupts [q] ", skeyAttr); StoreTCell(wMenu, SCANKEY_x, " Tasks Monitoring [x] ", gateAttr);
StoreTCell(wMenu, SCANKEY_w, " Power & Thermal [w] ", skeyAttr); StoreTCell(wMenu, SCANKEY_w, " Power & Thermal [w] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr); StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr);
StoreTCell(wMenu, SCANKEY_SHIFT_v," Voltage Vcore [V] ", skeyAttr); StoreTCell(wMenu, SCANKEY_q, " System Interrupts [q] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_u, " CPUID Inst. Dump [u] ", skeyAttr); StoreTCell(wMenu, SCANKEY_u, " CPUID Hexa Dump [u] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr); StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr);
StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr); StoreTCell(wMenu, SCANKEY_SHIFT_v," Voltage Vcore [V] ", skeyAttr);
StoreTCell(wMenu, SCANKEY_SHIFT_m," Memory Controller [M] ", ctrlAttr); StoreTCell(wMenu, SCANKEY_SHIFT_m," Memory Controller [M] ", ctrlAttr);
StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr); StoreTCell(wMenu, SCANKEY_VOID, "", voidAttr);
@@ -3537,7 +3417,7 @@ void Top(SHM_STRUCT *Shm)
free(hBClk); free(hBClk);
free(buffer); free(buffer);
free(viewMask); free(console);
free(cTask); free(cTask);
DestroyLayer(sLayer); DestroyLayer(sLayer);
@@ -3554,7 +3434,7 @@ void Top(SHM_STRUCT *Shm)
{ {
hBClk = calloc(Shm->Proc.CPU.Count, sizeof(HBCLK)); hBClk = calloc(Shm->Proc.CPU.Count, sizeof(HBCLK));
buffer = malloc(10 * MAX_WIDTH); // 10 times for ANSI cursor string. buffer = malloc(10 * MAX_WIDTH); // 10 times for ANSI cursor string.
viewMask = malloc((10 * MAX_WIDTH) * MAX_HEIGHT); console = malloc((10 * MAX_WIDTH) * MAX_HEIGHT);
const CoordSize layerSize = { const CoordSize layerSize = {
.wth = MAX_WIDTH, .wth = MAX_WIDTH,
@@ -3576,40 +3456,49 @@ void Top(SHM_STRUCT *Shm)
{ {
if (caught == SIGWINCH) { if (caught == SIGWINCH) {
SCREEN_SIZE currentSize = GetScreenSize(); SCREEN_SIZE currentSize = GetScreenSize();
if (currentSize.height != drawSize.height) {
if (currentSize.height > MAX_HEIGHT)
drawSize.height = MAX_HEIGHT;
else
drawSize.height = currentSize.height;
switch (drawFlag.view) { if (currentSize.height != drawSize.height) {
case V_FREQ: if (currentSize.height > MAX_HEIGHT)
case V_INST: drawSize.height = MAX_HEIGHT;
case V_CYCLES: else
case V_CSTATES: drawSize.height = currentSize.height;
case V_TASKS:
case V_INTR: switch (drawFlag.disposal) {
case V_VOLTAGE: case 0:
switch (drawFlag.view) {
case V_FREQ:
case V_INST:
case V_CYCLES:
case V_CSTATES:
case V_TASKS:
case V_INTR:
case V_VOLTAGE:
MIN_HEIGHT = (2 * Shm->Proc.CPU.Count) + TOP_HEADER_ROW MIN_HEIGHT = (2 * Shm->Proc.CPU.Count) + TOP_HEADER_ROW
+ TOP_SEPARATOR + TOP_FOOTER_ROW; + TOP_SEPARATOR + TOP_FOOTER_ROW;
break; break;
case V_PACKAGE: case V_PACKAGE:
MIN_HEIGHT = Shm->Proc.CPU.Count + 8 + TOP_HEADER_ROW MIN_HEIGHT = Shm->Proc.CPU.Count + 8 + TOP_HEADER_ROW
+ TOP_SEPARATOR + TOP_FOOTER_ROW; + TOP_SEPARATOR + TOP_FOOTER_ROW;
break; break;
}
drawFlag.clear = 1;
drawFlag.height = !(drawSize.height < MIN_HEIGHT);
} }
if (currentSize.width != drawSize.width) { break;
if (currentSize.width > MAX_WIDTH) case 1:
drawSize.width = MAX_WIDTH; MIN_HEIGHT = LEADING_TOP + MARGIN_HEIGHT + INTER_HEIGHT;
else break;
drawSize.width = currentSize.width; }
drawFlag.clear = 1; drawFlag.clear = 1;
drawFlag.width = !(drawSize.width < MIN_WIDTH); drawFlag.height = !(drawSize.height < MIN_HEIGHT);
} }
if (currentSize.width != drawSize.width) {
if (currentSize.width > MAX_WIDTH)
drawSize.width = MAX_WIDTH;
else
drawSize.width = currentSize.width;
drawFlag.clear = 1;
drawFlag.width = !(drawSize.width < MIN_WIDTH);
}
} }
} }
@@ -3698,13 +3587,22 @@ void Top(SHM_STRUCT *Shm)
break; break;
case SCANKEY_c: case SCANKEY_c:
{ {
drawFlag.disposal = 0;
drawFlag.view = V_CYCLES; drawFlag.view = V_CYCLES;
drawSize.height = 0; drawSize.height = 0;
TrapScreenSize(SIGWINCH); TrapScreenSize(SIGWINCH);
} }
break; break;
case SCANKEY_d:
{
drawFlag.disposal = 1;
drawSize.height = 0;
TrapScreenSize(SIGWINCH);
}
break;
case SCANKEY_f: case SCANKEY_f:
{ {
drawFlag.disposal = 0;
drawFlag.view = V_FREQ; drawFlag.view = V_FREQ;
drawSize.height = 0; drawSize.height = 0;
TrapScreenSize(SIGWINCH); TrapScreenSize(SIGWINCH);
@@ -3721,6 +3619,7 @@ void Top(SHM_STRUCT *Shm)
break; break;
case SCANKEY_g: case SCANKEY_g:
{ {
drawFlag.disposal = 0;
drawFlag.view = V_PACKAGE; drawFlag.view = V_PACKAGE;
drawSize.height = 0; drawSize.height = 0;
TrapScreenSize(SIGWINCH); TrapScreenSize(SIGWINCH);
@@ -3737,6 +3636,7 @@ void Top(SHM_STRUCT *Shm)
break; break;
case SCANKEY_i: case SCANKEY_i:
{ {
drawFlag.disposal = 0;
drawFlag.view = V_INST; drawFlag.view = V_INST;
drawSize.height = 0; drawSize.height = 0;
TrapScreenSize(SIGWINCH); TrapScreenSize(SIGWINCH);
@@ -3769,6 +3669,7 @@ void Top(SHM_STRUCT *Shm)
break; break;
case SCANKEY_q: case SCANKEY_q:
{ {
drawFlag.disposal = 0;
drawFlag.view = V_INTR; drawFlag.view = V_INTR;
drawSize.height = 0; drawSize.height = 0;
TrapScreenSize(SIGWINCH); TrapScreenSize(SIGWINCH);
@@ -3776,6 +3677,7 @@ void Top(SHM_STRUCT *Shm)
break; break;
case SCANKEY_SHIFT_v: case SCANKEY_SHIFT_v:
{ {
drawFlag.disposal = 0;
drawFlag.view = V_VOLTAGE; drawFlag.view = V_VOLTAGE;
drawSize.height = 0; drawSize.height = 0;
TrapScreenSize(SIGWINCH); TrapScreenSize(SIGWINCH);
@@ -3805,6 +3707,7 @@ void Top(SHM_STRUCT *Shm)
case SCANKEY_x: case SCANKEY_x:
if (BITWISEAND(LOCKLESS, Shm->SysGate.Operation, 0x1)) { if (BITWISEAND(LOCKLESS, Shm->SysGate.Operation, 0x1)) {
Shm->SysGate.trackTask = 0; Shm->SysGate.trackTask = 0;
drawFlag.disposal = 0;
drawFlag.view = V_TASKS; drawFlag.view = V_TASKS;
drawSize.height = 0; drawSize.height = 0;
TrapScreenSize(SIGWINCH); TrapScreenSize(SIGWINCH);
@@ -4434,10 +4337,10 @@ void Top(SHM_STRUCT *Shm)
LayerFillAt(layer, offset, row, LayerFillAt(layer, offset, row,
3, lcd[digit[9 - j]][0], 3, lcd[digit[9 - j]][0],
MakeAttr(lcdColor, 0, BLACK, 1)); MakeAttr(lcdColor, 0, BLACK, 1));
LayerFillAt(layer, offset, row + 1, LayerFillAt(layer, offset, (row + 1),
3, lcd[digit[9 - j]][1], 3, lcd[digit[9 - j]][1],
MakeAttr(lcdColor, 0, BLACK, 1)); MakeAttr(lcdColor, 0, BLACK, 1));
LayerFillAt(layer, offset, row + 2, LayerFillAt(layer, offset, (row + 2),
3, lcd[digit[9 - j]][2], 3, lcd[digit[9 - j]][2],
MakeAttr(lcdColor, 0, BLACK, 1)); MakeAttr(lcdColor, 0, BLACK, 1));
j--; j--;
@@ -4465,8 +4368,7 @@ void Top(SHM_STRUCT *Shm)
Flop=&Shm->Cpu[Shm->Proc.Top].FlipFlop[!Shm->Cpu[Shm->Proc.Top].Toggle]; Flop=&Shm->Cpu[Shm->Proc.Top].FlipFlop[!Shm->Cpu[Shm->Proc.Top].Toggle];
PrintLCD(layer, 0, row, PrintLCD(layer, 0, row,
(unsigned int) Flop->Relative.Freq, (unsigned int) Flop->Relative.Freq, Flop->Relative.Ratio);
Flop->Relative.Ratio);
LayerDeclare(12) hProc0 = { LayerDeclare(12) hProc0 = {
.origin = {.col = 12, .row = row}, .length = 12, .origin = {.col = 12, .row = row}, .length = 12,
@@ -4660,7 +4562,9 @@ void Top(SHM_STRUCT *Shm)
} }
}; };
// Alternate the color of the frequency ratios // Alternate the color of the frequency ratios
unsigned int idx;
int bright = 0; int bright = 0;
for (idx = 0; idx < ratioCount; idx++) { for (idx = 0; idx < ratioCount; idx++) {
char tabStop[] = "00"; char tabStop[] = "00";
int hPos = availRatio[idx] * loadWidth / maxRatio; int hPos = availRatio[idx] * loadWidth / maxRatio;
@@ -5089,6 +4993,8 @@ void Top(SHM_STRUCT *Shm)
{'0', '9'}, {'0', '9'},
{'1', '0'} {'1', '0'}
}; };
unsigned int idx;
for (idx = 0; idx < 7; idx++, row++) for (idx = 0; idx < 7; idx++, row++)
{ {
hPCnnCode[2] = hCState[idx][0]; hPCnnCode[2] = hCState[idx][0];
@@ -5858,6 +5764,7 @@ void Top(SHM_STRUCT *Shm)
hSpace, hSpace,
MakeAttr(WHITE, 0, BLACK, 0)); MakeAttr(WHITE, 0, BLACK, 0));
unsigned int idx;
for (idx = 0; idx < Shm->SysGate.taskCount; idx++) for (idx = 0; idx < Shm->SysGate.taskCount; idx++)
{ {
switch (Shm->SysGate.taskList[idx].state) { switch (Shm->SysGate.taskList[idx].state) {
@@ -6113,7 +6020,7 @@ void Top(SHM_STRUCT *Shm)
return(row); return(row);
} }
void Layout(Layer *layer) void Layout_Header_DualView_Footer(Layer *layer)
{ {
unsigned int processorHot = 0; unsigned int processorHot = 0;
CUINT row = 0; CUINT row = 0;
@@ -6183,7 +6090,7 @@ void Top(SHM_STRUCT *Shm)
MakeAttr(WHITE, 0, BLACK, 0)); MakeAttr(WHITE, 0, BLACK, 0));
} }
idx = Dec2Digit(Shm->Cpu[cpu].Clock.Hz, digit); Dec2Digit(Shm->Cpu[cpu].Clock.Hz, digit);
hBClk[cpu][ 0] = digit[0] + '0'; hBClk[cpu][ 0] = digit[0] + '0';
hBClk[cpu][ 1] = digit[1] + '0'; hBClk[cpu][ 1] = digit[1] + '0';
@@ -6242,7 +6149,7 @@ void Top(SHM_STRUCT *Shm)
MakeAttr(BLACK, 0, BLACK, 1)); MakeAttr(BLACK, 0, BLACK, 1));
} }
void Dynamic(Layer *layer) void Dynamic_Header_DualView_Footer(Layer *layer)
{ {
CUINT row = 0; CUINT row = 0;
@@ -6304,69 +6211,104 @@ void Top(SHM_STRUCT *Shm)
row = Draw_Footer(layer, row); row = Draw_Footer(layer, row);
} }
TrapScreenSize(SIGWINCH); void Layout_NoHeader_SingleView_NoFooter(Layer *layer)
signal(SIGWINCH, TrapScreenSize);
AllocAll();
while (!BITVAL(Shutdown, 0))
{ {
do CUINT row;
{ for (row = 0; row < drawSize.height; row++)
SCANKEY scan = {.key = 0}; LayerFillAt( layer, 0, row,
drawSize.width, hSpace,
MakeAttr(BLACK, 0, BLACK, 1));
}
if ((drawFlag.daemon = BITVAL(Shm->Proc.Sync, 0)) == 0) { void Dynamic_NoHeader_SingleView_NoFooter(Layer *layer)
if (GetKey(&scan, &Shm->Proc.BaseSleep) > 0) { {
if (Shortcut(&scan) == -1) { CUINT leadingLeft = LEADING_LEFT;
if (IsDead(&winList)) CUINT leadingTop = LEADING_TOP;
AppendWindow(CreateMenu(SCANKEY_F2), &winList); CUINT marginWidth = MARGIN_WIDTH + (4 * INTER_WIDTH);
else CUINT marginHeight = MARGIN_HEIGHT + INTER_HEIGHT;
if (Motion_Trigger(&scan,GetFocus(&winList),&winList) > 0) CUINT X = leadingLeft, Y = leadingTop;
Shortcut(&scan); const CUINT rightEdge = drawSize.width - marginWidth + INTER_WIDTH,
bottomEdge = drawSize.height - marginHeight;
int MoveCursorXY(int endline)
{
if (endline == 0) {
X += marginWidth;
} else {
X = rightEdge;
} }
PrintWindowStack(); if (X >= rightEdge) {
X = leadingLeft;
Y += marginHeight;
}
if (Y > bottomEdge) {
return(-1);
}
return(0);
}
break; for (cpu = 0;
(cpu < Shm->Proc.CPU.Count) && !BITVAL(Shutdown, 0);
cpu++)
if (!BITVAL(Shm->Cpu[cpu].OffLine, HW)) {
struct FLIP_FLOP *Flop=&Shm->Cpu[cpu].FlipFlop[!Shm->Cpu[cpu].Toggle];
if (!BITVAL(Shm->Cpu[cpu].OffLine, OS)) {
Attribute warning ={.fg=WHITE, .un=0, .bg=BLACK, .bf=1};
if (Flop->Thermal.Temp <=
Shm->Cpu[cpu].PowerThermal.Limit[0])
warning = MakeAttr(BLUE, 0, BLACK, 1);
else {
if (Flop->Thermal.Temp >=
Shm->Cpu[cpu].PowerThermal.Limit[1])
warning = MakeAttr(YELLOW, 0, BLACK, 0);
}
if (Flop->Thermal.Trip) {
warning = MakeAttr(RED, 0, BLACK, 1);
}
PrintLCD(layer, X, Y,
(unsigned int) Flop->Relative.Freq, Flop->Relative.Ratio);
LayerAt(layer, attr, (X + 5), (Y + 3)) = \
LayerAt(layer, attr, (X + 6), (Y + 3)) = \
LayerAt(layer, attr, (X + 7), (Y + 3)) = \
LayerAt(layer, attr, (X + 8), (Y + 3)) = warning;
sprintf((char *) &LayerAt(layer, code, X, (Y + 3)),
"[ #%-2u%4uC ]", cpu, Flop->Thermal.Temp);
} else {
sprintf((char *) &LayerAt(layer, code, X, (Y + 1)),
"%s", "_ _ _ _");
sprintf((char *) &LayerAt(layer, code, X, (Y + 3)),
"[ #%-2u OFF ]", cpu);
} }
} else { if (MoveCursorXY(0) == -1)
BITCLR(LOCKLESS, Shm->Proc.Sync, 0); break;
} }
if (BITVAL(Shm->Proc.Sync, 63)) { struct PKG_FLIP_FLOP *Pkg = &Shm->Proc.FlipFlop[!Shm->Proc.Toggle];
// Platform changed, redraw the layout.
drawFlag.layout = 1; if (MoveCursorXY(1) == 0) {
BITCLR(LOCKLESS, Shm->Proc.Sync, 63); PrintLCD(layer, X, Y,
(unsigned int) Pkg->Delta.PTSC / 1000000, 0);
sprintf((char *) &LayerAt(layer, code, X, (Y + 3)),
"%s", "[ BSP TSC ]");
} }
} while (!BITVAL(Shutdown, 0) && !drawFlag.daemon && !drawFlag.layout) ; if (MoveCursorXY(0) == 0) {
PrintLCD(layer, X, Y,
(unsigned int) Pkg->Uncore.FC0 / 1000000, 0);
if (drawFlag.height & drawFlag.width) sprintf((char *) &LayerAt(layer, code, X, (Y + 3)),
{ "%s", "[ UNCORE ]");
if (drawFlag.clear) {
drawFlag.clear = 0;
drawFlag.layout = 1;
ResetLayer(dLayer);
} }
if (drawFlag.layout) { }
drawFlag.layout = 0;
ResetLayer(sLayer); size_t FuseAll(char stream[])
Layout(sLayer); {
} unsigned int sdx = 0;
if (drawFlag.daemon) {
Dynamic(dLayer);
// Increment the BCLK indicator (skip offline CPU)
do {
iClock++;
if (iClock == Shm->Proc.CPU.Count)
iClock = 0;
} while (BITVAL(Shm->Cpu[iClock].OffLine, OS) && iClock) ;
}
// Fuse all layers
Attribute attr = {.value = 0}; Attribute attr = {.value = 0};
idx = 0; CUINT _col, _row;
for (_row = 0; _row < drawSize.height; _row++) for (_row = 0; _row < drawSize.height; _row++)
{ {
@@ -6458,18 +6400,92 @@ void Top(SHM_STRUCT *Shm)
else else
flag.cursor = 0; flag.cursor = 0;
} }
memcpy(&viewMask[idx], buffer, _bix); memcpy(&stream[sdx], buffer, _bix);
idx += _bix; sdx += _bix;
} }
// Write buffering to the standard output return((size_t) sdx);
fwrite(viewMask, idx, 1, stdout); }
fflush(stdout);
} // endif (drawFlag.height & drawFlag.width) TrapScreenSize(SIGWINCH);
else signal(SIGWINCH, TrapScreenSize);
AllocAll();
typedef void (*LAYOUT_VIEW_FUNC)(Layer*);
LAYOUT_VIEW_FUNC LayoutView[2] = {
Layout_Header_DualView_Footer,
Layout_NoHeader_SingleView_NoFooter
};
LAYOUT_VIEW_FUNC DynamicView[2] = {
Dynamic_Header_DualView_Footer,
Dynamic_NoHeader_SingleView_NoFooter
};
while (!BITVAL(Shutdown, 0))
{
size_t writeSize = 0;
do
{
SCANKEY scan = {.key = 0};
if ((drawFlag.daemon = BITVAL(Shm->Proc.Sync, 0)) == 0) {
if (GetKey(&scan, &Shm->Proc.BaseSleep) > 0) {
if (Shortcut(&scan) == -1) {
if (IsDead(&winList))
AppendWindow(CreateMenu(SCANKEY_F2), &winList);
else
if (Motion_Trigger(&scan,GetFocus(&winList),&winList) > 0)
Shortcut(&scan);
}
PrintWindowStack();
break;
}
} else {
BITCLR(LOCKLESS, Shm->Proc.Sync, 0);
}
if (BITVAL(Shm->Proc.Sync, 63)) {
// Platform changed, redraw the layout.
drawFlag.layout = 1;
BITCLR(LOCKLESS, Shm->Proc.Sync, 63);
}
} while (!BITVAL(Shutdown, 0) && !drawFlag.daemon && !drawFlag.layout) ;
if (drawFlag.height & drawFlag.width)
{
if (drawFlag.clear) {
drawFlag.clear = 0;
drawFlag.layout = 1;
ResetLayer(dLayer);
}
if (drawFlag.layout) {
drawFlag.layout = 0;
ResetLayer(sLayer);
LayoutView[drawFlag.disposal](sLayer);
}
if (drawFlag.daemon) {
DynamicView[drawFlag.disposal](dLayer);
// Increment the BCLK indicator (skip offline CPU)
do {
iClock++;
if (iClock == Shm->Proc.CPU.Count)
iClock = 0;
} while (BITVAL(Shm->Cpu[iClock].OffLine, OS) && iClock) ;
}
// Write buffer to the standard output
if ((writeSize = FuseAll(console)) > 0) {
fwrite(console, writeSize, 1, stdout);
fflush(stdout);
}
} else
printf( CUH RoK "Term(%u x %u) < View(%u x %u)\n", printf( CUH RoK "Term(%u x %u) < View(%u x %u)\n",
drawSize.width, drawSize.height, MIN_WIDTH, MIN_HEIGHT); drawSize.width, drawSize.height, MIN_WIDTH, MIN_HEIGHT);
} }
FreeAll(); FreeAll();
} }
int Help(char *appName) int Help(char *appName)
@@ -6479,12 +6495,6 @@ int Help(char *appName)
printf( "usage:\t%s [-option <arguments>]\n" \ printf( "usage:\t%s [-option <arguments>]\n" \
"\t-t\tShow Top (default)\n" \ "\t-t\tShow Top (default)\n" \
"\t-d\tShow Dashboard\n" \ "\t-d\tShow Dashboard\n" \
"\t\t arguments:" \
" <left>" \
" <top>" \
" <marginWidth>" \
" <marginHeight>" \
"\n" \
"\t-V\tMonitor Voltage\n" \ "\t-V\tMonitor Voltage\n" \
"\t-c\tMonitor Counters\n" \ "\t-c\tMonitor Counters\n" \
"\t-i\tMonitor Instructions\n" \ "\t-i\tMonitor Instructions\n" \
@@ -6574,26 +6584,7 @@ int main(int argc, char *argv[])
Voltage(Shm); Voltage(Shm);
break; break;
case 'd': case 'd':
if (argc == 6) { // Fallthrough
printf(SCP SCR1 HIDE);
TrapSignal();
Dashboard(Shm, atoi(argv[2]),
atoi(argv[3]),
atoi(argv[4]),
atoi(argv[5]) );
printf(SHOW SCR0 RCP COLOR(0,9,9));
} else if (argc == 2) {
printf(SCP SCR1 HIDE);
TrapSignal();
Dashboard(Shm, LEADING_LEFT,
LEADING_TOP,
MARGIN_WIDTH,
MARGIN_HEIGHT);
printf(SHOW SCR0 RCP COLOR(0,9,9));
}
else
rc = Help(appName);
break;
case 't': case 't':
{ {
printf(SCP SCR1 HIDE); printf(SCP SCR1 HIDE);
@@ -6606,7 +6597,7 @@ int main(int argc, char *argv[])
tcsetattr(STDIN_FILENO, TCSANOW, &newt); tcsetattr(STDIN_FILENO, TCSANOW, &newt);
TrapSignal(); TrapSignal();
Top(Shm); Top(Shm, option);
tcsetattr(STDIN_FILENO, TCSANOW, &oldt); tcsetattr(STDIN_FILENO, TCSANOW, &oldt);