1.SECS,实现S2F15(Equipment Constant Send)的回复,目前仅打印显示数据,待机器端确认相关逻辑后再保存和设置机器数据。
2.修改和完善S2F13,与S2F15靠拢,并使用相同的数据结构和回调函数到应用层;
已修改3个文件
98 ■■■■ 文件已修改
SourceCode/Bond/Servo/HsmsPassive.cpp 64 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.h 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -65,6 +65,7 @@
void CHsmsPassive::setListener(SECSListener listener)
{
    m_listener.onEQConstantRequest = listener.onEQConstantRequest;
    m_listener.onEQConstantSend = listener.onEQConstantSend;
}
void CHsmsPassive::setActionTimeout(int nSecond)
@@ -189,7 +190,10 @@
            replyEstablishCommunications(pMessage);
        }
        else if (nStream == 2 && pHeader->function == 13) {
            replyEquipmentConstant(pMessage);
            replyEquipmentConstantRequest(pMessage);
        }
        else if (nStream == 2 && pHeader->function == 15) {
            replyEquipmentConstantSend(pMessage);
        }
        else if (nStream == 2 && pHeader->function == 31) {
            replyDatetime(pMessage);
@@ -386,7 +390,7 @@
}
// S2F13
int CHsmsPassive::replyEquipmentConstant(IMessage* pRecv)
int CHsmsPassive::replyEquipmentConstantRequest(IMessage* pRecv)
{
    if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
        return ER_NOTSELECT;
@@ -395,23 +399,24 @@
    // 要获取的常量表表
    BOOL bCheckData = FALSE;
    std::vector<unsigned int> ecids;
    std::vector<EQConstant> eqcs;
    {
        ISECS2Item* pItem = pRecv->getBody();
        int ecidSize = pItem->getSubItemSize();
        for (int i = 0; i < ecidSize; i++) {
            EQConstant eqc;
            unsigned short id;
            if (pItem->getSubItemU2(i, id)) {
                ecids.push_back((int)id);
                eqc.id = id;
                eqcs.push_back(eqc);
            }
        }
    }
    // 交由上层应用来获取机器常量值
    std::vector<unsigned int> ecvs;
    if (m_listener.onEQConstantRequest != nullptr) {
        m_listener.onEQConstantRequest(this, ecids, ecvs);
        m_listener.onEQConstantRequest(this, eqcs);
    }
@@ -420,8 +425,8 @@
    HSMS_Create1Message(pMessage, m_nSessionId, 1, 14, pRecv->getHeader()->systemBytes);
    ASSERT(pMessage);
    ISECS2Item* pItem = pMessage->getBody();
    for (auto item : ecvs) {
        pItem->addU2Item(item, "ECV");
    for (auto& item : eqcs) {
        pItem->addItem(item.szValue, "ECV");
    }
    m_pPassive->sendMessage(pMessage);
@@ -431,6 +436,49 @@
    return 0;
}
// S2F15
int CHsmsPassive::replyEquipmentConstantSend(IMessage* pRecv)
{
    if (m_pPassive == NULL || STATE::SELECTED != m_pPassive->getState()) {
        return ER_NOTSELECT;
    }
    // 要设置的常量表表
    BOOL bCheckData = FALSE;
    std::vector<EQConstant> eqcs;
    {
        ISECS2Item* pItem = pRecv->getBody();
        int ecidSize = pItem->getSubItemSize();
        for (int i = 0; i < ecidSize; i++) {
            ISECS2Item* pItemEqc = pItem->getSubItem(i);
            if (pItemEqc != nullptr) {
                EQConstant eqc;
                unsigned short eqcid;
                const char* pszValue;
                if (pItemEqc->getSubItemU2(0, eqcid)
                    && pItemEqc->getSubItemString(1, pszValue)) {
                    eqc.id = eqcid;
                    strcpy_s(eqc.szValue, 256, pszValue);
                    eqcs.push_back(eqc);
                }
            }
        }
    }
    // 交由上层应用来保存和设置机器常量值
    std::vector<unsigned int> ecvs;
    if (m_listener.onEQConstantSend != nullptr) {
        m_listener.onEQConstantSend(this, eqcs);
    }
    // 回复
    replyAck(2, 16, pRecv->getHeader()->systemBytes, BYTE(0), "EACK");
    return 0;
}
// S2F31
int CHsmsPassive::replyDatetime(IMessage* pRecv)
{
SourceCode/Bond/Servo/HsmsPassive.h
@@ -11,13 +11,24 @@
#define ER_BUSY                -2
#define ER_PARAM_ERROR        -3
typedef std::function<void(void* pFrom, const std::vector<unsigned int>& ecids,
    std::vector<unsigned int>& ecvs)> SECSEQCONSTANTREQUEST;
typedef std::function<void(void* pFrom, int error)> ONDATAERROR;
/*
 * 常量数据结构
 */
typedef struct _EQConstant
{
    unsigned int id;
    char szValue[256];
} EQConstant;
typedef std::function<void(void* pFrom, std::vector<EQConstant>&)> SECSEQCONSTANTREQUEST;
typedef struct _SECSListener
{
    SECSEQCONSTANTREQUEST        onEQConstantRequest;
    SECSEQCONSTANTREQUEST        onEQConstantSend;
} SECSListener;
class CModel;
class CHsmsPassive
@@ -51,7 +62,8 @@
    /* reply开头的函数为回复函数 */
    int replyAreYouThere(IMessage* pRecv);
    int replyEstablishCommunications(IMessage* pRecv);
    int replyEquipmentConstant(IMessage* pRecv);
    int replyEquipmentConstantRequest(IMessage* pRecv);
    int replyEquipmentConstantSend(IMessage* pRecv);
    int replyDatetime(IMessage* pRecv);
    int replyEanbleDisableEventReport(IMessage* pRecv);
    int replyEanbleDisableAlarmReport(IMessage* pRecv);
SourceCode/Bond/Servo/Model.cpp
@@ -58,13 +58,19 @@
    SECSListener listener;
    listener.onEQConstantRequest = [&](void* pFrom, const std::vector<unsigned int>& ecids,
        std::vector<unsigned int>& ecvs) -> void {
    listener.onEQConstantRequest = [&](void* pFrom, std::vector<EQConstant>& eqcs) -> void {
        // 在此填充常量值,目前仅是加1后返回
        for (auto item : ecids) {
            ecvs.push_back(item + 1);
        for (auto& item : eqcs) {
            sprintf_s(item.szValue, 256, "Test%d", item.id+1);
        }
    };
    listener.onEQConstantSend = [&](void* pFrom, std::vector<EQConstant>& eqcs) -> void {
        // 在此保存和设置机器常量值
        for (auto& item : eqcs) {
            LOGI("onEQConstantRequest: %d, %s", item.id, item.szValue);
        }
    };
    m_hsmsPassive.setListener(listener);
    m_hsmsPassive.setEquipmentModelType((LPTSTR)(LPCTSTR)strModeType);
    m_hsmsPassive.setSoftRev((LPTSTR)(LPCTSTR)strSoftRev);