LAPTOP-SNT8I5JK\Boounion
2025-06-30 e979a31c4e7c1d54703230ef3335d6e929442493
Merge branch 'liuyang' into clh
已修改2个文件
107 ■■■■ 文件已修改
SourceCode/Bond/Servo/CPageGraph1.cpp 101 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageGraph1.h 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
SourceCode/Bond/Servo/CPageGraph1.cpp
@@ -7,9 +7,6 @@
#include "afxdialogex.h"
#include "Common.h"
const POINT g_arm1Offset = { -30, -45 }; // ARM1 从中心向左47, 向上33
const POINT g_arm2Offset = { 27, -45 };     // ARM2 从中心向右10, 向上33
const std::map<SERVO::ROBOT_POSITION, RobotPositionMapping> g_positionMap = {
    { SERVO::ROBOT_POSITION::Port1,     { SERVO::ROBOT_POSITION::Port1,     1.00f,   0.00f } },
    { SERVO::ROBOT_POSITION::Port2,     { SERVO::ROBOT_POSITION::Port2,     0.90f,   0.00f } },
@@ -57,6 +54,15 @@
    m_bIsRobotMoving = FALSE;
    m_crBkgnd = PAGE_GRPAH1_BACKGROUND_COLOR;
    m_hbrBkgnd = nullptr;
    m_lastRobotPosition = SERVO::ROBOT_POSITION::Port1;
    m_lastArmState[0] = FALSE;
    m_lastArmState[1] = FALSE;
    m_arm1Offset = LoadArmOffset("ARM1");
    m_arm2Offset = LoadArmOffset("ARM2");
    //m_arm1Offset = { -30, -45 }; // ARM1 从中心向左47, 向上33
    //m_arm2Offset = { 27, -45 };     // ARM2 从中心向右10, 向上33
}
CPageGraph1::~CPageGraph1()
@@ -81,6 +87,15 @@
// CPageGraph1 消息处理程序
std::string CPageGraph1::GetConfigPath()
{
    char path[MAX_PATH];
    GetModuleFileNameA(NULL, path, MAX_PATH);
    std::string exePath(path);
    std::string configDir = exePath.substr(0, exePath.find_last_of("\\/")) + "\\Config";
    CreateDirectoryA(configDir.c_str(), NULL);
    return configDir + "\\robot_offset.ini";
}
void CPageGraph1::InitRxWindows()
{
@@ -272,7 +287,10 @@
    }
    m_pGraph->UpdateIndicateBox1Colors(id, newBackgroundColor, newFrameColor1, newFrameColor2);
    m_pGraph->Invalidata();
    // 刷新界面
    Invalidate();
    UpdateWindow();
}
BOOL CPageGraph1::OnEraseBkgnd(CDC* pDC)
@@ -316,6 +334,9 @@
        m_pObserver->unsubscribe();
        m_pObserver = NULL;
    }
    SaveArmOffset("ARM1", m_arm1Offset);
    SaveArmOffset("ARM2", m_arm2Offset);
}
void CPageGraph1::OnSize(UINT nType, int cx, int cy)
@@ -362,25 +383,27 @@
        int cx = currentX + pImage->bmWidth / 2;
        // 旋转后的偏移
        int rotatedX1 = static_cast<int>(cos(radians) * g_arm1Offset.x - sin(radians) * g_arm1Offset.y);
        int rotatedY1 = static_cast<int>(sin(radians) * g_arm1Offset.x + cos(radians) * g_arm1Offset.y);
        int rotatedX2 = static_cast<int>(cos(radians) * g_arm2Offset.x - sin(radians) * g_arm2Offset.y);
        int rotatedY2 = static_cast<int>(sin(radians) * g_arm2Offset.x + cos(radians) * g_arm2Offset.y);
        int rotatedX1 = static_cast<int>(cos(radians) * m_arm1Offset.x - sin(radians) * m_arm1Offset.y);
        int rotatedY1 = static_cast<int>(sin(radians) * m_arm1Offset.x + cos(radians) * m_arm1Offset.y);
        int rotatedX2 = static_cast<int>(cos(radians) * m_arm2Offset.x - sin(radians) * m_arm2Offset.y);
        int rotatedY2 = static_cast<int>(sin(radians) * m_arm2Offset.x + cos(radians) * m_arm2Offset.y);
        // 应用所有元素的新坐标
        m_pGraph->UpdateImageCoordinates(IMAGE_ROBOT, currentX, y);
        m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM1, cx + rotatedX1, cy + rotatedY1);
        m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM2, cx + rotatedX2, cy + rotatedY2);
        Invalidate();
        UpdateWindow();
        std::this_thread::sleep_for(std::chrono::milliseconds(16));
    }
    // 最终位置校正
    int cx = endX + pImage->bmWidth / 2;
    int rotatedX1 = static_cast<int>(cos(radians) * g_arm1Offset.x - sin(radians) * g_arm1Offset.y);
    int rotatedY1 = static_cast<int>(sin(radians) * g_arm1Offset.x + cos(radians) * g_arm1Offset.y);
    int rotatedX2 = static_cast<int>(cos(radians) * g_arm2Offset.x - sin(radians) * g_arm2Offset.y);
    int rotatedY2 = static_cast<int>(sin(radians) * g_arm2Offset.x + cos(radians) * g_arm2Offset.y);
    int rotatedX1 = static_cast<int>(cos(radians) * m_arm1Offset.x - sin(radians) * m_arm1Offset.y);
    int rotatedY1 = static_cast<int>(sin(radians) * m_arm1Offset.x + cos(radians) * m_arm1Offset.y);
    int rotatedX2 = static_cast<int>(cos(radians) * m_arm2Offset.x - sin(radians) * m_arm2Offset.y);
    int rotatedY2 = static_cast<int>(sin(radians) * m_arm2Offset.x + cos(radians) * m_arm2Offset.y);
    m_pGraph->UpdateImageCoordinates(IMAGE_ROBOT, endX, y);
    m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM1, cx + rotatedX1, cy + rotatedY1);
@@ -408,12 +431,12 @@
    float radians = angleInDegrees * 3.1415926f / 180.0f;
    // 旋转 offset1
    int rotatedX1 = static_cast<int>(cos(radians) * g_arm1Offset.x - sin(radians) * g_arm1Offset.y);
    int rotatedY1 = static_cast<int>(sin(radians) * g_arm1Offset.x + cos(radians) * g_arm1Offset.y);
    int rotatedX1 = static_cast<int>(cos(radians) * m_arm1Offset.x - sin(radians) * m_arm1Offset.y);
    int rotatedY1 = static_cast<int>(sin(radians) * m_arm1Offset.x + cos(radians) * m_arm1Offset.y);
    // 旋转 offset2
    int rotatedX2 = static_cast<int>(cos(radians) * g_arm2Offset.x - sin(radians) * g_arm2Offset.y);
    int rotatedY2 = static_cast<int>(sin(radians) * g_arm2Offset.x + cos(radians) * g_arm2Offset.y);
    int rotatedX2 = static_cast<int>(cos(radians) * m_arm2Offset.x - sin(radians) * m_arm2Offset.y);
    int rotatedY2 = static_cast<int>(sin(radians) * m_arm2Offset.x + cos(radians) * m_arm2Offset.y);
    // 更新指示框
    m_pGraph->UpdateIndicateBoxCoordinates(INDICATE_ROBOT_ARM1, cx + rotatedX1, cy + rotatedY1);
@@ -471,6 +494,27 @@
    m_lastRobotPosition = position;
}
POINT CPageGraph1::LoadArmOffset(const std::string& armName)
{
    std::string iniPath = GetConfigPath();
    POINT pt;
    pt.x = GetPrivateProfileIntA("Offsets", (armName + "_X").c_str(), 0, iniPath.c_str());
    pt.y = GetPrivateProfileIntA("Offsets", (armName + "_Y").c_str(), 0, iniPath.c_str());
    return pt;
}
void CPageGraph1::SaveArmOffset(const std::string& armName, const POINT& pt)
{
    std::string iniPath = GetConfigPath();
    char buf[16];
    sprintf_s(buf, "%d", pt.x);
    WritePrivateProfileStringA("Offsets", (armName + "_X").c_str(), buf, iniPath.c_str());
    sprintf_s(buf, "%d", pt.y);
    WritePrivateProfileStringA("Offsets", (armName + "_Y").c_str(), buf, iniPath.c_str());
}
void CPageGraph1::OnGraphItemClicked(NMHDR* pNMHDR, LRESULT* pResult)
{
    BYSERVOGRAPH_NMHDR* pGraphNmhdr = reinterpret_cast<BYSERVOGRAPH_NMHDR*>(pNMHDR);
@@ -508,12 +552,6 @@
    }
    else if (pGraphNmhdr->dwData == INDICATE_MEASUREMENT) {
        MoveRobotToPosition(SERVO::ROBOT_POSITION::Measurement);
    }
    SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)m_pGraph->GetIndicateBoxData(pGraphNmhdr->dwData);
    if (pEquipment != nullptr) {
        // 暂时禁用展开属性页的功能
        // theApp.m_model.notifyPtr(RX_CODE_SELECT_EQUIPMENT, pEquipment);
    }
    
    *pResult = 0;
@@ -582,17 +620,24 @@
        // 如果设备在线,那么更新 ARM 状态
        SERVO::RMDATA& robotData = pEFEM->getRobotMonitoringData();
        DeviceStatus arm1Status = robotData.armState[0] ? DeviceStatus::OCCUPIED : DeviceStatus::ONLINE;
        DeviceStatus arm2Status = robotData.armState[1] ? DeviceStatus::OCCUPIED : DeviceStatus::ONLINE;
        UpdateDeviceStatus(INDICATE_ROBOT_ARM1, arm1Status);
        UpdateDeviceStatus(INDICATE_ROBOT_ARM2, arm2Status);
        if (m_lastArmState[0] != robotData.armState[0]) {
            m_lastArmState[0] = robotData.armState[0];
            DeviceStatus arm1Status;
            arm1Status = robotData.armState[0] ? DeviceStatus::OCCUPIED : DeviceStatus::ONLINE;
            UpdateDeviceStatus(INDICATE_ROBOT_ARM1, arm1Status);
        }
        if (m_lastArmState[1] != robotData.armState[1]) {
            m_lastArmState[1] = robotData.armState[1];
            DeviceStatus arm2Status;
            arm2Status = robotData.armState[1] ? DeviceStatus::OCCUPIED : DeviceStatus::ONLINE;
            UpdateDeviceStatus(INDICATE_ROBOT_ARM2, arm2Status);
        }
        // 位置信息状态显示
        if (robotData.position != m_lastRobotPosition) {
            MoveRobotToPosition(robotData.position);
        }
        m_pGraph->Invalidata();
    }
    CDialogEx::OnTimer(nIDEvent);
SourceCode/Bond/Servo/CPageGraph1.h
@@ -27,12 +27,15 @@
public:
    std::string GetConfigPath();
    void InitRxWindows();
    void UpdateDeviceStatus(int id, DeviceStatus status);
    void UpdateRobotPosition(float percentage);
    void RotateRobot(float angleInDegrees);
    void BindEquipmentToGraph();
    void MoveRobotToPosition(SERVO::ROBOT_POSITION position);
    POINT LoadArmOffset(const std::string& armName);
    void SaveArmOffset(const std::string& armName, const POINT& pt);
private:
    IObserver* m_pObserver;
@@ -41,6 +44,9 @@
    COLORREF m_crBkgnd;
    HBRUSH m_hbrBkgnd;
    SERVO::ROBOT_POSITION m_lastRobotPosition;
    BOOL m_lastArmState[2];
    POINT m_arm1Offset; // ARM1 从中心向左47, 向上33
    POINT m_arm2Offset; // ARM2 从中心向右10, 向上33
// 对话框数据
#ifdef AFX_DESIGN_TIME