LAPTOP-SNT8I5JK\Boounion
2025-08-01 cf354448c631302367af8152d4a3fd0ba20afcb6
1.Spooled Data功能实现;
2.Request spooled data消息响应,EAP模拟测试;
已修改12个文件
280 ■■■■ 文件已修改
SourceCode/Bond/EAPSimulator/CHsmsActive.cpp 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/EAPSimulator/CHsmsActive.h 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/EAPSimulator/EAPSimulator.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.cpp 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/EAPSimulator/Resource.h 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/HSMSSDK/Include/ISECS2Item.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageGraph2.cpp 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsAction.cpp 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.cpp 214 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.h 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/EAPSimulator/CHsmsActive.cpp
@@ -67,7 +67,7 @@
        LOGI("onRecvDataMessage(%s).", pMessage->toString());
        if (nStream == 5 && pHeader->function == 1) {
            // S1F1
            // S5F1
            replyAck(5, 2, pMessage->getHeader()->systemBytes, 0, _T("ACK0"));
        }
    };
@@ -266,6 +266,29 @@
    return 0;
}
int CHsmsActive::hsmsTransmitSpooledData()
{
    IMessage* pMessage = nullptr;
    int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 23, ++m_nSystemByte);
    pMessage->getBody()->setU1(0, "RSDC");
    m_pActive->sendMessage(pMessage);
    HSMS_Destroy1Message(pMessage);
    return 0;
}
int CHsmsActive::hsmsPurgeSpooledData()
{
    IMessage* pMessage = nullptr;
    int nRet = HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 23, ++m_nSystemByte);
    pMessage->getBody()->setU1(1, "RSDC");
    m_pActive->sendMessage(pMessage);
    HSMS_Destroy1Message(pMessage);
    return 0;
}
int CHsmsActive::replyAck0(IMessage* pMessage)
{
    return 0;
SourceCode/Bond/EAPSimulator/CHsmsActive.h
@@ -57,6 +57,10 @@
    // Configure Spooling
    int hsmsConfigureSpooling(std::map<unsigned int, std::set<unsigned int>>& spoolingConfig);
    // 发送或清空缓存的消息
    int hsmsTransmitSpooledData();
    int hsmsPurgeSpooledData();
    // 通过的reply函数
    void replyAck(int s, int f, unsigned int systemBytes, BYTE ack, const char* pszAckName);
SourceCode/Bond/EAPSimulator/EAPSimulator.rc
Binary files differ
SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.cpp
@@ -85,6 +85,8 @@
    ON_BN_CLICKED(IDC_BUTTON_DEFINE_REPORT, &CEAPSimulatorDlg::OnBnClickedButtonDefineReport)
    ON_BN_CLICKED(IDC_BUTTON_LINE_REPORT, &CEAPSimulatorDlg::OnBnClickedButtonLineReport)
    ON_BN_CLICKED(IDC_BUTTON_CONFIGURE_SPOOLING, &CEAPSimulatorDlg::OnBnClickedButtonConfigureSpooling)
    ON_BN_CLICKED(IDC_BUTTON_TRANSMIT_SPOOLED_DATA, &CEAPSimulatorDlg::OnBnClickedButtonTransmitSpooledData)
    ON_BN_CLICKED(IDC_BUTTON_PURGE_SPOOLED_DATA, &CEAPSimulatorDlg::OnBnClickedButtonPurgeSpooledData)
END_MESSAGE_MAP()
@@ -269,6 +271,8 @@
    GetDlgItem(IDC_BUTTON_DEFINE_REPORT)->EnableWindow(enabled);
    GetDlgItem(IDC_BUTTON_LINE_REPORT)->EnableWindow(enabled);    
    GetDlgItem(IDC_BUTTON_CONFIGURE_SPOOLING)->EnableWindow(enabled);    
    GetDlgItem(IDC_BUTTON_TRANSMIT_SPOOLED_DATA)->EnableWindow(enabled);
    GetDlgItem(IDC_BUTTON_PURGE_SPOOLED_DATA)->EnableWindow(enabled);
}
void CEAPSimulatorDlg::OnBnClickedButtonConnect()
@@ -355,3 +359,13 @@
    spoolingConfig[5].insert(66);
    theApp.m_model.m_pHsmsActive->hsmsConfigureSpooling(spoolingConfig);
}
void CEAPSimulatorDlg::OnBnClickedButtonTransmitSpooledData()
{
    theApp.m_model.m_pHsmsActive->hsmsTransmitSpooledData();
}
void CEAPSimulatorDlg::OnBnClickedButtonPurgeSpooledData()
{
    theApp.m_model.m_pHsmsActive->hsmsPurgeSpooledData();
}
SourceCode/Bond/EAPSimulator/EAPSimulatorDlg.h
@@ -54,4 +54,6 @@
    afx_msg void OnBnClickedButtonDefineReport();
    afx_msg void OnBnClickedButtonLineReport();
    afx_msg void OnBnClickedButtonConfigureSpooling();
    afx_msg void OnBnClickedButtonTransmitSpooledData();
    afx_msg void OnBnClickedButtonPurgeSpooledData();
};
SourceCode/Bond/EAPSimulator/Resource.h
@@ -32,7 +32,9 @@
#define IDC_BUTTON_LINE_REPORT2         1012
#define IDC_BUTTON_CONFIGURE_SPOOLING   1012
#define IDC_RADIO_DISABLE               1013
#define IDC_BUTTON_TRANSMIT_SPOOLED_DATA 1013
#define IDC_EDIT_CEID                   1014
#define IDC_BUTTON_PURGE_SPOOLED_DATA   1014
#define IDC_LIST1                       1015
#define IDC_EDIT_CE_NAME                1015
#define IDC_LIST2                       1016
SourceCode/Bond/HSMSSDK/Include/ISECS2Item.h
@@ -69,5 +69,6 @@
    virtual ISECS2Item* addU1Item(unsigned char value, const char* pszNote) = 0;
    virtual void setBinary(const char* pszData, unsigned int len, const char* pszNote) = 0;
    virtual void setString(const char* pszText, const char* pszNote) = 0;
    virtual void setU1(unsigned char value, const char* pszNote) = 0;
    virtual ISECS2Item* addItem() = 0;
};
SourceCode/Bond/Servo/CPageGraph2.cpp
@@ -284,7 +284,10 @@
            }
            */
            theApp.m_model.m_hsmsPassive.requestAlarmReport(1, 2, "abc");
            static int i = 0;
            i++;
            static char* pszText[] = {"123", "456", "789", "abc", "def"};
            theApp.m_model.m_hsmsPassive.requestAlarmReport(i%3, i, pszText[i%5]);
        }
SourceCode/Bond/Servo/HsmsAction.cpp
@@ -104,7 +104,7 @@
BOOL CHsmsAction::incrementAndCheckTimeout()
{
    unsigned int nResponseTime = InterlockedIncrement(&m_nResponseTime);
    return nResponseTime >= m_nTimeout;
    return nResponseTime >= m_nTimeout + 1;
}
int CHsmsAction::serialize(char* pszBuffer, int nBufferSize)
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -48,6 +48,7 @@
    m_listener.onCommand = nullptr;
    m_listener.onEQConstantRequest = nullptr;
    m_listener.onEQConstantSend = nullptr;
    m_pActiveAction = nullptr;
    InitializeCriticalSection(&m_criticalSection);
}
@@ -62,6 +63,10 @@
        delete item;
    }
    m_listActionSent.clear();
    for (auto item : m_listActionSpooling) {
        delete item;
    }
    m_listActionSpooling.clear();
    Unlock();
    if (m_hCimWorkEvent != NULL) {
@@ -151,11 +156,24 @@
{
    LOGI("onRecvMsg:%s", pMessage->toString());
    Lock();
    if (m_pActiveAction != nullptr &&
        (m_pActiveAction->getSendMessage()->getHeader()->systemBytes == pMessage->getHeader()->systemBytes)) {
        SetEvent(m_pActiveAction->getEvent());
        LOGI("CHsmsPassive::当前等待有回复");
        TRACE("CHsmsPassive::当前等待有回复\n");
        Unlock();
        return 0;
    }
    Unlock();
    Lock();
    CHsmsAction* pAction = nullptr;
    for (auto iter = m_listActionSent.begin(); iter != m_listActionSent.end(); iter++) {
        if ((*iter)->getSendMessage()->getHeader()->systemBytes == pMessage->getHeader()->systemBytes) {
            LOGI("CHsmsPassive::找到");
            pAction = (*iter);
            SetEvent(pAction->getEvent());
            m_listActionSent.erase(iter);
            break;
        }
@@ -527,6 +545,9 @@
        else if (nStream == 5 && pHeader->function == 3) {
            replyEanbleDisableAlarmReport(pMessage);
        }
        else if (nStream == 6 && pHeader->function == 23) {
            replyPurgeSpooledData(pMessage);
        }
        else if (nStream == 7 && pHeader->function == 19) {
            replyQueryPPIDList(pMessage);
        }
@@ -554,6 +575,42 @@
    return 0;
}
int CHsmsPassive::loadCacheFromFile(const char* pszFilepath)
{
    m_strCacheFilepath = pszFilepath;
    CFile file;
    if (!file.Open(m_strCacheFilepath.c_str(), CFile::modeRead) ) {
        return -1;
    }
    int nBufSize = file.GetLength();
    char* pszBuffer = new char[nBufSize];
    file.Read(pszBuffer, nBufSize);
    file.Close();
    int nRet = unserialize(pszBuffer, nBufSize);
    delete[] pszBuffer;
    return nRet;
}
int CHsmsPassive::saveCache()
{
    CFile file;
    if (!file.Open(m_strCacheFilepath.c_str(), CFile::modeWrite | CFile::modeCreate)) {
        return -1;
    }
    int nSize = serialize(nullptr, 0);
    char* pszBuffer = new char[nSize];
    int nRet = serialize(pszBuffer, nSize);
    file.Write(pszBuffer, nSize);
    file.Close();
    delete[] pszBuffer;
    return nRet;
}
int CHsmsPassive::term()
{
    // 结束线程
@@ -577,6 +634,53 @@
    return 0;
}
int CHsmsPassive::serialize(char* pszBuffer, int nBufferSize)
{
    int index = 0;
    if (pszBuffer == nullptr) {
        index += sizeof(int);
        for (auto item : m_listActionSpooling) {
            index += item->serialize(pszBuffer, nBufferSize);
        }
        return index;
    }
    else {
        int nTemp, nRet;
        nTemp = (int)m_listActionSpooling.size();
        memcpy(&pszBuffer[index], &nTemp, sizeof(int));
        index += sizeof(int);
        for (auto item : m_listActionSpooling) {
            nRet = item->serialize(&pszBuffer[index], nBufferSize);
            if (nRet <= 0) break;
            index += nRet;
        }
        return index;
    }
}
int CHsmsPassive::unserialize(const char* pszBuffer, int nBufferSize)
{
    int index = 0, nTemp, nRet = 0;
    if (index + sizeof(int) > nBufferSize) return -1;
    memcpy(&nTemp, &pszBuffer[index], sizeof(int));
    index += sizeof(int);
    for (int i = 0; i < nTemp; i++) {
        CHsmsAction* pAction = new CHsmsAction();
        nRet = pAction->unserialize(&pszBuffer[index], nBufferSize - index);
        if (nRet <= 0) break;
        index += nRet;
        m_listActionSpooling.push_back(pAction);
    }
    return index + nRet;
}
unsigned CHsmsPassive::OnCimWork()
{
    while (m_bCimWorking) {
@@ -595,17 +699,26 @@
        while (!list.empty()) {
            Lock();
            CHsmsAction* pAction = list.front();
            if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
                m_listActionSpooling.push_back(pAction);
                Unlock();
                continue;
            }
            Unlock();
            list.pop_front();
            TRACE("OnCimWork 004.\n");
            if (pAction->isNeedWaitReply()) {
                // 如果需要等待回复
                Lock();
                m_pActiveAction = pAction;
            IMessage* pMessage = pAction->getSendMessage();
                Unlock();
            ASSERT(pMessage);
            m_pPassive->sendMessage(pMessage);
            LOGI("<HSMS> [SEND] SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
            if (pAction->isNeedWaitReply()) {
                // 如果需要等待回复
                int nRet = WaitForSingleObject(pAction->getEvent(), pAction->getTimeout() * 1000);
                if (nRet == WAIT_TIMEOUT) {
                    TRACE("Timeout...\n");
@@ -616,18 +729,22 @@
                        //pContext->setEvent();
                    }
                }
                delete pAction;
                pAction = NULL;
                TRACE("delete m_pCurrentAction, next...\n");
                Lock();
                delete m_pActiveAction;
                m_pActiveAction = nullptr;
                Unlock();
            }
            else {
                Lock();
                m_listActionSent.push_back(pAction);
                IMessage* pMessage = pAction->getSendMessage();
                Unlock();
                ASSERT(pMessage);
                m_pPassive->sendMessage(pMessage);
                LOGI("<HSMS> [SEND] SysByte=%u sessionId:%d", pMessage->getHeader()->systemBytes, pMessage->getHeader()->sessionId);
            }
        }
        TRACE("OnCimWork \n");
@@ -732,6 +849,7 @@
    return 0;
}
// S1F13
int CHsmsPassive::replyEstablishCommunications(IMessage* pRecv)
{
    if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
@@ -1149,6 +1267,47 @@
    return 0;
}
// S6F23
int CHsmsPassive::replyPurgeSpooledData(IMessage* pRecv)
{
    if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
        return ER_NOTSELECT;
    }
    ISECS2Item* pBody = pRecv->getBody();
    if (pBody == nullptr || pBody->getType() != SITYPE::U1) ER_PARAM_ERROR;
    unsigned char RSDC;        // 0 - transmit; 1 - purge;
    pBody->getU1(RSDC);
    if (RSDC != 0 && RSDC != 1) ER_PARAM_ERROR;
    BYTE ACK = 0;        // 0 - ok;    1 - retryable busy;    2 - no spool data;
    if (m_listActionSpooling.empty()) {
        ACK = 2;
    }
    replyAck(6, 24, pRecv->getHeader()->systemBytes, ACK, "RSDA");
    // 丢弃
    if (RSDC == 1) {
        Lock();
        for (auto item : m_listActionSpooling) {
            delete item;
        }
        m_listActionSpooling.clear();
        Unlock();
    }
    else {
        Lock();
        for (auto item : m_listActionSpooling) {
            m_listAction.push_back(item);
        }
        m_listActionSpooling.clear();
        Unlock();
        SetEvent(m_hCimWorkEvent);
    }
    return 0;
}
// S7F19
int CHsmsPassive::replyQueryPPIDList(IMessage* pRecv)
{
@@ -1209,16 +1368,12 @@
// S5F1
int CHsmsPassive::requestAlarmReport(int ALCD, int ALID, const char* ALTX)
{
    if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
        return ER_NOTSELECT;
    }
    char szALCD[1];
    szALCD[0] = ALCD & 0xff;
    Lock();
    CHsmsAction* pAction = new CHsmsAction(ACTION_ALARM_REPORT, TRUE, m_nActionTimeout);
    m_listAction.push_back(pAction);
    IMessage* pMessage = NULL;
    HSMS_Create1Message(pMessage, m_nSessionId, 5 | REPLY, 1, ++m_nSystemByte);
    ASSERT(pMessage);
@@ -1227,21 +1382,14 @@
    pItem->addU4Item(ALID, "ALID");
    pItem->addItem(ALTX, "ALTX");
    pAction->setSendMessage(pMessage);
    SetEvent(m_hCimWorkEvent);
    Unlock();
    int size = pAction->serialize(nullptr, 0);;
    if (size > 0) {
        char* pszBuffer = new char[size];
        pAction->serialize(pszBuffer, size);
        AfxMessageBox("abc");
        CHsmsAction* pAction2 = new CHsmsAction();
        pAction2->unserialize(pszBuffer, size);
        AfxMessageBox("def");
        m_pPassive->sendMessage(pAction2->getSendMessage());
    if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
        m_listActionSpooling.push_back(pAction);
    }
    else {
        m_listAction.push_back(pAction);
        SetEvent(m_hCimWorkEvent);
    }
    Unlock();
    return ER_NOERROR;
}
@@ -1249,10 +1397,6 @@
// S6F11
int CHsmsPassive::requestEventReportSend(unsigned int DATAID, unsigned int CEID, const std::vector<std::string>& values)
{
    if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
        return ER_NOTSELECT;
    }
    SERVO::CCollectionEvent* pEvent = getEvent(CEID);
    if (pEvent == nullptr) {
        return ER_NO_EVENT;
@@ -1263,7 +1407,6 @@
    Lock();
    CHsmsAction* pAction = new CHsmsAction(ACTION_EVENT_REPORT, TRUE, m_nActionTimeout);
    m_listAction.push_back(pAction);
    IMessage* pMessage = NULL;
    HSMS_Create1Message(pMessage, m_nSessionId, 6 | REPLY, 11, ++m_nSystemByte);
    ASSERT(pMessage);
@@ -1278,8 +1421,13 @@
        pItemList3->addItem(item.c_str(), "V");
    }
    pAction->setSendMessage(pMessage);
    if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
        m_listActionSpooling.push_back(pAction);
    }
    else {
        m_listAction.push_back(pAction);
    SetEvent(m_hCimWorkEvent);
    }
    Unlock();
    
    return ER_NOERROR;
SourceCode/Bond/Servo/HsmsPassive.h
@@ -142,7 +142,11 @@
    void OnTimer(UINT nTimerid);
    void setActionTimeout(int nSecond);
    int init(CModel* pModel, const char* pszName, unsigned int port);
    int loadCacheFromFile(const char* pszFilepath);
    int saveCache();
    int term();
    int serialize(char* pszBuffer, int nBufferSize);
    int unserialize(const char* pszBuffer, int nBufferSize);
public:
    /* request开头的函数为主动发送数据的函数 */
@@ -167,6 +171,7 @@
    int replyCommand(IMessage* pRecv);
    int replyConfigureSpooling(IMessage* pRecv);
    int replyEanbleDisableAlarmReport(IMessage* pRecv);
    int replyPurgeSpooledData(IMessage* pRecv);
    int replyQueryPPIDList(IMessage* pRecv);
    int replyTerminalDisplay(IMessage* pRecv);
@@ -189,6 +194,7 @@
    CRITICAL_SECTION m_criticalSection;
    std::list<CHsmsAction*> m_listAction;
    std::list<CHsmsAction*> m_listActionSent;
    std::list<CHsmsAction*> m_listActionSpooling;
private:
    SECSListener m_listener;
@@ -196,6 +202,8 @@
    HANDLE m_hCimWorkEvent;
    HANDLE m_hCimWorkThreadHandle;
    unsigned m_nCimWorkThrdaddr;
    std::string m_strCacheFilepath;
    CHsmsAction* m_pActiveAction;
private:
    // CVariable vector
SourceCode/Bond/Servo/Model.cpp
@@ -148,6 +148,8 @@
    m_hsmsPassive.loadReports((LPTSTR)(LPCTSTR)strVarialbleFile);
    strVarialbleFile.Format(_T("%s\\CollectionEventList.txt"), (LPTSTR)(LPCTSTR)m_strWorkDir);
    m_hsmsPassive.loadCollectionEvents((LPTSTR)(LPCTSTR)strVarialbleFile);
    strVarialbleFile.Format(_T("%s\\HsmsPassive.cache"), (LPTSTR)(LPCTSTR)m_strWorkDir);
    m_hsmsPassive.loadCacheFromFile(strVarialbleFile);
    SERVO::MasterListener masterListener;
@@ -337,6 +339,7 @@
int CModel::term()
{
    m_hsmsPassive.saveCache();
    m_hsmsPassive.term();
    CLog::GetLog()->SetOnLogCallback(nullptr);
    m_master.term();