|
|
|
@ -19,7 +19,7 @@ |
|
|
|
//#pragma comment(lib, "comctl32.lib")
|
|
|
|
//#pragma comment(lib, "comctl32.lib")
|
|
|
|
//#pragma comment(lib, "user32.lib")
|
|
|
|
//#pragma comment(lib, "user32.lib")
|
|
|
|
//#pragma comment(lib, "gdi32.lib")
|
|
|
|
//#pragma comment(lib, "gdi32.lib")
|
|
|
|
#define WINDOW_WIDTH 900 |
|
|
|
#define WINDOW_WIDTH 1000 |
|
|
|
#define WINDOW_HEIGHT 1250 |
|
|
|
#define WINDOW_HEIGHT 1250 |
|
|
|
#define UPDATE_INTERVAL 10 /* 50ms → 20 samples per second */ |
|
|
|
#define UPDATE_INTERVAL 10 /* 50ms → 20 samples per second */ |
|
|
|
/* Global app pointer for callbacks */ |
|
|
|
/* Global app pointer for callbacks */ |
|
|
|
@ -144,8 +144,8 @@ HWND etcpmon_gui_create_window(struct etcpmon_app* app) { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* Set default values */ |
|
|
|
/* Set default values */ |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ADDR, "127.0.0.1"); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_ADDR, "192.168.40.1"); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_PORT, "9090"); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_PORT, "9091"); |
|
|
|
UpdateUIState(app); |
|
|
|
UpdateUIState(app); |
|
|
|
OnConnect(app); |
|
|
|
OnConnect(app); |
|
|
|
|
|
|
|
|
|
|
|
@ -159,7 +159,7 @@ static void CreateControls(struct etcpmon_app* app) { |
|
|
|
/* Connection group */ |
|
|
|
/* Connection group */ |
|
|
|
CreateWindowExA(0, "BUTTON", "Connection", |
|
|
|
CreateWindowExA(0, "BUTTON", "Connection", |
|
|
|
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, |
|
|
|
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, |
|
|
|
x, y, 880, 60, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
x, y, WINDOW_WIDTH - 20, 60, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
|
|
|
|
|
|
|
/* Address label and edit */ |
|
|
|
/* Address label and edit */ |
|
|
|
CreateWindowExA(0, "STATIC", "Server:", |
|
|
|
CreateWindowExA(0, "STATIC", "Server:", |
|
|
|
@ -253,7 +253,7 @@ static void CreateControls(struct etcpmon_app* app) { |
|
|
|
y = 485; |
|
|
|
y = 485; |
|
|
|
CreateWindowExA(0, "BUTTON", "ETCP Metrics", |
|
|
|
CreateWindowExA(0, "BUTTON", "ETCP Metrics", |
|
|
|
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, |
|
|
|
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, |
|
|
|
x, y, 430, 210, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
x, y, (WINDOW_WIDTH - 40) / 2, 210, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
|
|
|
|
|
|
|
int mx = x + 10, my = y + 20; |
|
|
|
int mx = x + 10, my = y + 20; |
|
|
|
|
|
|
|
|
|
|
|
@ -323,10 +323,11 @@ static void CreateControls(struct etcpmon_app* app) { |
|
|
|
mx + 85, my, 100, 20, hWnd, (HMENU)IDC_EDIT_ETCP_LINKS, hInst, NULL); |
|
|
|
mx + 85, my, 100, 20, hWnd, (HMENU)IDC_EDIT_ETCP_LINKS, hInst, NULL); |
|
|
|
|
|
|
|
|
|
|
|
/* TUN/Routing Metrics group - right of ETCP Metrics */ |
|
|
|
/* TUN/Routing Metrics group - right of ETCP Metrics */ |
|
|
|
x = 460; y = 485; |
|
|
|
int group_w = (WINDOW_WIDTH - 40) / 2; |
|
|
|
|
|
|
|
x = 10 + group_w + 20; y = 485; |
|
|
|
CreateWindowExA(0, "BUTTON", "TUN/Routing Metrics", |
|
|
|
CreateWindowExA(0, "BUTTON", "TUN/Routing Metrics", |
|
|
|
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, |
|
|
|
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, |
|
|
|
x, y, 430, 210, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
x, y, group_w, 210, hWnd, (HMENU)IDC_STATIC, hInst, NULL); |
|
|
|
|
|
|
|
|
|
|
|
mx = x + 10; my = y + 20; |
|
|
|
mx = x + 10; my = y + 20; |
|
|
|
|
|
|
|
|
|
|
|
@ -441,13 +442,13 @@ static void CreateControls(struct etcpmon_app* app) { |
|
|
|
|
|
|
|
|
|
|
|
app->hListLinks = CreateWindowExA(WS_EX_CLIENTEDGE, "LISTBOX", "", |
|
|
|
app->hListLinks = CreateWindowExA(WS_EX_CLIENTEDGE, "LISTBOX", "", |
|
|
|
WS_CHILD | WS_VISIBLE | LBS_NOTIFY | WS_VSCROLL | LBS_NOINTEGRALHEIGHT, |
|
|
|
WS_CHILD | WS_VISIBLE | LBS_NOTIFY | WS_VSCROLL | LBS_NOINTEGRALHEIGHT, |
|
|
|
10, y + 20, 880, 160, hWnd, (HMENU)IDC_LIST_LINKS, hInst, NULL); |
|
|
|
10, y + 20, WINDOW_WIDTH - 20, 160, hWnd, (HMENU)IDC_LIST_LINKS, hInst, NULL); |
|
|
|
|
|
|
|
|
|
|
|
/* Queues & Errors group - below Links */ |
|
|
|
/* Queues & Errors group - below Links */ |
|
|
|
y = 915; |
|
|
|
y = 915; |
|
|
|
CreateWindowExA(0, "BUTTON", "Queues & Errors", |
|
|
|
CreateWindowExA(0, "BUTTON", "Queues & Errors", |
|
|
|
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, |
|
|
|
WS_CHILD | WS_VISIBLE | BS_GROUPBOX, |
|
|
|
10, y, 880, 335, hWnd, (HMENU)IDC_STATIC_QUEUES, hInst, NULL); |
|
|
|
10, y, WINDOW_WIDTH - 20, 335, hWnd, (HMENU)IDC_STATIC_QUEUES, hInst, NULL); |
|
|
|
|
|
|
|
|
|
|
|
int qy = y + 22; |
|
|
|
int qy = y + 22; |
|
|
|
int q_col1 = 20; |
|
|
|
int q_col1 = 20; |
|
|
|
@ -481,6 +482,9 @@ static void CreateControls(struct etcpmon_app* app) { |
|
|
|
app->hEditQWaitAckPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
app->hEditQWaitAckPkts = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
q_col3 + 135, qy - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_Q_WAIT_ACK_PKTS, hInst, NULL); |
|
|
|
q_col3 + 135, qy - 2, 50, 18, hWnd, (HMENU)IDC_EDIT_Q_WAIT_ACK_PKTS, hInst, NULL); |
|
|
|
|
|
|
|
app->hEditQWaitAckOptInfl = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
|
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
|
|
|
|
q_col3 + 190, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_WAITACK_OPT_INFL, hInst, NULL); |
|
|
|
|
|
|
|
|
|
|
|
/* Queue metrics - row 2 */ |
|
|
|
/* Queue metrics - row 2 */ |
|
|
|
qy += 28; |
|
|
|
qy += 28; |
|
|
|
@ -548,9 +552,6 @@ static void CreateControls(struct etcpmon_app* app) { |
|
|
|
app->hEditWaitAckTimer = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
app->hEditWaitAckTimer = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
q_col1 + 195, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_WAITACK_TIMER, hInst, NULL); |
|
|
|
q_col1 + 195, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_WAITACK_TIMER, hInst, NULL); |
|
|
|
app->hEditWaitAckOptInfl = CreateWindowExA(WS_EX_CLIENTEDGE, "EDIT", "", |
|
|
|
|
|
|
|
WS_CHILD | WS_VISIBLE | ES_READONLY | ES_CENTER, |
|
|
|
|
|
|
|
q_col1 + 260, qy - 2, 60, 18, hWnd, (HMENU)IDC_EDIT_WAITACK_OPT_INFL, hInst, NULL); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ID metrics - row 4 */ |
|
|
|
/* ID metrics - row 4 */ |
|
|
|
// qy += 30;
|
|
|
|
// qy += 30;
|
|
|
|
@ -984,6 +985,7 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app, |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_IN_SEND_PKTS, "%u", metrics->etcp.input_send_q_packets); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_IN_SEND_PKTS, "%u", metrics->etcp.input_send_q_packets); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_WAIT_ACK_BYTES, "%u", metrics->etcp.input_wait_ack_bytes); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_WAIT_ACK_BYTES, "%u", metrics->etcp.input_wait_ack_bytes); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_WAIT_ACK_PKTS, "%u", metrics->etcp.input_wait_ack_packets); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_WAIT_ACK_PKTS, "%u", metrics->etcp.input_wait_ack_packets); |
|
|
|
|
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_OPT_INFL, "%u", metrics->etcp.optimal_inflight); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_ACK_BYTES, "%u", metrics->etcp.ack_q_bytes); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_ACK_BYTES, "%u", metrics->etcp.ack_q_bytes); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_ACK_PKTS, "%u", metrics->etcp.ack_q_packets); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_ACK_PKTS, "%u", metrics->etcp.ack_q_packets); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_RECV_BYTES, "%u", metrics->etcp.recv_q_bytes); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_Q_RECV_BYTES, "%u", metrics->etcp.recv_q_bytes); |
|
|
|
@ -1004,7 +1006,6 @@ void etcpmon_gui_update_metrics(struct etcpmon_app* app, |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_SUSP, "%s", metrics->etcp.wait_ack_cb_suspended ? "ON" : "OFF"); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_SUSP, "%s", metrics->etcp.wait_ack_cb_suspended ? "ON" : "OFF"); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_CB, "%s", metrics->etcp.wait_ack_cb_set ? "ON" : "OFF"); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_CB, "%s", metrics->etcp.wait_ack_cb_set ? "ON" : "OFF"); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_TIMER, "%s", metrics->etcp.wait_ack_resume_timeout ? "ON" : "OFF"); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_TIMER, "%s", metrics->etcp.wait_ack_resume_timeout ? "ON" : "OFF"); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_WAITACK_OPT_INFL, "%u", metrics->etcp.optimal_inflight); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* ID Metrics */ |
|
|
|
/* ID Metrics */ |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_ID_NEXT_TX, "%u", metrics->etcp.next_tx_id); |
|
|
|
UpdateEditIfChanged(hMain, IDC_EDIT_ID_NEXT_TX, "%u", metrics->etcp.next_tx_id); |
|
|
|
@ -1125,6 +1126,7 @@ void etcpmon_gui_clear_metrics(struct etcpmon_app* app) { |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_IN_SEND_PKTS, ""); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_IN_SEND_PKTS, ""); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_WAIT_ACK_BYTES, ""); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_WAIT_ACK_BYTES, ""); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_WAIT_ACK_PKTS, ""); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_WAIT_ACK_PKTS, ""); |
|
|
|
|
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_WAITACK_OPT_INFL, ""); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_ACK_BYTES, ""); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_ACK_BYTES, ""); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_ACK_PKTS, ""); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_ACK_PKTS, ""); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_RECV_BYTES, ""); |
|
|
|
SetDlgItemTextA(app->hWndMain, IDC_EDIT_Q_RECV_BYTES, ""); |
|
|
|
|