chenluhua1980
2026-01-09 6b306b81f8a07c3e36676a0a5c305b3b1ea68c60
1.实现S1F23_QueryAllCEID和S1F11_QueryAllSVID
已修改7个文件
294 ■■■■■ 文件已修改
SourceCode/Bond/EAPSimulator/CHsmsActive.cpp 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/EAPSimulator/CHsmsActive.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.cpp 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/EAPSimulator/Resource.h 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.cpp 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/EAPSimulator/CHsmsActive.cpp
@@ -5,6 +5,19 @@
static unsigned short DATAID = 1;
// Truncated SECS message logging to avoid overly long strings crashing UI/log
static void LogSecsMessageBrief(const char* tag, IMessage* pMessage, size_t maxLen = 1024)
{
    if (pMessage == nullptr) return;
    const char* msgStr = pMessage->toString();
    if (msgStr == nullptr) return;
    std::string buf(msgStr);
    if (buf.size() > maxLen) {
        buf = buf.substr(0, maxLen) + "...<truncated>";
    }
    LOGI("%s%s", tag, buf.c_str());
}
CHsmsActive::CHsmsActive()
{
    m_listener = {};
@@ -65,8 +78,8 @@
        int nStream = (pHeader->stream & 0x7F);
        TRACE("收到消息 S%dF%d================\n", pHeader->stream & 0x7F, pHeader->function);
        TRACE("Body:%s\n", pMessage->toString());
        LOGI("onRecvDataMessage(%s).", pMessage->toString());
        LogSecsMessageBrief("Body:", pMessage);
        LogSecsMessageBrief("onRecvDataMessage:", pMessage);
        if (nStream == 5 && pHeader->function == 1) {
            // S5F1
@@ -349,6 +362,28 @@
    return 0;
}
int CHsmsActive::hsmsQueryAllStatusVariables()
{
    IMessage* pMessage = nullptr;
    int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 11, ++m_nSystemByte);
    // Host sends L:0 (empty list) to request all SVIDs.
    pMessage->getBody()->addItem(); // empty list
    m_pActive->sendMessage(pMessage);
    HSMS_Destroy1Message(pMessage);
    return 0;
}
int CHsmsActive::hsmsQueryAllCollectionEvents()
{
    IMessage* pMessage = nullptr;
    int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 1 | REPLY, 23, ++m_nSystemByte);
    // Host sends L:0 (empty list) to request all CEIDs.
    pMessage->getBody()->addItem(); // empty list
    m_pActive->sendMessage(pMessage);
    HSMS_Destroy1Message(pMessage);
    return 0;
}
int CHsmsActive::hsmsQueryPPIDList()
{
    IMessage* pMessage = nullptr;
SourceCode/Bond/EAPSimulator/CHsmsActive.h
@@ -79,6 +79,8 @@
    // 查询变量
    int hsmsSelectedEquipmentStatusRequest(unsigned int SVID);
    int hsmsQueryAllStatusVariables();      // S1F11
    int hsmsQueryAllCollectionEvents();     // S1F23
    // 查询PPID List
    int hsmsQueryPPIDList();
SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.cpp
@@ -103,6 +103,8 @@
    ON_BN_CLICKED(IDC_BUTTON_CTRL_ONLINE_REMOTE, &CEAPSimulatorDlg::OnBnClickedButtonCtrlOnlineRemote)
    ON_BN_CLICKED(IDC_BUTTON_QUERY_CONTROL_STATE, &CEAPSimulatorDlg::OnBnClickedButtonQueryControlState)
    ON_BN_CLICKED(IDC_BUTTON_QUERY_PROCESS_STATE, &CEAPSimulatorDlg::OnBnClickedButtonQueryProcessState)
    ON_BN_CLICKED(IDC_BUTTON_QUERY_ALL_SVID, &CEAPSimulatorDlg::OnBnClickedButtonQueryAllSvid)
    ON_BN_CLICKED(IDC_BUTTON_QUERY_ALL_CEID, &CEAPSimulatorDlg::OnBnClickedButtonQueryAllCeid)
END_MESSAGE_MAP()
@@ -239,12 +241,36 @@
    }
    // S1F3 Query ProcessState (SVID=700) button
    {
        CRect rc(14, 152, 14 + 140, 152 + 14); // dialog units, new row
        CRect rc(14 + 140 + 5, 136, 14 + 140 + 5 + 140, 136 + 14); // dialog units, same row offset
        MapDialogRect(&rc);
        HWND hBtn = ::CreateWindow(_T("BUTTON"), _T("S1F3_QueryProcessState"),
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            rc.left, rc.top, rc.Width(), rc.Height(),
            m_hWnd, (HMENU)IDC_BUTTON_QUERY_PROCESS_STATE, AfxGetInstanceHandle(), nullptr);
        if (hBtn != nullptr) {
            ::SendMessage(hBtn, WM_SETFONT, (WPARAM)GetFont()->GetSafeHandle(), TRUE);
        }
    }
    // S1F11 QueryAllSVID
    {
        CRect rc(14 + 140 + 5 + 140 + 5, 136, 14 + 140 + 5 + 140 + 5 + 140, 136 + 14); // dialog units, next row
        MapDialogRect(&rc);
        HWND hBtn = ::CreateWindow(_T("BUTTON"), _T("S1F11_QueryAllSVID"),
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            rc.left, rc.top, rc.Width(), rc.Height(),
            m_hWnd, (HMENU)IDC_BUTTON_QUERY_ALL_SVID, AfxGetInstanceHandle(), nullptr);
        if (hBtn != nullptr) {
            ::SendMessage(hBtn, WM_SETFONT, (WPARAM)GetFont()->GetSafeHandle(), TRUE);
        }
    }
    // S1F23 QueryAllCEID
    {
        CRect rc(14, 152, 14 + 140, 152 + 14); // dialog units, next row
        MapDialogRect(&rc);
        HWND hBtn = ::CreateWindow(_T("BUTTON"), _T("S1F23_QueryAllCEID"),
            WS_CHILD | WS_VISIBLE | BS_PUSHBUTTON,
            rc.left, rc.top, rc.Width(), rc.Height(),
            m_hWnd, (HMENU)IDC_BUTTON_QUERY_ALL_CEID, AfxGetInstanceHandle(), nullptr);
        if (hBtn != nullptr) {
            ::SendMessage(hBtn, WM_SETFONT, (WPARAM)GetFont()->GetSafeHandle(), TRUE);
        }
@@ -377,6 +403,12 @@
    }
    if (GetDlgItem(IDC_BUTTON_QUERY_PROCESS_STATE) != nullptr) {
        GetDlgItem(IDC_BUTTON_QUERY_PROCESS_STATE)->EnableWindow(enabled);
    }
    if (GetDlgItem(IDC_BUTTON_QUERY_ALL_SVID) != nullptr) {
        GetDlgItem(IDC_BUTTON_QUERY_ALL_SVID)->EnableWindow(enabled);
    }
    if (GetDlgItem(IDC_BUTTON_QUERY_ALL_CEID) != nullptr) {
        GetDlgItem(IDC_BUTTON_QUERY_ALL_CEID)->EnableWindow(enabled);
    }
}
@@ -552,3 +584,13 @@
{
    theApp.m_model.m_pHsmsActive->hsmsSelectedEquipmentStatusRequest(SVID_CurrentProcessState);
}
void CEAPSimulatorDlg::OnBnClickedButtonQueryAllSvid()
{
    theApp.m_model.m_pHsmsActive->hsmsQueryAllStatusVariables();
}
void CEAPSimulatorDlg::OnBnClickedButtonQueryAllCeid()
{
    theApp.m_model.m_pHsmsActive->hsmsQueryAllCollectionEvents();
}
SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.h
@@ -69,4 +69,6 @@
    afx_msg void OnBnClickedButtonCtrlOnlineRemote();
    afx_msg void OnBnClickedButtonQueryControlState();
    afx_msg void OnBnClickedButtonQueryProcessState();
    afx_msg void OnBnClickedButtonQueryAllSvid();
    afx_msg void OnBnClickedButtonQueryAllCeid();
};
SourceCode/Bond/EAPSimulator/Resource.h
@@ -63,6 +63,8 @@
#define IDC_BUTTON_CTRL_ONLINE_REMOTE   1045
#define IDC_BUTTON_QUERY_CONTROL_STATE  1046
#define IDC_BUTTON_QUERY_PROCESS_STATE  1047
#define IDC_BUTTON_QUERY_ALL_SVID       1048
#define IDC_BUTTON_QUERY_ALL_CEID       1049
// Next default values for new objects
// 
@@ -70,7 +72,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        143
#define _APS_NEXT_COMMAND_VALUE         32771
#define _APS_NEXT_CONTROL_VALUE         1048
#define _APS_NEXT_CONTROL_VALUE         1050
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -20,6 +20,19 @@
const char* ACK0 = &ACK[0];
const char* ACK1 = &ACK[1];
// Log SECS-II message briefly to avoid huge strings causing issues.
static void LogSecsMessageBrief(const char* tag, IMessage* pMessage, size_t maxLen = 1024)
{
    if (pMessage == nullptr) return;
    const char* msgStr = pMessage->toString();
    if (msgStr == nullptr) return;
    std::string buf(msgStr);
    if (buf.size() > maxLen) {
        buf = buf.substr(0, maxLen) + "...<truncated>";
    }
    LOGI("%s%s", tag, buf.c_str());
}
unsigned __stdcall CimWorkThreadFunction(LPVOID lpParam)
{
    CHsmsPassive* pPassive = (CHsmsPassive*)lpParam;
@@ -1298,13 +1311,19 @@
        HEADER* pHeader = pMessage->getHeader();
        int nStream = (pHeader->stream & 0x7F);
        LOGI("<HSMS>[Received]%s", pMessage->toString());
        LogSecsMessageBrief("<HSMS>[Received]", pMessage);
        if (nStream == 1 && pHeader->function == 1) {
            // S1F1
            replyAreYouThere(pMessage);
        }
        else if (nStream == 1 && pHeader->function == 3) {
            replySelectedEquipmentStatusData(pMessage);
        }
        else if (nStream == 1 && pHeader->function == 11) {
            replyStatusVariableNamelistRequest(pMessage);
        }
        else if (nStream == 1 && pHeader->function == 23) {
            replyCollectionEventNamelistRequest(pMessage);
        }
        else if (nStream == 1 && pHeader->function == 13) {
            replyEstablishCommunications(pMessage);
@@ -1632,7 +1651,7 @@
                ASSERT(pMessage);
                m_pPassive->sendMessage(pMessage);
                LOGI("<HSMS>[SEND]SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
                LOGI("<HSMS>[SEND]%s", pMessage->toString());
                LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
                int nRet = WaitForSingleObject(pAction->getEvent(), pAction->getTimeout() * 1000);
                if (nRet == WAIT_TIMEOUT) {
@@ -1658,7 +1677,7 @@
                ASSERT(pMessage);
                m_pPassive->sendMessage(pMessage);
                LOGI("<HSMS>[SEND]SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
                LOGI("<HSMS>[SEND]%s", pMessage->toString());
                LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
            }
        }
@@ -1682,7 +1701,7 @@
    m_pPassive->sendMessage(pMessage);
    LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
        pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
    LOGI("<HSMS>[SEND]%s", pMessage->toString());
    LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
    HSMS_Destroy1Message(pMessage);
}
@@ -1725,7 +1744,7 @@
    m_pPassive->sendMessage(pMessage);
    LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
        pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
    LOGI("<HSMS>[SEND]%s", pMessage->toString());
    LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
    HSMS_Destroy1Message(pMessage);
    return 0;
@@ -1788,7 +1807,7 @@
    m_pPassive->sendMessage(pMessage);
    LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
        pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
    LOGI("<HSMS>[SEND]%s", pMessage->toString());
    LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
    HSMS_Destroy1Message(pMessage);
    return 0;
@@ -1835,12 +1854,168 @@
    m_pPassive->sendMessage(pMessage);
    LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
        pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
    LOGI("<HSMS>[SEND]%s", pMessage->toString());
    LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
    HSMS_Destroy1Message(pMessage);
    return 0;
}
// S1F11
int CHsmsPassive::replyStatusVariableNamelistRequest(IMessage* pRecv)
{
    if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
        return ER_NOTSELECT;
    }
    std::vector<unsigned short> reqIds;
    ISECS2Item* pBody = pRecv->getBody();
    if (pBody != nullptr && pBody->getType() == SITYPE::L) {
        const int sz = pBody->getSubItemSize();
        for (int i = 0; i < sz; ++i) {
            unsigned short id = 0;
            if (pBody->getSubItemU2(i, id)) {
                reqIds.push_back(id);
            }
        }
    }
    // Build response list items: {L:3 SVID, SVNAME, UNITS}
    std::vector<unsigned short> svids;
    std::set<unsigned short> requested(reqIds.begin(), reqIds.end());
    Lock();
    if (reqIds.empty()) {
        for (auto v : m_variabels) {
            svids.push_back(static_cast<unsigned short>(v->getVarialbleId()));
        }
    }
    else {
        // include requested IDs (existing + unknown marker)
        for (auto id : requested) {
            svids.push_back(id);
        }
    }
    Unlock();
    IMessage* pMessage = NULL;
    HSMS_Create1Message(pMessage, m_nSessionId, 1, 12, pRecv->getHeader()->systemBytes);
    ASSERT(pMessage);
    ISECS2Item* pList = pMessage->getBody(); // Body is L[n] of {SVID, SVNAME, UNITS}
    for (auto id : svids) {
        ISECS2Item* pEntry = pList->addItem();
        pEntry->addU2Item(id, "SVID");
        SERVO::CVariable* v = getVariable((int)id);
        if (v != nullptr) {
            pEntry->addItem(v->getName().c_str(), "SVNAME");
            // Use remark as UNITS if provided; empty string if none.
            pEntry->addItem(v->getRemark().c_str(), "UNITS");
        }
        else {
            // Unknown SVID: A:0 for name/units
            pEntry->addItem("", "SVNAME");
            pEntry->addItem("", "UNITS");
        }
    }
    m_pPassive->sendMessage(pMessage);
    LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
        pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
    LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
    HSMS_Destroy1Message(pMessage);
    return ER_NOERROR;
}
// S1F23
int CHsmsPassive::replyCollectionEventNamelistRequest(IMessage* pRecv)
{
    if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
        return ER_NOTSELECT;
    }
    std::vector<unsigned short> reqIds;
    ISECS2Item* pBody = pRecv->getBody();
    if (pBody != nullptr && pBody->getType() == SITYPE::L) {
        const int sz = pBody->getSubItemSize();
        for (int i = 0; i < sz; ++i) {
            unsigned short id = 0;
            if (pBody->getSubItemU2(i, id)) {
                reqIds.push_back(id);
            }
        }
    }
    struct CEInfo {
        unsigned short id{ 0 };
        std::string name;
        std::vector<unsigned short> vids;
    };
    std::vector<CEInfo> ceInfos;
    {
        Lock();
        if (reqIds.empty()) {
            for (auto e : m_collectionEvents) {
                if (e == nullptr) continue;
                CEInfo info;
                info.id = static_cast<unsigned short>(e->getEventId());
                info.name = e->getName();
                std::set<unsigned short> vidSet;
                for (auto rpt : e->getReports()) {
                    if (rpt == nullptr) continue;
                    for (auto vid : rpt->getVids()) {
                        vidSet.insert(static_cast<unsigned short>(vid));
                    }
                }
                info.vids.assign(vidSet.begin(), vidSet.end());
                ceInfos.push_back(std::move(info));
            }
        }
        else {
            for (auto id : reqIds) {
                CEInfo info;
                info.id = id;
                SERVO::CCollectionEvent* e = getEvent(id);
                if (e != nullptr) {
                    info.name = e->getName();
                    std::set<unsigned short> vidSet;
                    for (auto rpt : e->getReports()) {
                        if (rpt == nullptr) continue;
                        for (auto vid : rpt->getVids()) {
                            vidSet.insert(static_cast<unsigned short>(vid));
                        }
                    }
                    info.vids.assign(vidSet.begin(), vidSet.end());
                }
                ceInfos.push_back(std::move(info));
            }
        }
        Unlock();
    }
    IMessage* pMessage = NULL;
    HSMS_Create1Message(pMessage, m_nSessionId, 1, 24, pRecv->getHeader()->systemBytes);
    ASSERT(pMessage);
    ISECS2Item* pList = pMessage->getBody(); // Body is L[n] of {CEID, CENAME, L[VIDs]}
    for (const auto& info : ceInfos) {
        ISECS2Item* pEntry = pList->addItem();
        pEntry->addU2Item(info.id, "CEID");
        pEntry->addItem(info.name.c_str(), "CENAME"); // empty if unknown
        ISECS2Item* pVidList = pEntry->addItem();
        for (auto vid : info.vids) {
            pVidList->addU2Item(vid, "VID");
        }
    }
    m_pPassive->sendMessage(pMessage);
    LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
        pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
    LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
    HSMS_Destroy1Message(pMessage);
    return ER_NOERROR;
}
// S2F13
@@ -1886,7 +2061,7 @@
    m_pPassive->sendMessage(pMessage);
    LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
        pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
    LOGI("<HSMS>[SEND]%s", pMessage->toString());
    LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
    HSMS_Destroy1Message(pMessage);
    return 0;
@@ -2287,7 +2462,7 @@
    m_pPassive->sendMessage(pMessage);
    LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
        pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
    LOGI("<HSMS>[SEND]%s", pMessage->toString());
    LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
    HSMS_Destroy1Message(pMessage);
    
    return 0;
@@ -2392,7 +2567,7 @@
    m_pPassive->sendMessage(pMessage);
    LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
        pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
    LOGI("<HSMS>[SEND]%s", pMessage->toString());
    LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
    HSMS_Destroy1Message(pMessage);
    return 0;
@@ -2565,7 +2740,7 @@
    m_pPassive->sendMessage(pReply);
    LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
        pReply->getHeader()->sessionId, pReply->getHeader()->sType, pReply->getHeader()->systemBytes);
    LOGI("<HSMS>[SEND]%s", pReply->toString());
    LogSecsMessageBrief("<HSMS>[SEND]", pReply);
    HSMS_Destroy1Message(pReply);
@@ -2595,7 +2770,7 @@
        m_pPassive->sendMessage(pMessage);
        LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
            pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
        LOGI("<HSMS>[SEND]%s", pMessage->toString());
        LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
        HSMS_Destroy1Message(pMessage);
        return 0;
    }
@@ -2682,7 +2857,7 @@
    m_pPassive->sendMessage(pMessage);
    LOGI("<HSMS>[SEND]sessionId:%d, sType:%d systemBytes:%d",
        pMessage->getHeader()->sessionId, pMessage->getHeader()->sType, pMessage->getHeader()->systemBytes);
    LOGI("<HSMS>[SEND]%s", pMessage->toString());
    LogSecsMessageBrief("<HSMS>[SEND]", pMessage);
    HSMS_Destroy1Message(pMessage);
SourceCode/Bond/Servo/HsmsPassive.h
@@ -234,6 +234,8 @@
    int replyAreYouThere(IMessage* pRecv);
    int replyEstablishCommunications(IMessage* pRecv);
    int replySelectedEquipmentStatusData(IMessage* pRecv);
    int replyStatusVariableNamelistRequest(IMessage* pRecv);  // S1F11/S1F12
    int replyCollectionEventNamelistRequest(IMessage* pRecv); // S1F23/S1F24
    int replyOnLine(IMessage* pRecv);
    int replyOffLine(IMessage* pRecv);
    int replyEquipmentConstantRequest(IMessage* pRecv);