#include "stdafx.h" #include "Unit.h" #include #include #include #include namespace BEQ { CUnit::CUnit() { m_eqState = EQ_STATE::IDLE; m_nDoorCount = 1; m_doorState = 0; m_nAlarmCode = 0; m_nAlarmLevel = 0; m_stepState = STEP_STATE::IDLE; m_stepSvTime = 0; m_stepPvTime = 0; m_dataTime = 0; m_listener.onStateChanged = nullptr; m_listener.onDoorStateChanged = nullptr; m_listener.onAlarm = nullptr; m_listener.onRemoveAlarm = nullptr; m_listener.onStepChanged = nullptr; m_listener.onDataChanged = nullptr; m_nLayerCount = 1; resetLoadState(); } CUnit::CUnit(const char* pszName) { m_strName = pszName; m_eqState = EQ_STATE::IDLE; m_doorState = 0; m_nAlarmCode = 0; m_nAlarmLevel = 0; m_stepState = STEP_STATE::IDLE; m_stepSvTime = 0; m_stepPvTime = 0; m_dataTime = 0; m_listener.onStateChanged = nullptr; m_listener.onDoorStateChanged = nullptr; m_listener.onAlarm = nullptr; m_listener.onRemoveAlarm = nullptr; m_listener.onStepChanged = nullptr; m_listener.onDataChanged = nullptr; m_listener.onReqLoad = nullptr; m_listener.onReqUnload = nullptr; m_nLayerCount = 1; } CUnit::~CUnit() { } void CUnit::setListener(UnitListener listener) { m_listener.onStateChanged = listener.onStateChanged; m_listener.onDoorStateChanged = listener.onDoorStateChanged; m_listener.onAlarm = listener.onAlarm; m_listener.onRemoveAlarm = listener.onRemoveAlarm; m_listener.onStepChanged = listener.onStepChanged; m_listener.onDataChanged = listener.onDataChanged; m_listener.onReqNotReady = listener.onReqNotReady; m_listener.onReqLoad = listener.onReqLoad; m_listener.onReqUnload = listener.onReqUnload; } int CUnit::getName(char* pszBuffer, int nMaxCount) { return strcpy_s(pszBuffer, nMaxCount, m_strName.c_str()); } std::string& CUnit::getName() { return m_strName; } void CUnit::setState(EQ_STATE state) { m_eqState = state; if (m_listener.onStateChanged != nullptr) { m_listener.onStateChanged(this, m_eqState); } } EQ_STATE CUnit::getState() { return m_eqState; } const char* CUnit::getStateText() { static char* eqState[] = { "IDLE", "RUN", "DOWN", "MAINTENANCE", "MCHG", "E_TIME" }; return eqState[(int)m_eqState]; } void CUnit::setStateFromString(std::string& strState) { static const std::unordered_map stateMap = { {"IDLE", EQ_STATE::IDLE}, {"RUN", EQ_STATE::RUN}, {"DOWN", EQ_STATE::DOWN}, {"MAINTENANCE", EQ_STATE::MAINTENANCE}, {"MCHG", EQ_STATE::MCHG}, {"E_TIME", EQ_STATE::E_TIME} }; auto it = stateMap.find(strState); if (it != stateMap.end()) { m_eqState = it->second; if (m_listener.onStateChanged != nullptr) { m_listener.onStateChanged(this, m_eqState); } } else { // ´¦ÀíδÕÒµ½µÄ״̬£¨¸ù¾ÝÐèÇó¾ö¶¨ÊÇ·ñÅ׳öÒì³£»òÉèÖÃĬÈÏÖµ£© // m_eqState = EQ_STATE::UNKNOWN; } } void CUnit::setDoorCount(int count) { m_nDoorCount = count; } void CUnit::setDoorState(int state) { m_doorState = state; if (m_listener.onDoorStateChanged != nullptr) { m_listener.onDoorStateChanged(this, state); } } int CUnit::getDoorState() { return m_doorState; } std::string& CUnit::getDoorState(std::string& strState) { static char* doorState[] = {"CLOSE", "OPEN"}; strState = ""; int temp = (int)m_doorState; for (int i = 0; i < m_nDoorCount; i++) { if (temp & 0x01) strState += "OPEN"; else strState += "CLOSE"; if (i != m_nDoorCount - 1) strState += ","; temp = temp >> 1; } return strState; } void CUnit::setLayerCount(int count) { m_nLayerCount = min(8, count); } int CUnit::getLayerCount() { return m_nLayerCount; } void CUnit::setIndex(int index) { m_nIndex = index; } int CUnit::getIndex() { return m_nIndex; } void CUnit::setAlarm(int code, int level, const char* pszText) { if (code == 0) { if (m_nAlarmCode != 0) { m_listener.onRemoveAlarm(this, m_nAlarmCode, m_nAlarmLevel, m_strAlarmText.c_str()); } m_nAlarmCode = code; m_nAlarmLevel = level; m_strAlarmText = pszText; } else { m_nAlarmCode = code; m_nAlarmLevel = level; m_strAlarmText = pszText; if (m_listener.onAlarm != nullptr) { m_listener.onAlarm(this, code, level, pszText); } } } int CUnit::getAlarmCode() { return m_nAlarmCode; } int CUnit::getAlarmLevel() { return m_nAlarmLevel; } std::string& CUnit::getAlarmText() { return m_strAlarmText; } int CUnit::reqNotReady(int layer) { ASSERT(m_listener.onReqNotReady); if (layer <= 0) return -1; if (layer > m_nLayerCount) return -2; // ״̬¸Ä±ä²Å»Øµ÷µ½Éϲã if (m_nLayerLoadState[layer - 1] != LAYER_NOT_READY) { m_nLayerLoadState[layer - 1] = LAYER_NOT_READY; m_listener.onReqNotReady(this, layer); return 0; } return -3; } int CUnit::reqLoad(int layer) { ASSERT(m_listener.onReqLoad); if (layer <= 0) return -1; if (layer > m_nLayerCount) return -2; // ״̬¸Ä±ä²Å»Øµ÷µ½Éϲã if (m_nLayerLoadState[layer - 1] != LAYER_LOAD_REQ) { m_nLayerLoadState[layer - 1] = LAYER_LOAD_REQ; m_listener.onReqLoad(this, layer); return 0; } return -3; } int CUnit::reqUnload(int layer) { ASSERT(m_listener.onReqUnload); if (layer <= 0) return -1; if (layer > m_nLayerCount) return -2; // ״̬¸Ä±ä²Å»Øµ÷µ½Éϲã if (m_nLayerLoadState[layer - 1] != LAYER_UNLOAD_REQ) { m_nLayerLoadState[layer - 1] = LAYER_UNLOAD_REQ; m_listener.onReqUnload(this, layer); return 0; } return -3; } void CUnit::stepIdle() { m_stepState = STEP_STATE::IDLE; if (m_listener.onStepChanged != nullptr) { m_listener.onStepChanged(this, m_stepState); } } void CUnit::stepMaterialReceived(const char* pszID) { m_stepState = STEP_STATE::MATERIAL_RECEIVED; m_stepMaterialId = pszID; if (m_listener.onStepChanged != nullptr) { m_listener.onStepChanged(this, m_stepState); } } void CUnit::stepMaterialRemoved(const char* pszID) { m_stepState = STEP_STATE::MATERIAL_REMOVEED; m_stepMaterialId = pszID; if (m_listener.onStepChanged != nullptr) { m_listener.onStepChanged(this, m_stepState); } } void CUnit::stepProcessingStarted(const char* pszID) { m_stepState = STEP_STATE::PROCESSING_STARTED; m_stepMaterialId = pszID; if (m_listener.onStepChanged != nullptr) { m_listener.onStepChanged(this, m_stepState); } } void CUnit::stepProcessing(const char* pszID, int nSvTime, int nTvTime) { m_stepState = STEP_STATE::PROCESSING; m_stepMaterialId = pszID; m_stepSvTime = nSvTime; m_stepPvTime = nTvTime; if (m_listener.onStepChanged != nullptr) { m_listener.onStepChanged(this, m_stepState); } } void CUnit::stepProcessingCompleted(const char* pszID) { m_stepState = STEP_STATE::PROCESSING_COMPLETED; m_stepMaterialId = pszID; if (m_listener.onStepChanged != nullptr) { m_listener.onStepChanged(this, m_stepState); } } STEP_STATE CUnit::getStepState() { return m_stepState; } const char* CUnit::getStepStateText() { static char* stepState[] = { "IDLE", "MATERIAL_RECEIVED", "MATERIAL_REMOVED", "PROCESSING_STARTED", "PROCESSING", "PROCESSING_COMPLETED" }; return stepState[(int)m_stepState]; } std::string& CUnit::getStepMaterialId() { return m_stepMaterialId; } int CUnit::getStepSvTime() { return m_stepSvTime; } int CUnit::getSetpPvTime() { return m_stepPvTime; } void CUnit::setDataTime(unsigned long long time) { m_dataTime = time; } void CUnit::setDataTimeAndResetData(unsigned long long time) { m_dataTime = time; m_dataMap.clear(); } void CUnit::addData(const char* pszName, const char* pszDataText, bool bComplete) { m_dataMap[pszName] = pszDataText; if (bComplete) { if (m_listener.onDataChanged != nullptr) { m_listener.onDataChanged(this, m_dataTime); } } } unsigned long long CUnit::getDataTime() { return m_dataTime; } uint64_t CUnit::stringToTimeStamp(const std::string& strTime) { std::tm tm = {}; std::istringstream ss(strTime); ss >> std::get_time(&tm, "%Y-%m-%d %H:%M:%S"); if (ss.fail()) { return 0; } std::time_t time = std::mktime(&tm); if (time == -1) { return 0; } return static_cast(std::chrono::duration_cast( std::chrono::system_clock::from_time_t(time).time_since_epoch() ).count()); } const char* CUnit::getDataTimeText(uint64_t time) { static char buffer[32]; auto timePoint = std::chrono::time_point(std::chrono::milliseconds(time)); std::time_t t = std::chrono::system_clock::to_time_t(timePoint); std::tm tmPtr; if (localtime_s(&tmPtr, &t) == 0) { strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &tmPtr); } else { snprintf(buffer, sizeof(buffer), "Invalid Time"); } return buffer; } std::map& CUnit::getDatas() { return m_dataMap; } std::map& CUnit::getRecipes() { return m_mapRecipe; } void CUnit::addRecipe(int id, const char* pszName, bool bComplete) { m_mapRecipe[id] = pszName; } bool CUnit::checkRecipe(int id, const char* pszName) { bool bMatched = false; for (auto item : m_mapRecipe) { if (id == item.first && strcmp(pszName, item.second.c_str()) == 0) { bMatched = true; break; } } return bMatched; } void CUnit::resetLoadState() { for (int i = 0; i < 8; i++) { m_nLayerLoadState[i] = LAYER_LOAD_INIT; } } }