SourceCode/Bond/Servo/CPageGraph1.cpp
@@ -41,6 +41,10 @@
#define INDICATE_BAKE_COOLING   12
#define INDICATE_MEASUREMENT   13
// 定时器
#define TIMER_ID_DEVICE_STATUS      1   // 用于初始化设备状态
#define TIMER_ID_ROBOT_STATUS       2   // 用于周期刷新机器人位置/臂状态
// CPageGraph1 对话框
IMPLEMENT_DYNAMIC(CPageGraph1, CDialogEx)
@@ -148,8 +152,8 @@
{
   CDialogEx::OnInitDialog();
   InitRxWindows();
   SetTimer(1, 3000, nullptr);
   SetTimer(TIMER_ID_DEVICE_STATUS, 3000, nullptr);
   SetTimer(TIMER_ID_ROBOT_STATUS, 1000, nullptr); // 每 1000ms 更新一次状态
   // 图示
   m_pGraph = CServoGraph::Hook(GetDlgItem(IDC_SERVO_GRAPH1)->GetSafeHwnd());
@@ -251,7 +255,12 @@
      newFrameColor2 = EQ_BOX_FRAME2;
      break;
   case OFFLINE:
      newBackgroundColor = RGB(222, 222, 222);
      newBackgroundColor = EQ_BOX_OFFLINE;
      newFrameColor1 = EQ_BOX_FRAME1;
      newFrameColor2 = EQ_BOX_FRAME2;
      break;
   case OCCUPIED:
      newBackgroundColor = EQ_BOX_OCCUPIED;
      newFrameColor1 = EQ_BOX_FRAME1;
      newFrameColor2 = EQ_BOX_FRAME2;
      break;
@@ -263,10 +272,7 @@
   }
   m_pGraph->UpdateIndicateBox1Colors(id, newBackgroundColor, newFrameColor1, newFrameColor2);
   // 刷新界面
   Invalidate();
   UpdateWindow();
   m_pGraph->Invalidata();
}
BOOL CPageGraph1::OnEraseBkgnd(CDC* pDC)
@@ -299,6 +305,8 @@
void CPageGraph1::OnDestroy()
{
   CDialogEx::OnDestroy();
   KillTimer(TIMER_ID_ROBOT_STATUS);
   if (m_hbrBkgnd != nullptr) {
      ::DeleteObject(m_hbrBkgnd);
@@ -364,8 +372,6 @@
      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));
   }
@@ -461,6 +467,8 @@
   // 旋转方向
   RotateRobot(mapping.angle);
   m_lastRobotPosition = position;
}
void CPageGraph1::OnGraphItemClicked(NMHDR* pNMHDR, LRESULT* pResult)
@@ -502,10 +510,10 @@
      MoveRobotToPosition(SERVO::ROBOT_POSITION::Measurement);
   }
   CString s; s.Format(_T("OnGraphItemClicked %d"), pGraphNmhdr->dwData);
   SERVO::CEquipment* pEquipment = (SERVO::CEquipment*)m_pGraph->GetIndicateBoxData(pGraphNmhdr->dwData);
   if (pEquipment != nullptr) {
      theApp.m_model.notifyPtr(RX_CODE_SELECT_EQUIPMENT, pEquipment);
      // 暂时禁用展开属性页的功能
      // theApp.m_model.notifyPtr(RX_CODE_SELECT_EQUIPMENT, pEquipment);
   }
   
   *pResult = 0;
@@ -513,14 +521,20 @@
void CPageGraph1::OnTimer(UINT_PTR nIDEvent)
{
   if (1 == nIDEvent) {
      KillTimer(1);
   if (TIMER_ID_DEVICE_STATUS == nIDEvent) {
      KillTimer(TIMER_ID_DEVICE_STATUS);
      // 更新状态
      {
         SERVO::CEquipment* pEquipment = (SERVO::CEFEM*)theApp.m_model.m_master.getEquipment(EQ_ID_EFEM);
         ASSERT(pEquipment);
         DeviceStatus status = pEquipment->isAlive() ? DeviceStatus::ONLINE : DeviceStatus::OFFLINE;
         UpdateDeviceStatus(INDICATE_FLIPER, status);
         UpdateDeviceStatus(INDICATE_ALIGNER, status);
         UpdateDeviceStatus(INDICATE_LPORT1, status);
         UpdateDeviceStatus(INDICATE_LPORT2, status);
         UpdateDeviceStatus(INDICATE_LPORT3, status);
         UpdateDeviceStatus(INDICATE_LPORT4, status);
         UpdateDeviceStatus(INDICATE_ROBOT_ARM1, status);
         UpdateDeviceStatus(INDICATE_ROBOT_ARM2, status);
      }
@@ -538,6 +552,47 @@
         DeviceStatus status = pEquipment->isAlive() ? DeviceStatus::ONLINE : DeviceStatus::OFFLINE;
         UpdateDeviceStatus(INDICATE_BONDER2, status);
      }
      {
         SERVO::CEquipment* pEquipment = theApp.m_model.m_master.getEquipment(EQ_ID_VACUUMBAKE);
         ASSERT(pEquipment);
         DeviceStatus status = pEquipment->isAlive() ? DeviceStatus::ONLINE : DeviceStatus::OFFLINE;
         UpdateDeviceStatus(INDICATE_VACUUM_BAKE, status);
      }
      {
         SERVO::CEquipment* pEquipment = theApp.m_model.m_master.getEquipment(EQ_ID_BAKE_COOLING);
         ASSERT(pEquipment);
         DeviceStatus status = pEquipment->isAlive() ? DeviceStatus::ONLINE : DeviceStatus::OFFLINE;
         UpdateDeviceStatus(INDICATE_BAKE_COOLING, status);
      }
      {
         SERVO::CEquipment* pEquipment = theApp.m_model.m_master.getEquipment(EQ_ID_MEASUREMENT);
         ASSERT(pEquipment);
         DeviceStatus status = pEquipment->isAlive() ? DeviceStatus::ONLINE : DeviceStatus::OFFLINE;
         UpdateDeviceStatus(INDICATE_MEASUREMENT, status);
      }
   }
   else if (nIDEvent == TIMER_ID_ROBOT_STATUS) {
      SERVO::CEFEM* pEFEM = (SERVO::CEFEM*)theApp.m_model.m_master.getEquipment(EQ_ID_EFEM);
      if (!pEFEM || !pEFEM->isAlive()) {
         return;
      }
      // 如果设备在线,那么更新 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 (robotData.position != m_lastRobotPosition) {
         MoveRobotToPosition(robotData.position);
      }
      m_pGraph->Invalidata();
   }
   CDialogEx::OnTimer(nIDEvent);