|
|
|
|
@ -19,7 +19,7 @@
|
|
|
|
|
//#pragma comment(lib, "user32.lib")
|
|
|
|
|
//#pragma comment(lib, "gdi32.lib")
|
|
|
|
|
#define WINDOW_WIDTH 900 |
|
|
|
|
#define WINDOW_HEIGHT 1150 |
|
|
|
|
#define WINDOW_HEIGHT 1250 |
|
|
|
|
#define UPDATE_INTERVAL 10 /* 50ms → 20 samples per second */ |
|
|
|
|
/* Global app pointer for callbacks */ |
|
|
|
|
static struct etcpmon_app* g_app = NULL; |
|
|
|
|
@ -436,7 +436,7 @@ static void CreateControls(struct etcpmon_app* app) {
|
|
|
|
|
y = 915; |
|
|
|
|
CreateWindowExA(0, "BUTTON", "Queues & Errors", |
|
|
|
|
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, |
|
|
|
|
10, y, 880, 235, hWnd, (HMENU)IDC_STATIC_QUEUES, hInst, NULL); |
|
|
|
|
10, y, 880, 335, hWnd, (HMENU)IDC_STATIC_QUEUES, hInst, NULL); |
|
|
|
|
|
|
|
|
|
int qy = y + 22; |
|
|
|
|
int q_col1 = 20; |
|
|
|
|
@ -612,6 +612,49 @@ static void CreateControls(struct etcpmon_app* app) {
|
|
|
|
|
app->hEditNormOutTotBytes = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
|
q_col1 + 265, qy - 2, 70, 18, hWnd, (HMENU)IDC_EDIT_NORM_OUT_TOT_BYTES, hInst, NULL); |
|
|
|
|
|
|
|
|
|
/* ACK Debug section */ |
|
|
|
|
qy += 25; |
|
|
|
|
CreateWindowExA(0, "STATIC", "ACK Debug:", |
|
|
|
|
WS_CHILD | WS_VISIBLE, q_col1, qy, 70, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "HitInf:", |
|
|
|
|
WS_CHILD | WS_VISIBLE, q_col1 + 80, qy, 40, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditAckHitInf = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
|
q_col1 + 125, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_ACK_HIT_INF, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "HitSndQ:", |
|
|
|
|
WS_CHILD | WS_VISIBLE, q_col1 + 195, qy, 50, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditAckHitSndq = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
|
q_col1 + 250, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_ACK_HIT_SNDQ, hInst, NULL); |
|
|
|
|
|
|
|
|
|
CreateWindowExA(0, "STATIC", "Miss:", |
|
|
|
|
WS_CHILD | WS_VISIBLE, q_col2 + 80, qy, 40, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditAckMiss = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
|
q_col2 + 125, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_ACK_MISS, hInst, NULL); |
|
|
|
|
CreateWindowExA(0, "STATIC", "LnkWait:", |
|
|
|
|
WS_CHILD | WS_VISIBLE, q_col2 + 195, qy, 50, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditCntLinkWait = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
|
q_col2 + 250, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_CNT_LINK_WAIT, hInst, NULL); |
|
|
|
|
|
|
|
|
|
CreateWindowExA(0, "STATIC", "TxState:", |
|
|
|
|
WS_CHILD | WS_VISIBLE, q_col3 + 80, qy, 40, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
app->hEditTxState = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
|
q_col3 + 125, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_TX_STATE, hInst, NULL); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
qy += 22; |
|
|
|
|
CreateWindowExA(0, "STATIC", "Debug:", |
|
|
|
|
WS_CHILD | WS_VISIBLE, q_col1 + 30, qy, 50, 16, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
for (int i = 0; i < 8; i++) { |
|
|
|
|
app->hEditDebug[i] = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
|
q_col1 + 85 + i * 65, qy - 2, 60, 18, hWnd, (HMENU)(IDC_EDIT_DEBUG_0 + i), hInst, NULL); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
static LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { |
|
|
|
|
struct etcpmon_app* app = NULL; |
|
|
|
|
@ -949,6 +992,16 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app,
|
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_OUT_TOT_PKTS, "%llu", (unsigned long long)metrics->etcp.norm_out_total_pkts); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_NORM_OUT_TOT_BYTES, "%llu", (unsigned long long)metrics->etcp.norm_out_total_bytes); |
|
|
|
|
|
|
|
|
|
/* ACK Debug counters */ |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_ACK_HIT_INF, "%u", metrics->etcp.cnt_ack_hit_inf); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_ACK_HIT_SNDQ, "%u", metrics->etcp.cnt_ack_hit_sndq); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_ACK_MISS, "%u", metrics->etcp.cnt_ack_miss); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_CNT_LINK_WAIT, "%u", metrics->etcp.cnt_link_wait); |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_TX_STATE, "%u", metrics->etcp.tx_state); |
|
|
|
|
for (int i = 0; i < 8; i++) { |
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_DEBUG_0 + i, "%u", metrics->etcp.debug[i]); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Links list */ |
|
|
|
|
if (app->hListLinks) { |
|
|
|
|
SendMessage(app->hListLinks, LB_RESETCONTENT, 0, 0); |
|
|
|
|
@ -1065,6 +1118,16 @@ void etcpmon_gui_clear_metrics(struct etcpmon_app* app) {
|
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_OUT_TOT_PKTS, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_NORM_OUT_TOT_BYTES, ""); |
|
|
|
|
|
|
|
|
|
/* ACK Debug counters */ |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ACK_HIT_INF, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ACK_HIT_SNDQ, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ACK_MISS, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_CNT_LINK_WAIT, ""); |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_TX_STATE, ""); |
|
|
|
|
for (int i = 0; i < 8; i++) { |
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_DEBUG_0 + i, ""); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (app->hListLinks) { |
|
|
|
|
SendMessage(app->hListLinks, LB_RESETCONTENT, 0, 0); |
|
|
|
|
} |
|
|
|
|
|