LAPTOP-SNT8I5JK\Boounion
2025-03-29 d06ab39efafbcb2a7b1ec4cb83e18fa3485789a9
SourceCode/Bond/Servo/CMaster.cpp
@@ -14,6 +14,7 @@
   CMaster::CMaster()
   {
      m_listener = {nullptr, nullptr, nullptr};
      m_bDataModify = FALSE;
   }
   CMaster::~CMaster()
@@ -85,6 +86,10 @@
      addBakeCooling(listener);
      connectEquipments();
      // 读缓存数据
      readCache();
      // 定时器
      g_pMaster = this;
@@ -101,6 +106,8 @@
      for (auto item : m_listEquipment) {
         item->term();
      }
      saveCache();
      return 0;
   }
@@ -120,6 +127,10 @@
            m_listener.onEqCimStateChanged(this, p, bOn);
         }
      };
      listener.onDataChanged = [&](void* pEquipment, int code) -> void {
         m_bDataModify = TRUE;
      };
      pEquipment->setListener(listener);
      pEquipment->setCcLink(&m_cclink);
      m_listEquipment.push_back(pEquipment);
@@ -367,6 +378,230 @@
         }
      }
      // Port1
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d1f);
         pStep->setName(STEP_EQ_PORT1_TYPE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x80);
         if (pEquipment->addStep(0x3e0, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d20);
         pStep->setName(STEP_EQ_PORT1_MODE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x88);
         if (pEquipment->addStep(0x3e8, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d21);
         pStep->setName(STEP_EQ_PORT1_CASSETTE_TYPE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x90);
         if (pEquipment->addStep(0x3f0, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d23);
         pStep->setName(STEP_EQ_PORT1_TRANSFER_MODE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x98);
         if (pEquipment->addStep(0x3f8, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d24);
         pStep->setName(STEP_EQ_PORT1_ENABLE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0xa0);
         if (pEquipment->addStep(0x400, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d25);
         pStep->setName(STEP_EQ_PORT1_TYPE_ATUO);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0xa8);
         if (pEquipment->addStep(0x408, pStep) != 0) {
            delete pStep;
         }
      }
      // Port2
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d2f);
         pStep->setName(STEP_EQ_PORT2_TYPE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x81);
         if (pEquipment->addStep(0x3e1, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d30);
         pStep->setName(STEP_EQ_PORT2_MODE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x89);
         if (pEquipment->addStep(0x3e9, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d31);
         pStep->setName(STEP_EQ_PORT2_CASSETTE_TYPE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x91);
         if (pEquipment->addStep(0x3f1, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d33);
         pStep->setName(STEP_EQ_PORT2_TRANSFER_MODE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x99);
         if (pEquipment->addStep(0x3f9, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d34);
         pStep->setName(STEP_EQ_PORT2_ENABLE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0xa1);
         if (pEquipment->addStep(0x401, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d35);
         pStep->setName(STEP_EQ_PORT2_TYPE_ATUO);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0xa9);
         if (pEquipment->addStep(0x409, pStep) != 0) {
            delete pStep;
         }
      }
      // Port3
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d3f);
         pStep->setName(STEP_EQ_PORT3_TYPE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x82);
         if (pEquipment->addStep(0x3e2, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d40);
         pStep->setName(STEP_EQ_PORT3_MODE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x8a);
         if (pEquipment->addStep(0x3ea, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d41);
         pStep->setName(STEP_EQ_PORT3_CASSETTE_TYPE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x92);
         if (pEquipment->addStep(0x3f2, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d43);
         pStep->setName(STEP_EQ_PORT3_TRANSFER_MODE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x9a);
         if (pEquipment->addStep(0x3fa, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d44);
         pStep->setName(STEP_EQ_PORT3_ENABLE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0xa2);
         if (pEquipment->addStep(0x402, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d45);
         pStep->setName(STEP_EQ_PORT3_TYPE_ATUO);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0xaa);
         if (pEquipment->addStep(0x40a, pStep) != 0) {
            delete pStep;
         }
      }
      // Port4
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d4f);
         pStep->setName(STEP_EQ_PORT4_TYPE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x83);
         if (pEquipment->addStep(0x3e3, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d50);
         pStep->setName(STEP_EQ_PORT4_MODE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x8b);
         if (pEquipment->addStep(0x3eb, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT32, 0x4d51);
         pStep->setName(STEP_EQ_PORT4_CASSETTE_TYPE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x93);
         if (pEquipment->addStep(0x3f3, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d53);
         pStep->setName(STEP_EQ_PORT4_TRANSFER_MODE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0x9b);
         if (pEquipment->addStep(0x3fb, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d54);
         pStep->setName(STEP_EQ_PORT4_ENABLE);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0xa3);
         if (pEquipment->addStep(0x403, pStep) != 0) {
            delete pStep;
         }
      }
      {
         CEqReadIntStep* pStep = new CEqReadIntStep(__INT16, 0x4d55);
         pStep->setName(STEP_EQ_PORT4_TYPE_ATUO);
         pStep->setListener(listener);
         pStep->setWriteSignalDev(0xab);
         if (pEquipment->addStep(0x40b, pStep) != 0) {
            delete pStep;
         }
      }
      pEquipment->init();
      LOGE("已添加“EFEM(ROBOT)”.");
      return 0;
@@ -569,6 +804,16 @@
            }
         }
      }
      // 自动保存缓存
      if (i % (4 * 2) == 0) {
         if (m_bDataModify) {
            saveCacheAndBackups();
            m_bDataModify = FALSE;
         }
      }
   }
   void CMaster::connectEquipments()
@@ -643,4 +888,70 @@
         LOGE("连接BakeCooling-LoadPort4失败");
      }
   }
   int CMaster::saveCache()
   {
      CFile file;
      if (!file.Open(m_strFilepath.c_str(), CFile::modeCreate | CFile::modeWrite)) {
         return -1;
      }
      CArchive ar(&file, CArchive::store);
      serialize(ar);
      ar.Close();
      file.Close();
      return 0;
   }
   int CMaster::saveCacheAndBackups()
   {
      saveCache();
      // 创建备份目录
      CString strNewFile;
      CString strFileDir = m_strFilepath.c_str();
      int index = strFileDir.ReverseFind('\\');
      ASSERT(index > 0);
      strFileDir = strFileDir.Left(index);
      strFileDir = strFileDir + _T("Backups");
      ::CreateDirectory(strFileDir, nullptr);
      CTime time = CTime::GetCurrentTime();
      strNewFile.Format(_T("%s//Master_%d_%02d_%02d_%02d_%02d_%02d.dat"),
         (LPTSTR)(LPCTSTR)strFileDir,
         time.GetYear(), time.GetMonth(), time.GetDay(),
         time.GetHour(), time.GetMinute(), time.GetSecond());
      ::CopyFile(m_strFilepath.c_str(), strNewFile, FALSE);
      return 0;
   }
   void CMaster::setCacheFilepath(const char* pszFilepath)
   {
      m_strFilepath = pszFilepath;
   }
   int CMaster::readCache()
   {
      CFile file;
      if (!file.Open(m_strFilepath.c_str(), CFile::modeRead)) {
         return -1;
      }
      CArchive ar(&file, CArchive::load);
      serialize(ar);
      ar.Close();
      file.Close();
      return 0;
   }
   void CMaster::serialize(CArchive& ar)
   {
      for (auto item : m_listEquipment) {
         item->serialize(ar);
      }
   }
}