#include "stdafx.h"
|
#include "ClientListDlg.h"
|
#include "afxdialogex.h"
|
#include "../DAQBridge/core/Collector.h"
|
#include "CMaster.h"
|
#include "Model.h"
|
#include "Servo.h"
|
#include <chrono>
|
#include <iomanip>
|
#include <sstream>
|
|
// CClientListDlg 对话框
|
|
IMPLEMENT_DYNAMIC(CClientListDlg, CDialogEx)
|
|
CClientListDlg::CClientListDlg(CWnd* pParent /*=nullptr*/)
|
: CDialogEx(IDD_DIALOG_CLIENT_LIST, pParent)
|
{
|
}
|
|
CClientListDlg::~CClientListDlg()
|
{
|
}
|
|
void CClientListDlg::DoDataExchange(CDataExchange* pDX)
|
{
|
CDialogEx::DoDataExchange(pDX);
|
DDX_Control(pDX, IDC_LIST_CLIENTS, m_listClients);
|
}
|
|
BEGIN_MESSAGE_MAP(CClientListDlg, CDialogEx)
|
ON_BN_CLICKED(IDC_BUTTON_REFRESH, &CClientListDlg::OnBnClickedRefresh)
|
ON_WM_SYSCOMMAND()
|
END_MESSAGE_MAP()
|
|
// CClientListDlg 消息处理程序
|
|
BOOL CClientListDlg::OnInitDialog()
|
{
|
CDialogEx::OnInitDialog();
|
|
// 初始化列表控件
|
m_listClients.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_HEADERDRAGDROP);
|
|
// 添加列
|
m_listClients.InsertColumn(0, _T("IP地址"), LVCFMT_LEFT, 120);
|
m_listClients.InsertColumn(1, _T("端口"), LVCFMT_CENTER, 80);
|
m_listClients.InsertColumn(2, _T("版本状态"), LVCFMT_CENTER, 100);
|
m_listClients.InsertColumn(3, _T("连接状态"), LVCFMT_CENTER, 100);
|
m_listClients.InsertColumn(4, _T("连接时间"), LVCFMT_LEFT, 150);
|
|
// 刷新客户端列表
|
RefreshClientList();
|
|
return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
|
}
|
|
void CClientListDlg::OnBnClickedRefresh()
|
{
|
RefreshClientList();
|
}
|
|
void CClientListDlg::OnSysCommand(UINT nID, LPARAM lParam)
|
{
|
if (nID == SC_CLOSE)
|
{
|
CDialogEx::OnCancel();
|
return;
|
}
|
CDialogEx::OnSysCommand(nID, lParam);
|
}
|
|
void CClientListDlg::RefreshClientList()
|
{
|
// 清空当前列表
|
m_listClients.DeleteAllItems();
|
m_clients.clear();
|
|
// 获取Collector实例
|
extern CServoApp theApp;
|
SERVO::CMaster& master = theApp.m_model.getMaster();
|
Collector* pCollector = master.getCollector();
|
|
if (pCollector)
|
{
|
// 获取真实的客户端列表
|
auto clientSummaries = pCollector->getClientList();
|
|
// 转换数据格式
|
for (const auto& summary : clientSummaries)
|
{
|
ClientInfo client;
|
client.ip = summary.ip;
|
client.port = summary.port;
|
client.versionOk = summary.versionOk;
|
client.status = summary.versionOk ? "已连接" : "版本不匹配";
|
|
// 获取当前时间作为连接时间(实际实现中应该从Collector获取真实连接时间)
|
auto now = std::chrono::system_clock::now();
|
auto time_t = std::chrono::system_clock::to_time_t(now);
|
std::tm tm;
|
localtime_s(&tm, &time_t);
|
|
std::ostringstream oss;
|
oss << std::put_time(&tm, "%Y-%m-%d %H:%M:%S");
|
client.connectTime = oss.str();
|
|
m_clients.push_back(client);
|
}
|
}
|
else
|
{
|
// 如果无法获取Collector实例,显示提示信息
|
ClientInfo noData;
|
noData.ip = "无法获取数据";
|
noData.port = 0;
|
noData.versionOk = false;
|
noData.status = "Collector未初始化";
|
noData.connectTime = "";
|
m_clients.push_back(noData);
|
}
|
|
// 更新列表显示
|
UpdateClientList(m_clients);
|
}
|
|
void CClientListDlg::UpdateClientList(const std::vector<ClientInfo>& clients)
|
{
|
m_listClients.DeleteAllItems();
|
|
for (size_t i = 0; i < clients.size(); ++i)
|
{
|
const ClientInfo& client = clients[i];
|
|
int nItem = m_listClients.InsertItem(i, CString(client.ip.c_str()));
|
m_listClients.SetItemText(nItem, 1, CString(std::to_string(client.port).c_str()));
|
m_listClients.SetItemText(nItem, 2, client.versionOk ? _T("正常") : _T("异常"));
|
m_listClients.SetItemText(nItem, 3, CString(client.status.c_str()));
|
m_listClients.SetItemText(nItem, 4, CString(client.connectTime.c_str()));
|
}
|
}
|