LAPTOP-SNT8I5JK\Boounion
2025-07-15 e48a55eb3cc807fa5a45cf398b6f523e96aa5312
1.Variable列表显示到界面;
2.从文件中加载CReport列表;
已添加5个文件
已修改13个文件
636 ■■■■ 文件已修改
SourceCode/Bond/Servo/CPageReport.cpp 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageReport.h 33 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageVarialbles.cpp 133 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageVarialbles.h 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CReport.cpp 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CReport.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CVariable.cpp 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CVariable.h 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.cpp 167 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/HsmsPassive.h 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Model.cpp 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.rc 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/Servo.vcxproj.filters 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/ServoDlg.cpp 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/resource.h 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/ReportList.txt 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/x64/Debug/VariableList.txt 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageReport.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,115 @@
// CPageReport.cpp: å®žçŽ°æ–‡ä»¶
//
#include "stdafx.h"
#include "Servo.h"
#include "CPageReport.h"
#include "afxdialogex.h"
// CPageReport å¯¹è¯æ¡†
IMPLEMENT_DYNAMIC(CPageReport, CHMPropertyPage)
CPageReport::CPageReport(CWnd* pParent /*=nullptr*/)
    : CHMPropertyPage(IDD_PAGE_REPORT, pParent)
{
}
CPageReport::~CPageReport()
{
}
void CPageReport::DoDataExchange(CDataExchange* pDX)
{
    CHMPropertyPage::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST1, m_listCtrl);
}
BEGIN_MESSAGE_MAP(CPageReport, CHMPropertyPage)
    ON_WM_CTLCOLOR()
    ON_WM_DESTROY()
    ON_WM_SIZE()
END_MESSAGE_MAP()
// CPageReport æ¶ˆæ¯å¤„理程序
BOOL CPageReport::OnInitDialog()
{
    CHMPropertyPage::OnInitDialog();
    // è¯»å‡ºåˆ—宽
    CString strIniFile, strItem;
    strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
    int width[8] = { 0, 218, 180, 180, 180, 180, 180, 180 };
    for (int i = 0; i < 8; i++) {
        strItem.Format(_T("Col_%d_Width"), i);
        width[i] = GetPrivateProfileInt("PageReportListCtrl", strItem, width[i], strIniFile);
    }
    // æŠ¥è¡¨æŽ§ä»¶
    DWORD dwStyle = m_listCtrl.GetExtendedStyle();
    dwStyle |= LVS_EX_FULLROWSELECT;
    dwStyle |= LVS_EX_GRIDLINES;
    m_listCtrl.SetExtendedStyle(dwStyle);
    HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1);
    ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL);
    m_listCtrl.InsertColumn(0, _T(""), LVCFMT_RIGHT, width[0]);
    m_listCtrl.InsertColumn(1, _T("RPT ID"), LVCFMT_LEFT, width[1]);
    m_listCtrl.InsertColumn(2, _T("VID"), LVCFMT_LEFT, width[2]);
    // loadVariables();
    return TRUE;  // return TRUE unless you set the focus to a control
                  // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
    return TRUE;  // return TRUE unless you set the focus to a control
                  // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
}
HBRUSH CPageReport::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CHMPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);
    // TODO:  åœ¨æ­¤æ›´æ”¹ DC çš„任何特性
    // TODO:  å¦‚果默认的不是所需画笔,则返回另一个画笔
    return hbr;
}
void CPageReport::OnDestroy()
{
    CHMPropertyPage::OnDestroy();
    // ä¿å­˜åˆ—宽
    CString strIniFile, strItem, strTemp;
    strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
    CHeaderCtrl* pHeader = m_listCtrl.GetHeaderCtrl();
    for (int i = 0; i < pHeader->GetItemCount(); i++) {
        RECT rect;
        pHeader->GetItemRect(i, &rect);
        strItem.Format(_T("Col_%d_Width"), i);
        strTemp.Format(_T("%d"), rect.right - rect.left);
        WritePrivateProfileString("PageReportListCtrl", strItem, strTemp, strIniFile);
    }
}
void CPageReport::OnSize(UINT nType, int cx, int cy)
{
    CHMPropertyPage::OnSize(nType, cx, cy);
    if (GetDlgItem(IDC_LIST1) == nullptr) return;
    CWnd* pItem;
    CRect rcClient, rcItem;
    GetClientRect(&rcClient);
    m_listCtrl.MoveWindow(12, 12, rcClient.Width() - 24, rcClient.Height() - 24);
}
SourceCode/Bond/Servo/CPageReport.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,33 @@
#pragma once
#include "CHMPropertyPage.h"
#include "ListCtrlEx.h"
// CPageReport å¯¹è¯æ¡†
class CPageReport : public CHMPropertyPage
{
    DECLARE_DYNAMIC(CPageReport)
public:
    CPageReport(CWnd* pParent = nullptr);   // æ ‡å‡†æž„造函数
    virtual ~CPageReport();
private:
    CListCtrlEx m_listCtrl;
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_PAGE_REPORT };
#endif
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    DECLARE_MESSAGE_MAP()
public:
    virtual BOOL OnInitDialog();
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    afx_msg void OnDestroy();
    afx_msg void OnSize(UINT nType, int cx, int cy);
};
SourceCode/Bond/Servo/CPageVarialbles.cpp
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,133 @@
// CPageVarialbles.cpp: å®žçŽ°æ–‡ä»¶
//
#include "stdafx.h"
#include "Servo.h"
#include "CPageVarialbles.h"
#include "afxdialogex.h"
// CPageVarialbles å¯¹è¯æ¡†
IMPLEMENT_DYNAMIC(CPageVarialbles, CHMPropertyPage)
CPageVarialbles::CPageVarialbles(CWnd* pParent /*=nullptr*/)
    : CHMPropertyPage(IDD_PAGE_VARIABLE, pParent)
{
}
CPageVarialbles::~CPageVarialbles()
{
}
void CPageVarialbles::DoDataExchange(CDataExchange* pDX)
{
    CHMPropertyPage::DoDataExchange(pDX);
    DDX_Control(pDX, IDC_LIST1, m_listCtrl);
}
BEGIN_MESSAGE_MAP(CPageVarialbles, CHMPropertyPage)
    ON_WM_CTLCOLOR()
    ON_WM_DESTROY()
    ON_WM_SIZE()
END_MESSAGE_MAP()
// CPageVarialbles æ¶ˆæ¯å¤„理程序
BOOL CPageVarialbles::OnInitDialog()
{
    CHMPropertyPage::OnInitDialog();
    // è¯»å‡ºåˆ—宽
    CString strIniFile, strItem;
    strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
    int width[8] = { 0, 218, 180, 180, 180, 180, 180, 180 };
    for (int i = 0; i < 8; i++) {
        strItem.Format(_T("Col_%d_Width"), i);
        width[i] = GetPrivateProfileInt("PageVariableListCtrl", strItem, width[i], strIniFile);
    }
    // æŠ¥è¡¨æŽ§ä»¶
    DWORD dwStyle = m_listCtrl.GetExtendedStyle();
    dwStyle |= LVS_EX_FULLROWSELECT;
    dwStyle |= LVS_EX_GRIDLINES;
    m_listCtrl.SetExtendedStyle(dwStyle);
    HIMAGELIST imageList = ImageList_Create(24, 24, ILC_COLOR24, 1, 1);
    ListView_SetImageList(m_listCtrl.GetSafeHwnd(), imageList, LVSIL_SMALL);
    m_listCtrl.InsertColumn(0, _T(""), LVCFMT_RIGHT, width[0]);
    m_listCtrl.InsertColumn(1, _T("SV ID"), LVCFMT_LEFT, width[1]);
    m_listCtrl.InsertColumn(2, _T("SV Name"), LVCFMT_LEFT, width[2]);
    m_listCtrl.InsertColumn(3, _T("SV Format"), LVCFMT_LEFT, width[3]);
    m_listCtrl.InsertColumn(4, _T("SV Remark"), LVCFMT_LEFT, width[4]);
    loadVariables();
    return TRUE;  // return TRUE unless you set the focus to a control
                  // å¼‚常: OCX å±žæ€§é¡µåº”返回 FALSE
}
HBRUSH CPageVarialbles::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CHMPropertyPage::OnCtlColor(pDC, pWnd, nCtlColor);
    // TODO:  åœ¨æ­¤æ›´æ”¹ DC çš„任何特性
    // TODO:  å¦‚果默认的不是所需画笔,则返回另一个画笔
    return hbr;
}
void CPageVarialbles::OnDestroy()
{
    CHMPropertyPage::OnDestroy();
    // ä¿å­˜åˆ—宽
    CString strIniFile, strItem, strTemp;
    strIniFile.Format(_T("%s\\configuration.ini"), (LPTSTR)(LPCTSTR)theApp.m_strAppDir);
    CHeaderCtrl* pHeader = m_listCtrl.GetHeaderCtrl();
    for (int i = 0; i < pHeader->GetItemCount(); i++) {
        RECT rect;
        pHeader->GetItemRect(i, &rect);
        strItem.Format(_T("Col_%d_Width"), i);
        strTemp.Format(_T("%d"), rect.right - rect.left);
        WritePrivateProfileString("PageVariableListCtrl", strItem, strTemp, strIniFile);
    }
}
void CPageVarialbles::OnSize(UINT nType, int cx, int cy)
{
    CHMPropertyPage::OnSize(nType, cx, cy);
    if (GetDlgItem(IDC_LIST1) == nullptr) return;
    CWnd* pItem;
    CRect rcClient, rcItem;
    GetClientRect(&rcClient);
    m_listCtrl.MoveWindow(12, 12, rcClient.Width() - 24, rcClient.Height() - 24);
}
void CPageVarialbles::OnApply()
{
    __super::OnApply();
}
void CPageVarialbles::loadVariables()
{
    auto& variables = theApp.m_model.m_hsmsPassive.getVariables();
    for (auto item : variables) {
        int index = m_listCtrl.InsertItem(m_listCtrl.GetItemCount(), _T(""));
        m_listCtrl.SetItemData(index, (DWORD_PTR)item);
        m_listCtrl.SetItemText(index, 1, std::to_string(item->getVarialbleId()).c_str());
        m_listCtrl.SetItemText(index, 2, item->getName().c_str());
        m_listCtrl.SetItemText(index, 3, SERVO::CVariable::formatToString(item->getFormat()).c_str());
        m_listCtrl.SetItemText(index, 4, item->getRemark().c_str());
    }
}
SourceCode/Bond/Servo/CPageVarialbles.h
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
#pragma once
#include "CHMPropertyPage.h"
#include "ListCtrlEx.h"
// CPageVarialbles å¯¹è¯æ¡†
class CPageVarialbles : public CHMPropertyPage
{
    DECLARE_DYNAMIC(CPageVarialbles)
public:
    CPageVarialbles(CWnd* pParent = nullptr);   // æ ‡å‡†æž„造函数
    virtual ~CPageVarialbles();
    virtual void OnApply();
    void loadVariables();
private:
    CListCtrlEx m_listCtrl;
// å¯¹è¯æ¡†æ•°æ®
#ifdef AFX_DESIGN_TIME
    enum { IDD = IDD_PAGE_VARIABLE };
#endif
protected:
    virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV æ”¯æŒ
    DECLARE_MESSAGE_MAP()
public:
    virtual BOOL OnInitDialog();
    afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
    afx_msg void OnDestroy();
    afx_msg void OnSize(UINT nType, int cx, int cy);
};
SourceCode/Bond/Servo/CReport.cpp
@@ -5,7 +5,12 @@
namespace SERVO {
    CReport::CReport()
    {
        m_nReportId = 0;
    }
    CReport::CReport(unsigned int reportId)
    {
        m_nReportId = reportId;
    }
    CReport::~CReport()
SourceCode/Bond/Servo/CReport.h
@@ -7,6 +7,7 @@
    {
    public:
        CReport();
        CReport(unsigned int reportId);
        virtual ~CReport();
    public:
SourceCode/Bond/Servo/CVariable.cpp
@@ -46,6 +46,28 @@
        return SVFromat::U1;
    }
    std::string CVariable::formatToString(SVFromat format)
    {
        if (SVFromat::U1 == format) {
            return "U1";
        }
        if (SVFromat::U2 == format) {
            return "U1";
        }
        if (SVFromat::I2 == format) {
            return "I2";
        }
        if (SVFromat::A50 == format) {
            return "A50";
        }
        if (SVFromat::A20 == format) {
            return "A20";
        }
        return "U1";
    }
    unsigned int CVariable::getVarialbleId()
    {
        return m_nVarialbeId;
SourceCode/Bond/Servo/CVariable.h
@@ -21,6 +21,7 @@
    public:
        static SVFromat toFormat(const char* pszFormat);
        static std::string formatToString(SVFromat format);
        unsigned int getVarialbleId();
        std::string& getName();
        SVFromat getFormat();
SourceCode/Bond/Servo/HsmsPassive.cpp
@@ -1,4 +1,4 @@
#include "stdafx.h"
#include "stdafx.h"
#include "HsmsPassive.h"
#include "Log.h"
#include "Model.h"
@@ -117,7 +117,7 @@
{
    for (auto it = m_mapReportIdToCEID.begin(); it != m_mapReportIdToCEID.end(); ) {
        if (it->second == CEID) {
            m_mapReportIdToCEID.erase(it++);  // æ›´æ–°è¿­ä»£å™¨
            m_mapReportIdToCEID.erase(it++);  // æ›´æ–°è¿­ä»£å™¨
        }
        else {
            ++it;
@@ -137,7 +137,7 @@
{
    for (auto it = m_mapValueIdToPRTID.begin(); it != m_mapValueIdToPRTID.end(); ) {
        if (it->second == RPTID) {
            m_mapValueIdToPRTID.erase(it++);  // æ›´æ–°è¿­ä»£å™¨
            m_mapValueIdToPRTID.erase(it++);  // æ›´æ–°è¿­ä»£å™¨
        }
        else {
            ++it;
@@ -157,11 +157,11 @@
void CHsmsPassive::OnTimer(UINT nTimerid)
{
    // æ‰€æœ‰å·²å‘送的Action自加1
    // æ‰€æœ‰å·²å‘送的Action自加1
    Lock();
    for (auto iter = m_listActionSent.begin(); iter != m_listActionSent.end();) {
        if ((*iter)->incrementAndCheckTimeout()) {
            TRACE("CHsmsPassive::超时\n");
            TRACE("CHsmsPassive::超时\n");
            delete (*iter);
            m_listActionSent.erase(iter++);
        }
@@ -179,7 +179,7 @@
    CHsmsAction* pAction = nullptr;
    for (auto iter = m_listActionSent.begin(); iter != m_listActionSent.end(); iter++) {
        if ((*iter)->getSendMessage()->getHeader()->systemBytes == pMessage->getHeader()->systemBytes) {
            LOGI("CHsmsPassive::找到");
            LOGI("CHsmsPassive::找到");
            pAction = (*iter);
            m_listActionSent.erase(iter);
            break;
@@ -188,7 +188,7 @@
    Unlock();
    if (pAction != nullptr) {
        LOGI("onRecvMsg::相应处理");
        LOGI("onRecvMsg::相应处理");
        delete pAction;
    }
@@ -196,14 +196,14 @@
    return 0;
}
int CHsmsPassive::loadVarialbleList(const char* pszFilepath)
int CHsmsPassive::loadVarialbles(const char* pszFilepath)
{
    CStdioFile file;
    if (!file.Open(pszFilepath, CFile::modeRead)) {
        return -1;
    }
    std::regex pattern("^\\d+,.*");  // åŒ¹é…ä»¥æ•°å­—+逗号开头的字符串
    std::regex pattern("^\\d+,.*");  // åŒ¹é…ä»¥æ•°å­—+逗号开头的字符串
    std::vector<SERVO::CVariable*> variables;
    int index, last;
    CString strLine;
@@ -228,6 +228,7 @@
        if (index < 0) continue;
        strFormat = strLine.Mid(last, index - last);
        strRemark = strLine.Right(strLine.GetLength() - index - 1);
        strRemark.Replace(_T("\\r\\n"), _T("\r\n"));
        SERVO::CVariable* pVarialble = new SERVO::CVariable(
            (LPTSTR)(LPCTSTR)strId, (LPTSTR)(LPCTSTR)strName, (LPTSTR)(LPCTSTR)strFormat, (LPTSTR)(LPCTSTR)strRemark);
@@ -246,12 +247,112 @@
    return 0;
}
std::vector<SERVO::CVariable*>& CHsmsPassive::getVariables()
{
    return m_variabels;
}
SERVO::CVariable* CHsmsPassive::getVariable(int variableId)
{
    for (auto item : m_variabels) {
        if (item->getVarialbleId() == variableId) {
            return item;
        }
    }
    return nullptr;
}
void CHsmsPassive::clearAllVariabel()
{
    for (auto item : m_variabels) {
        delete item;
    }
    m_variabels.clear();
}
int CHsmsPassive::loadReports(const char* pszFilepath)
{
    CStdioFile file;
    if (!file.Open(pszFilepath, CFile::modeRead)) {
        return -1;
    }
    std::regex pattern("^\\d+,\\(\\d+(,\\d+)*\\).*");  // åŒ¹é…ä»¥æ•°å­—+逗号开头的字符串
    std::vector<SERVO::CReport*> reports;
    int index;
    CString strLine, strVariable;
    CString strId, strName, strFormat, strRemark;
    while (file.ReadString(strLine)) {
        if (!std::regex_match((LPTSTR)(LPCTSTR)strLine, pattern)) {
            continue;
        }
        index = strLine.Find(",", 0);
        if (index < 0) continue;
        strId = strLine.Left(index);
        strVariable = strLine.Right(strLine.GetLength() - index - 1);
        strVariable.Delete(0);
        strVariable.Delete(strVariable.GetLength() - 1);
        auto vids = parseVidList(strVariable);
        SERVO::CReport* pReport = new SERVO::CReport(atoi((LPTSTR)(LPCTSTR)strId));
        for (auto vid : vids) {
            SERVO::CVariable* pVariable = getVariable(vid);
            if (pVariable != nullptr) {
                pReport->addVariable(pVariable);
            }
        }
        reports.push_back(pReport);
    }
    if (!reports.empty()) {
        clearAllReport();
        for (auto item : reports) {
            m_reports.push_back(item);
        }
    }
    file.Close();
    return 0;
}
std::vector<SERVO::CReport*>& CHsmsPassive::getReports()
{
    return m_reports;
}
void CHsmsPassive::clearAllReport()
{
    for (auto item : m_reports) {
        delete item;
    }
    m_reports.clear();
}
std::vector<int> CHsmsPassive::parseVidList(CString& strNums)
{
    // 1. å…ˆåŽ»æŽ‰å¯èƒ½å‡ºçŽ°çš„ç©ºç™½ç¬¦ï¼ˆç©ºæ ¼ã€åˆ¶è¡¨ç¬¦ç­‰ï¼‰
    strNums.Trim();
    // 2️.
    std::vector<int> result;
    int i = 0;
    CString strVid;
    while (1) {
        if (!AfxExtractSubString(strVid, (LPCTSTR)strNums, i, ',')) {
            break;
        }
        if (!strVid.IsEmpty())                 // é˜²å¾¡æ€§æ£€æŸ¥
            result.push_back(std::stoi((LPTSTR)(LPCTSTR)strVid));
        i++;
    }
    return result;
}
int CHsmsPassive::init(CModel* pModel, const char* pszName, unsigned int port)
@@ -264,8 +365,8 @@
    auto onStatusChanged = [&](void* pFrom, STATE state) -> void {
        m_pModel->notifyInt(RX_CODE_PASSIVE_STATUS_CHANGED, (int)state);
        // è¿žä¸Šä¹‹åŽå‘S1F1
        // ä¿®æ”¹ä¸ºä¸ä¸»åŠ¨å‘é€ï¼Œè€Œæ˜¯å“åº”
        // è¿žä¸Šä¹‹åŽå‘S1F1
        // ä¿®æ”¹ä¸ºä¸ä¸»åŠ¨å‘é€ï¼Œè€Œæ˜¯å“åº”
        /*
        if (STATE::SELECTED == state) {
            m_bAreYouThereRequest = FALSE;
@@ -304,7 +405,7 @@
        HEADER* pHeader = pMessage->getHeader();
        int nStream = (pHeader->stream & 0x7F);
        LOGI("<HSMS>收到消息 S%dF%d", nStream, pHeader->function);
        LOGI("<HSMS>收到消息 S%dF%d", nStream, pHeader->function);
        if (nStream == 1 && pHeader->function == 1) {
            // S1F1
            replyAreYouThere(pMessage);
@@ -358,7 +459,7 @@
    listener.funError = onError;
    m_pPassive->setListener(listener);
    // å¯åŠ¨å·¥ä½œçº¿ç¨‹
    // å¯åŠ¨å·¥ä½œçº¿ç¨‹
    m_bCimWorking = TRUE;
    m_hCimWorkThreadHandle = (HANDLE)_beginthreadex(NULL, 0, ::CimWorkThreadFunction, this,
        0, &m_nCimWorkThrdaddr);
@@ -371,7 +472,7 @@
int CHsmsPassive::term()
{
    // ç»“束线程
    // ç»“束线程
    m_bCimWorking = FALSE;
    SetEvent(m_hCimWorkEvent);
    if (m_hCimWorkThreadHandle != NULL) {
@@ -394,12 +495,12 @@
{
    while (m_bCimWorking) {
        // å¾…退出信号或时间到
        // å¾…退出信号或时间到
        int nRet = WaitForSingleObject(m_hCimWorkEvent, INFINITE);
        ResetEvent(m_hCimWorkEvent);
        if (!m_bCimWorking) break;
        // å–出请求列表并进行处理
        // å–出请求列表并进行处理
        std::list<CHsmsAction*> list;
        Lock();
        list.splice(list.end(), m_listAction);
@@ -418,14 +519,14 @@
            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");
                    CContext* pContext = pAction->getContext();
                    if (pContext != NULL) {
                        //pContext->setRetCode(CRC_TIMEOUT);
                        //pContext->setRetMsg("超时");
                        //pContext->setRetMsg("超时");
                        //pContext->setEvent();
                    }
                }
@@ -451,7 +552,7 @@
    return 0;
}
// é€šç”¨çš„reply ack函数
// é€šç”¨çš„reply ack函数
void CHsmsPassive::replyAck(int s, int f, unsigned int systemBytes, BYTE ack, const char* pszAckName)
{
    IMessage* pMessage = NULL;
@@ -514,13 +615,13 @@
    }
    // äº¤ç”±ä¸Šå±‚应用来获取机器常量值
    // äº¤ç”±ä¸Šå±‚应用来获取机器常量值
    if (m_listener.onEQOffLine != nullptr) {
        m_listener.onEQOffLine(this);
    }
    // å›žå¤
    // å›žå¤
    replyAck(1, 16, pRecv->getHeader()->systemBytes, BYTE(0), "OFLACK");
    return 0;
}
@@ -533,13 +634,13 @@
    }
    // äº¤ç”±ä¸Šå±‚应用来获取机器常量值
    // äº¤ç”±ä¸Šå±‚应用来获取机器常量值
    if (m_listener.onEQOnLine != nullptr) {
        m_listener.onEQOnLine(this);
    }
    // å›žå¤
    // å›žå¤
    replyAck(1, 18, pRecv->getHeader()->systemBytes, BYTE(0), "ONLACK");
    return 0;
}
@@ -574,7 +675,7 @@
    }
    // è¦èŽ·å–çš„å¸¸é‡è¡¨è¡¨
    // è¦èŽ·å–çš„å¸¸é‡è¡¨è¡¨
    BOOL bCheckData = FALSE;
    std::vector<EQConstant> eqcs;
    {
@@ -591,13 +692,13 @@
    }
    // äº¤ç”±ä¸Šå±‚应用来获取机器常量值
    // äº¤ç”±ä¸Šå±‚应用来获取机器常量值
    if (m_listener.onEQConstantRequest != nullptr) {
        m_listener.onEQConstantRequest(this, eqcs);
    }
    // å›žå¤
    // å›žå¤
    IMessage* pMessage = NULL;
    HSMS_Create1Message(pMessage, m_nSessionId, 1, 14, pRecv->getHeader()->systemBytes);
    ASSERT(pMessage);
@@ -621,7 +722,7 @@
    }
    // è¦è®¾ç½®çš„常量表表
    // è¦è®¾ç½®çš„常量表表
    BOOL bCheckData = FALSE;
    std::vector<EQConstant> eqcs;
    {
@@ -644,14 +745,14 @@
    }
    // äº¤ç”±ä¸Šå±‚应用来保存和设置机器常量值
    // äº¤ç”±ä¸Šå±‚应用来保存和设置机器常量值
    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;
}
@@ -666,7 +767,7 @@
    if (pBody == nullptr || pBody->getType() != SITYPE::A) ER_PARAM_ERROR;
    const char* pszMessage;
    if (pBody->getString(pszMessage)) {
        // æ›´æ–°æ—¶é—´
        // æ›´æ–°æ—¶é—´
        SYSTEMTIME time;
        char szBuffer[20];
        memcpy(szBuffer, pszMessage, 16);
@@ -733,7 +834,7 @@
MYREPLY:
    // æ£€éªŒç»“果是否正确
    // æ£€éªŒç»“果是否正确
    for (auto item : m_mapValueIdToPRTID) {
        LOGE("=== vid:%d, prtid:%d", item.first, item.second);
    }
@@ -777,7 +878,7 @@
    }
    // æ£€éªŒç»“果是否正确
    // æ£€éªŒç»“果是否正确
    for (auto item : m_mapReportIdToCEID) {
        LOGE("=== prtid:%d, ceid:%d", item.first, item.second);
    }
@@ -864,7 +965,7 @@
    }
    // å›žè°ƒåˆ°åº”用层
    // å›žè°ƒåˆ°åº”用层
    if (bCheckData) {
        if (m_listener.onCommand != nullptr) {
            m_listener.onCommand(this, pszCmdName, params);
SourceCode/Bond/Servo/HsmsPassive.h
@@ -112,8 +112,18 @@
    void deleteAllReport();
    // ä»Žæ–‡ä»¶ä¸­åŠ è½½CVariable列表
    int loadVarialbleList(const char* pszFilepath);
    int loadVarialbles(const char* pszFilepath);
    // å–å¾—CVariable列表
    std::vector<SERVO::CVariable*>& getVariables();
    // å–得指定Variable
    SERVO::CVariable* getVariable(int variableId);
    // ä»Žæ–‡ä»¶ä¸­åŠ è½½CReport表表
    int loadReports(const char* pszFilepath);
    std::vector<SERVO::CReport*>& getReports();
    void setListener(SECSListener listener);
    unsigned OnCimWork();
@@ -152,6 +162,8 @@
    inline void Unlock() { LeaveCriticalSection(&m_criticalSection); }
    int onRecvMsg(IMessage* pMessage);
    void clearAllVariabel();
    std::vector<int> parseVidList(CString& strNums);
    void clearAllReport();
private:
    CModel* m_pModel;
@@ -188,5 +200,8 @@
    // CVariable vector
    std::vector<SERVO::CVariable*> m_variabels;
    // CReport vector
    std::vector<SERVO::CReport*> m_reports;
};
SourceCode/Bond/Servo/Model.cpp
@@ -130,9 +130,11 @@
    m_hsmsPassive.setSoftRev((LPTSTR)(LPCTSTR)strSoftRev);
    CString strVarialbleFile;
    strVarialbleFile.Format(_T("%s\\VariableList.txt"), (LPTSTR)(LPCTSTR)m_strWorkDir);
    m_hsmsPassive.loadVarialbleList((LPTSTR)(LPCTSTR)strVarialbleFile);
    m_hsmsPassive.loadVarialbles((LPTSTR)(LPCTSTR)strVarialbleFile);
    m_hsmsPassive.init(this, "APP", 7000);
    strVarialbleFile.Format(_T("%s\\ReportList.txt"), (LPTSTR)(LPCTSTR)m_strWorkDir);
    m_hsmsPassive.loadReports((LPTSTR)(LPCTSTR)strVarialbleFile);
    m_hsmsPassive.init(this, "APP", 7000);
    SERVO::MasterListener masterListener;
    masterListener.onMasterStateChanged = [&](void* pMaster, SERVO::MASTERSTATE state) -> void {
SourceCode/Bond/Servo/Servo.rc
Binary files differ
SourceCode/Bond/Servo/Servo.vcxproj
@@ -206,6 +206,8 @@
    <ClInclude Include="ChangePasswordDlg.h" />
    <ClInclude Include="CMyStatusbar.h" />
    <ClInclude Include="CPageLinkSignal.h" />
    <ClInclude Include="CPageReport.h" />
    <ClInclude Include="CPageVarialbles.h" />
    <ClInclude Include="CReport.h" />
    <ClInclude Include="CRobotCmdContainerDlg.h" />
    <ClInclude Include="CRobotCmdTestDlg.h" />
@@ -351,6 +353,8 @@
    <ClCompile Include="ChangePasswordDlg.cpp" />
    <ClCompile Include="CMyStatusbar.cpp" />
    <ClCompile Include="CPageLinkSignal.cpp" />
    <ClCompile Include="CPageReport.cpp" />
    <ClCompile Include="CPageVarialbles.cpp" />
    <ClCompile Include="CReport.cpp" />
    <ClCompile Include="CRobotCmdContainerDlg.cpp" />
    <ClCompile Include="CRobotCmdTestDlg.cpp" />
SourceCode/Bond/Servo/Servo.vcxproj.filters
@@ -172,6 +172,8 @@
    <ClCompile Include="CCollectionEvent.cpp" />
    <ClCompile Include="CReport.cpp" />
    <ClCompile Include="CVariable.cpp" />
    <ClCompile Include="CPageVarialbles.cpp" />
    <ClCompile Include="CPageReport.cpp" />
  </ItemGroup>
  <ItemGroup>
    <ClInclude Include="AlarmManager.h" />
@@ -349,6 +351,8 @@
    <ClInclude Include="CCollectionEvent.h" />
    <ClInclude Include="CReport.h" />
    <ClInclude Include="CVariable.h" />
    <ClInclude Include="CPageVarialbles.h" />
    <ClInclude Include="CPageReport.h" />
  </ItemGroup>
  <ItemGroup>
    <ResourceCompile Include="Servo.rc" />
SourceCode/Bond/Servo/ServoDlg.cpp
@@ -22,6 +22,9 @@
#include "UserManager.h"
#include "SystemLogManager.h"
#include "PortConfigurationDlg.h"
#include "CHMPropertyDlg.h"
#include "CPageVarialbles.h"
#include "CPageReport.h"
#ifdef _DEBUG
@@ -556,7 +559,17 @@
void CServoDlg::OnMenuProjectVarialbleList()
{
    AfxMessageBox("OnMenuProjectVarialbleList");
    CHMPropertyDlg dlg(_T("Variable|Rreport|Collection Event"), 658, 788);
    CPageReport* pPage1 = new CPageReport();
    pPage1->Create(IDD_PAGE_REPORT);
    dlg.addPage(pPage1, "Report");
    CPageVarialbles* pPage2 = new CPageVarialbles();
    pPage2->Create(IDD_PAGE_VARIABLE);
    dlg.addPage(pPage2, "Variable");
    dlg.DoModal();
}
void CServoDlg::OnUpdateMenuProjectVarialbleList(CCmdUI* pCmdUI)
SourceCode/Bond/Servo/resource.h
Binary files differ
SourceCode/Bond/x64/Debug/ReportList.txt
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,17 @@
RPTID,(VID1,VID2,...)
300,(1,300)
301,(1,300)
600,(500,600,601)
700,(500,700,701)
10000,(200,201)
10300,(1,10000)
10051,(1,10000,10100,10101)
10061,(1,10000,10100,10200)
10062,(1,10000,10100,10201,10202)
10071,(1,10000,10100,10203,20000)
10072,(1,10000,10100,10203,20000,20001)
10080,(1,10000,10100)
20000,(1,10000,10203)
30000,(1,30000,30001)
31000,(1,31000,31001)
40000,(1,10203,20000)
SourceCode/Bond/x64/Debug/VariableList.txt
@@ -1,37 +1,37 @@
SVID,SV Name,SV Format,SV Remark
100,PortTransferState,U1,"0=OutOfService\r\n1=TransferBlocked\r\n2=ReadyToLoad\r\n3=ReadyToUnload\r\n4=InService\r\n5=TransferReady"
300,AccessMode,U1,"1=Manual\r\n2=Auto"
100,PortTransferState,U1,0=OutOfService\r\n1=TransferBlocked\r\n2=ReadyToLoad\r\n3=ReadyToUnload\r\n4=InService\r\n5=TransferReady
300,AccessMode,U1,1=Manual\r\n2=Auto
500,Clock,A50,
600,CurrentControlState,U1,"0:Offline:equipment\r\n1:Offline-Attempt\r\n2:Online\r\n3:Offline:host\r\n4:Online:Local\r\n5:Online:Remote"
600,CurrentControlState,U1,0:Offline:equipment\r\n1:Offline-Attempt\r\n2:Online\r\n3:Offline:host\r\n4:Online:Local\r\n5:Online:Remote
601,PreviousControlState,U1,
700,CurrentProcessState,U1,"0:DOWN\r\n1:IDLE\r\n2.SETUP\r\n3.EXCUTING\r\n4.MAINTAIN\r\n5.ALARM"
700,CurrentProcessState,U1,0:DOWN\r\n1:IDLE\r\n2.SETUP\r\n3.EXCUTING\r\n4.MAINTAIN\r\n5.ALARM
701,PreviousProcessState,U1,
800,EFEMPPExecName,A20,
801,EQPPExecName,A20,
1000,CJobSpace,U1,
2000,RbRAxisTorque,I2,机器人R轴扭矩
2001,RbLAxisTorque,l2,机器人L轴扭矩
2002,RbZAxisTorque,l2,机器人Z轴扭矩
2003,RbTHAxisTorque,l2,机器人TH轴扭矩
2004,RbXAxisTorque,l2,机器人X轴扭矩
2005,AxisX111,l2,X111相机前移栽电机扭矩
2006,AxisX112,l2,X112相机后移栽电机扭矩
2007,AxisU113,l2,U113产品旋转电机扭矩
2008,AxisX114,l2,X114产品左整列电机扭矩
2009,AxisY121,l2,Y121产品右整列电机扭矩
2010,AxisY122,l2,Y122产品前整列电机扭矩
2011,AxisY123,l2,Y123产品后阵列电机扭矩
2012,MainAir,U2,总进气压力值
2013,MainVacuum,l2,总真空压力值
2014,RbMainVacuum,l2,机器人真空值
2015,LPMainVacuum,l2,LP真空值#D265
2016,LPMainAir,U2,LP压空值
2017,ALVacuum,l2,Aligner真空值
2018,FFU1RPM,U2,FFU1转速
2019,FFU2RPM,U2,FFU2转速
2020,FFU3RPM,U2,FFU3转速
2021,FFU4RPM,U2,FFU4转速
2022,ESDValue,I2,静电检测值
2023,OCREnable,U2,"OCR使能:O:开启 1:屏蔽"
2024,CCDEnable,U2,"CCD使能:O:开启 1:屏蔽"
2025,FFUParameter,U2,FFU设定值
2000,RbRAxisTorque,I2,机器人R轴扭矩
2001,RbLAxisTorque,l2,机器人L轴扭矩
2002,RbZAxisTorque,l2,机器人Z轴扭矩
2003,RbTHAxisTorque,l2,机器人TH轴扭矩
2004,RbXAxisTorque,l2,机器人X轴扭矩
2005,AxisX111,l2,X111相机前移栽电机扭矩
2006,AxisX112,l2,X112相机后移栽电机扭矩
2007,AxisU113,l2,U113产品旋转电机扭矩
2008,AxisX114,l2,X114产品左整列电机扭矩
2009,AxisY121,l2,Y121产品右整列电机扭矩
2010,AxisY122,l2,Y122产品前整列电机扭矩
2011,AxisY123,l2,Y123产品后阵列电机扭矩
2012,MainAir,U2,总进气压力值
2013,MainVacuum,l2,总真空压力值
2014,RbMainVacuum,l2,机器人真空值
2015,LPMainVacuum,l2,LP真空值#D265
2016,LPMainAir,U2,LP压空值
2017,ALVacuum,l2,Aligner真空值
2018,FFU1RPM,U2,FFU1转速
2019,FFU2RPM,U2,FFU2转速
2020,FFU3RPM,U2,FFU3转速
2021,FFU4RPM,U2,FFU4转速
2022,ESDValue,I2,静电检测值
2023,OCREnable,U2,"OCR使能:O:开启 1:屏蔽"
2024,CCDEnable,U2,"CCD使能:O:开启 1:屏蔽"
2025,FFUParameter,U2,FFU设定值