#include "stdafx.h"
|
#include "CEquipment.h"
|
#include "ToolUnits.h"
|
#include <regex>
|
#include "CArm.h"
|
#include "CGlassPool.h"
|
#include "Servo.h"
|
|
|
#define CHECK_READ_STEP_SIGNAL(addr, data, size) { \
|
BOOL bFlag = isBitOn(data, size, addr); \
|
SERVO::CStep* pStep = getStep(addr); \
|
if (pStep != nullptr) { \
|
((CReadStep*)pStep)->onReadSignal(bFlag ? addr : 0); \
|
} \
|
}
|
|
#define CHECK_WRITE_STEP_SIGNAL(addr, data, size) { \
|
BOOL bFlag = isBitOn(data, size, addr); \
|
SERVO::CStep* pStep = getStep(addr); \
|
if (pStep != nullptr) { \
|
((CWriteStep*)pStep)->onRecvSignal(bFlag ? addr : 0); \
|
} \
|
}
|
|
namespace SERVO {
|
|
CEquipment::CEquipment() : m_nID(0), m_strName(""), m_strDescription(""), m_station(0, 255)
|
{
|
m_listener = { };
|
m_alive = { FALSE, 0, FALSE };
|
m_bCimState = FALSE;
|
m_bUpstreamInline = FALSE;
|
m_bDownstreamInline = FALSE;
|
m_bLocalAlarm = FALSE;
|
m_bAutoRecipeChange = FALSE;
|
m_bVCREnable[0] = FALSE;
|
memset(m_bLinkSignalToUpstream, 0, sizeof(m_bLinkSignalToUpstream));
|
memset(m_bLinkSignalToDownstream, 0, sizeof(m_bLinkSignalToDownstream));
|
m_pCclink = nullptr;
|
m_nBaseAlarmId = 0;
|
m_pArm = nullptr;
|
m_processState = PROCESS_STATE::Ready;
|
m_blockReadBit = { 0 };
|
InitializeCriticalSection(&m_criticalSection);
|
}
|
|
CEquipment::~CEquipment()
|
{
|
for (int i = 0; i < SLOT_MAX; i++) {
|
CContext* pContext = m_slot[i].getContext();
|
if (pContext != nullptr) {
|
m_slot[i].setContext(nullptr);
|
}
|
}
|
|
for (auto item : m_mapStep) {
|
delete item.second;
|
}
|
m_mapStep.clear();
|
|
for (auto item : m_inputPins) {
|
delete item;
|
}
|
m_inputPins.clear();
|
|
for (auto item : m_outputPins) {
|
delete item;
|
}
|
m_outputPins.clear();
|
|
DeleteCriticalSection(&m_criticalSection);
|
}
|
|
void CEquipment::setListener(EquipmentListener listener)
|
{
|
m_listener = listener;
|
}
|
|
void CEquipment::setCcLink(CCCLinkIEControl* pCcLink)
|
{
|
m_pCclink = pCcLink;
|
}
|
|
void CEquipment::setArm(CEquipment* pEquipment)
|
{
|
ASSERT(pEquipment->isArm());
|
ASSERT(!this->isArm());
|
m_pArm = pEquipment;
|
}
|
|
CEquipment* CEquipment::getArm()
|
{
|
return m_pArm;
|
}
|
|
void CEquipment::setBaseAlarmId(int nBaseId)
|
{
|
m_nBaseAlarmId = nBaseId;
|
}
|
|
int CEquipment::getBaseAlarmId()
|
{
|
return m_nBaseAlarmId;
|
}
|
|
void CEquipment::getProperties(std::vector<std::pair<std::string, std::string>>& container)
|
{
|
container.clear();
|
// ʾÀý£º½«Ò»Ð©ÊôÐÔÌí¼Óµ½ÈÝÆ÷
|
container.push_back(std::make_pair("DeviceName", "ServoMotor"));
|
container.push_back(std::make_pair("SerialNumber", "123456789"));
|
container.push_back(std::make_pair("Version", "1.0"));
|
}
|
|
std::map<unsigned int, CStep*>& CEquipment::getSteps()
|
{
|
return m_mapStep;
|
}
|
|
CStep* CEquipment::getStep(unsigned int addr)
|
{
|
auto iter = m_mapStep.find(addr);
|
if (iter == m_mapStep.end()) return nullptr;
|
return iter->second;
|
}
|
|
CStep* CEquipment::getStepWithName(const char* pszName)
|
{
|
for (auto item : m_mapStep) {
|
if (item.second->getName().compare(pszName) == 0) {
|
return item.second;
|
}
|
}
|
|
return nullptr;
|
}
|
|
int CEquipment::addStep(unsigned int addr, CStep* pStep)
|
{
|
auto iter = m_mapStep.find(addr);
|
if (iter != m_mapStep.end()) return -1;
|
pStep->setEquipment(this);
|
pStep->setID(addr);
|
pStep->setCcLink(m_pCclink);
|
m_mapStep[addr] = pStep;
|
return 0;
|
}
|
|
void CEquipment::setProcessState(PROCESS_STATE state)
|
{
|
m_processState = state;
|
onProcessStateChanged(m_processState);
|
|
if (m_listener.onProcessStateChanged != nullptr) {
|
m_listener.onProcessStateChanged(this, m_processState);
|
}
|
}
|
|
void CEquipment::init()
|
{
|
initPins();
|
initSteps();
|
initSlots();
|
for (auto item : m_mapStep) {
|
item.second->init();
|
}
|
}
|
|
void CEquipment::term()
|
{
|
for (auto item : m_mapStep) {
|
item.second->term();
|
}
|
}
|
|
void CEquipment::initSteps()
|
{
|
|
}
|
|
void CEquipment::setID(int nID)
|
{
|
m_nID = nID;
|
}
|
|
int CEquipment::getID()
|
{
|
return m_nID;
|
}
|
|
void CEquipment::setName(const char* pszName)
|
{
|
m_strName = pszName;
|
}
|
|
std::string& CEquipment::getName()
|
{
|
return m_strName;
|
}
|
|
void CEquipment::setDescription(const char* pszDescription)
|
{
|
m_strDescription = pszDescription;
|
}
|
|
std::string& CEquipment::getDescription()
|
{
|
return m_strDescription;
|
}
|
|
void CEquipment::setStation(int network, int station)
|
{
|
m_station.nNetNo = network;
|
m_station.nStNo = station;
|
}
|
|
const StationIdentifier& CEquipment::getStation()
|
{
|
return m_station;
|
}
|
|
void CEquipment::getAttributeVector(CAttributeVector& attrubutes)
|
{
|
attrubutes.clear();
|
|
unsigned int weight = 0;
|
attrubutes.addAttribute(new CAttribute("Network",
|
std::to_string(m_station.nNetNo).c_str(), "", weight++));
|
attrubutes.addAttribute(new CAttribute("Station",
|
std::to_string(m_station.nStNo).c_str(), "", weight++));
|
attrubutes.addAttribute(new CAttribute("ID",
|
std::to_string(m_nID).c_str(), "", weight++));
|
attrubutes.addAttribute(new CAttribute("Name",
|
m_strName.c_str(), "", weight++));
|
attrubutes.addAttribute(new CAttribute("Description",
|
m_strDescription.c_str(), "", weight++));
|
attrubutes.addAttribute(new CAttribute("Alive",
|
this->isAlive() ? _T("TRUE") : _T("FALSE"), "", weight++));
|
attrubutes.addAttribute(new CAttribute("CIM State",
|
m_bCimState ? _T("ON") : _T("OFF"), "", weight++));
|
attrubutes.addAttribute(new CAttribute("Upstream",
|
m_bUpstreamInline ? _T("Inline") : _T("Offline"), "", weight++));
|
attrubutes.addAttribute(new CAttribute("Downstream",
|
m_bDownstreamInline ? _T("Inline") : _T("Offline"), "", weight++));
|
attrubutes.addAttribute(new CAttribute("Local Alarm",
|
m_bLocalAlarm ? _T("TRUE") : _T("FALSE"), "", weight++));
|
attrubutes.addAttribute(new CAttribute("Auto Recipe Change",
|
m_bAutoRecipeChange ? _T("TRUE") : _T("FALSE"), "", weight++));
|
char szTemp[256];
|
for (int i = 0; i < VCR_MAX; i++) {
|
sprintf_s(szTemp, 256, "VCR-%d", i + 1);
|
attrubutes.addAttribute(new CAttribute(szTemp,
|
m_bVCREnable[i] ? _T("Enable") : _T("Disable"), "", weight++));
|
}
|
|
for (auto item : m_inputPins) {
|
attrubutes.addAttribute(new CAttribute(item->getName().c_str(),
|
std::to_string((int)item->getType()).c_str(), "", weight++));
|
}
|
|
for (auto item : m_outputPins) {
|
attrubutes.addAttribute(new CAttribute(item->getName().c_str(),
|
std::to_string((int)item->getType()).c_str(), "", weight++));
|
}
|
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
|
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
|
CGlass* pBuddy = nullptr;
|
if (pGlass == nullptr) {
|
attrubutes.addAttribute(new CAttribute(m_slot[i].getName().c_str(),
|
"", "", weight++));
|
}
|
else {
|
pBuddy = pGlass->getBuddy();
|
if (pBuddy == nullptr) {
|
attrubutes.addAttribute(new CAttribute(m_slot[i].getName().c_str(),
|
pGlass->getID().c_str(), "", weight++));
|
}
|
else {
|
attrubutes.addAttribute(new CAttribute(m_slot[i].getName().c_str(),
|
(pGlass->getID() + " -> " + pBuddy->getID()).c_str(), "", weight++));
|
}
|
}
|
|
}
|
}
|
|
void CEquipment::setReadBitBlock(unsigned int start, unsigned int end)
|
{
|
m_blockReadBit.type = (unsigned int)DeviceType::B;
|
m_blockReadBit.start = start;
|
m_blockReadBit.end = end;
|
m_blockReadBit.size = (m_blockReadBit.end - m_blockReadBit.start + 1) / 8;
|
ASSERT(m_blockReadBit.size < BLOCK_BUFFER_MAX);
|
}
|
|
MemoryBlock& CEquipment::getReadBitBlock()
|
{
|
return m_blockReadBit;
|
}
|
|
void CEquipment::setWriteBitBlock(unsigned int start, unsigned int end)
|
{
|
m_blockWriteBit.type = (unsigned int)DeviceType::LB;
|
m_blockWriteBit.start = start;
|
m_blockWriteBit.end = end;
|
m_blockWriteBit.size = (m_blockWriteBit.end - m_blockWriteBit.start + 1) / 8;
|
}
|
|
MemoryBlock& CEquipment::getWriteBitBlock()
|
{
|
return m_blockWriteBit;
|
}
|
|
void CEquipment::onTimer(UINT nTimerid)
|
{
|
// ÿ¸ôÒ»Ã룬¼ì²éÒ»ÏÂALIVE״̬
|
|
static int tick = 0;
|
tick++;
|
if (tick % (4 * 1) == 0) {
|
m_alive.count++;
|
if (m_alive.alive && m_alive.count > ALIVE_TIMEOUT) {
|
m_alive.alive = FALSE;
|
if (m_listener.onAlive != nullptr) {
|
m_listener.onAlive(this, m_alive.alive);
|
}
|
}
|
}
|
}
|
|
void CEquipment::serialize(CArchive& ar)
|
{
|
if (ar.IsStoring()) {
|
Lock();
|
for (int i = 0; i < SLOT_MAX; i++) {
|
m_slot[i].serialize(ar);
|
CGlass* pGlass = (CGlass *)m_slot[i].getContext();
|
if (pGlass != nullptr) {
|
pGlass->serialize(ar);
|
CGlass* pBuddy = pGlass->getBuddy();
|
if (pBuddy != nullptr) {
|
pBuddy->serialize(ar);
|
}
|
}
|
}
|
Unlock();
|
}
|
else {
|
for (int i = 0; i < SLOT_MAX; i++) {
|
m_slot[i].serialize(ar);
|
if (m_slot[i].getTempContext() != nullptr) {
|
CGlass* pGlass = theApp.m_model.m_glassPool.allocaGlass();
|
pGlass->serialize(ar);
|
m_slot[i].setContext(pGlass);
|
if (pGlass->getBuddy() != nullptr) {
|
CGlass* pBuddy = theApp.m_model.m_glassPool.allocaGlass();
|
pBuddy->serialize(ar);
|
pGlass->forceSetBuddy(pBuddy);
|
}
|
}
|
}
|
|
// ÊáÀí¸÷²£Á§Ö®¼äµÄ°ó¶¨¹ØÏµ
|
/*
|
Lock();
|
for (int i = 0; i < SLOT_MAX; i++) {
|
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
|
if (pGlass != nullptr) {
|
std::string& strBuddyId = pGlass->getBuddyId();
|
if (!strBuddyId.empty()) {
|
for (int j = 0; j < SLOT_MAX; j++) {
|
CGlass* pBudy = (CGlass*)m_slot[j].getContext();
|
if (pBudy != nullptr && strBuddyId.compare(pBudy->getID()) == 0) {
|
pGlass->setBuddy(pBudy);
|
TRACE("°ó¶¨¹ØÏµ: %s <- %s\n", pGlass->getID().c_str(), pBudy->getID().c_str());
|
}
|
}
|
}
|
}
|
}
|
Unlock();
|
*/
|
}
|
}
|
|
void CEquipment::onReceiveLBData(const char* pszData, size_t size)
|
{
|
/*
|
TRACE("%s onReceiveLBData: %d bytes\n", m_strName.c_str(), size);
|
for (unsigned int i = 0; i < size; i++) {
|
if (pszData[i] != 0)
|
TRACE("%d[%x]\n", i, pszData[i]);
|
}
|
*/
|
|
// Á¬½ÓÐźŽâÊͺͱ£´æ
|
BOOL bFlag;
|
int index = 0;
|
for (int i = 0; i < 8; i++) {
|
m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_INLINE] = isBitOn(pszData, size, index + 0);
|
m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_TROUBLE] = isBitOn(pszData, size, index + 1);
|
m_bLinkSignalToUpstream[i][SIGNAL_INTERLOCK] = isBitOn(pszData, size, index + 2);
|
m_bLinkSignalToUpstream[i][SIGNAL_SEND_ABLE] = isBitOn(pszData, size, index + 3);
|
index += 0x40;
|
|
if (m_bLinkSignalToUpstream[i][SIGNAL_SEND_ABLE]) {
|
onSendAble(i+1);
|
}
|
}
|
|
|
index += 0x40 * 2;
|
for (int i = 0; i < 8; i++) {
|
m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_INLINE] = isBitOn(pszData, size, index + 0);
|
m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_TROUBLE] = isBitOn(pszData, size, index + 1);
|
m_bLinkSignalToDownstream[i][SIGNAL_INTERLOCK] = isBitOn(pszData, size, index + 2);
|
m_bLinkSignalToDownstream[i][SIGNAL_RECEIVE_ABLE] = isBitOn(pszData, size, index + 3);
|
index += 0x40;
|
|
if (m_bLinkSignalToDownstream[0][SIGNAL_RECEIVE_ABLE]) {
|
onReceiveAble(i + 1);
|
}
|
}
|
|
|
// ÆäËüÐźż°ÏìÓ¦
|
index = 0x540;
|
|
|
// alive
|
bFlag = isBitOn(pszData, size, index);
|
if (!equalBool(m_alive.flag, bFlag)) {
|
m_alive.flag = bFlag;
|
m_alive.count = 0;
|
|
// ״̬
|
if (!m_alive.alive) {
|
m_alive.alive = TRUE;
|
if (m_listener.onAlive != nullptr) {
|
m_listener.onAlive(this, m_alive.alive);
|
}
|
}
|
}
|
|
// CIM State
|
bFlag = isBitOn(pszData, size, ++index);
|
if (!equalBool(m_bCimState, bFlag)) {
|
m_bCimState = bFlag;
|
if (m_listener.onCimStateChanged != nullptr) {
|
m_listener.onCimStateChanged(this, m_bCimState);
|
}
|
}
|
|
// UpstreamInline
|
bFlag = isBitOn(pszData, size, ++index);
|
if (!equalBool(m_bUpstreamInline, bFlag)) {
|
m_bUpstreamInline = bFlag;
|
}
|
|
// DownstreamInline
|
bFlag = isBitOn(pszData, size, ++index);
|
if (!equalBool(m_bDownstreamInline, bFlag)) {
|
m_bDownstreamInline = bFlag;
|
}
|
|
// LocalAlarm
|
bFlag = isBitOn(pszData, size, ++index);
|
if (!equalBool(m_bLocalAlarm, bFlag)) {
|
m_bLocalAlarm = bFlag;
|
}
|
|
// AutoRecipeChange
|
bFlag = isBitOn(pszData, size, ++index);
|
if (!equalBool(m_bAutoRecipeChange, bFlag)) {
|
m_bAutoRecipeChange = bFlag;
|
}
|
|
// VCR Enable
|
bFlag = isBitOn(pszData, size, ++index);
|
if (!equalBool(m_bVCREnable[0], bFlag)) {
|
m_bVCREnable[0] = bFlag;
|
}
|
|
|
// ÒÔϸù¾ÝÐźÅ×öÁ÷³Ì´¦Àí
|
for (int i = 0; i < 7; i++) {
|
CHECK_READ_STEP_SIGNAL(STEP_ID_EQMODE_CHANGED + i, pszData, size);
|
}
|
|
// process data report
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PROCESS_DATA_REPORT, pszData, size);
|
|
// Åä·½¸Ä±ä
|
CHECK_READ_STEP_SIGNAL(STEP_ID_CURRENT_RECIPE_CHANGE_REPORT, pszData, size);
|
|
// Ö÷Åä·½Éϱ¨
|
CHECK_READ_STEP_SIGNAL(STEP_ID_MASTER_RECIPE_LIST_REPORT, pszData, size);
|
|
// CIM Mode
|
CHECK_WRITE_STEP_SIGNAL(STEP_ID_CIMMODE_CHANGED_CMD_REPLY, pszData, size);
|
|
// CIM Message Set cmd reply
|
CHECK_WRITE_STEP_SIGNAL(STEP_ID_CIM_MSG_SET_CMD_REPLY, pszData, size);
|
|
// CIM Message Clear cmd reply
|
CHECK_WRITE_STEP_SIGNAL(STEP_ID_CIM_MSG_CLEAR_CMD_REPLY, pszData, size);
|
|
// Datetime set cmd reply
|
CHECK_WRITE_STEP_SIGNAL(STEP_ID_DATETIME_SET_CMD_REPLY, pszData, size);
|
|
// vcr enable cmd reply
|
CHECK_WRITE_STEP_SIGNAL(STEP_ID_VCR_ENABLE_CMD_REPLY, pszData, size);
|
|
// EQ mode change cmd reply
|
CHECK_WRITE_STEP_SIGNAL(STEP_ID_EQMODE_CHANGE_CMD_REPLY, pszData, size);
|
|
// EQ Master recipe request cmd reply
|
CHECK_WRITE_STEP_SIGNAL(STEP_ID_MASTER_RECIPE_LIST_CMD_REPLY, pszData, size);
|
|
// CIM Message Confirm
|
CHECK_READ_STEP_SIGNAL(STEP_ID_CIM_MSG_CONFIRM_REPORT, pszData, size);
|
|
// VCR1 Event report
|
CHECK_READ_STEP_SIGNAL(STEP_ID_VCR1_EVENT_REPORT, pszData, size);
|
|
// EQ Job Event
|
CHECK_READ_STEP_SIGNAL(STEP_ID_RECIVE_JOB_UPS1, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_RECIVE_JOB_UPS2, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_SENT_OUT_JOB_DOWNS1, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_SENT_OUT_JOB_DOWNS2, pszData, size);
|
|
// Store Job Report #1~15
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT1, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT2, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT3, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT4, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT5, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT6, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT7, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT8, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT9, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT10, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT11, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT12, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT13, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT14, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_STORE_JOB_REPORT15, pszData, size);
|
|
// Fetched Out Job Report #1~15
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT1, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT2, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT3, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT4, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT5, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT6, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT7, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT8, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT9, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT10, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT11, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT12, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT13, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT14, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_FETCHED_OUT_JOB_REPORT15, pszData, size);
|
|
|
// CEqCassetteTranserStateStep
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_EMPTY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_LOAD_READY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_LOADED, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_INUSE, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_UNLOAD_READY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT1_BLOCKED, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_EMPTY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_LOAD_READY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_LOADED, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_INUSE, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_UNLOAD_READY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT2_BLOCKED, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_EMPTY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_LOAD_READY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_LOADED, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_INUSE, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_UNLOAD_READY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT3_BLOCKED, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_EMPTY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_LOAD_READY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_LOADED, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_INUSE, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_UNLOAD_READY, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_PORT4_BLOCKED, pszData, size);
|
|
// robot cmd reply
|
CHECK_WRITE_STEP_SIGNAL(STEP_ID_ROBOT_CMD_REPLY, pszData, size);
|
|
// Indexer Operation Mode Change
|
CHECK_WRITE_STEP_SIGNAL(STEP_ID_IN_OP_CMD_REPLY, pszData, size);
|
|
// Panel Data Report
|
CHECK_WRITE_STEP_SIGNAL(STEP_ID_PANEL_DATA_REPORT, pszData, size);
|
|
// Panel Data Request
|
CHECK_WRITE_STEP_SIGNAL(STEP_ID_PANEL_DATA_REQUEST, pszData, size);
|
|
// Job Data Request
|
CHECK_READ_STEP_SIGNAL(STEP_ID_JOB_DATA_REQUEST, pszData, size);
|
|
// job process start/end report
|
CHECK_READ_STEP_SIGNAL(STEP_ID_JOB_PROCESS_START_REPORT, pszData, size);
|
CHECK_READ_STEP_SIGNAL(STEP_ID_JOB_PROCESS_END_REPORT, pszData, size);
|
}
|
|
BOOL CEquipment::isBitOn(const char* pszData, size_t size, int index)
|
{
|
int byteIndex, bitIndex;
|
byteIndex = (index) / 8;
|
bitIndex = (index) % 8;
|
|
return CToolUnits::getBit(pszData[byteIndex], bitIndex);
|
}
|
|
BOOL CEquipment::equalBool(BOOL b1, BOOL b2)
|
{
|
return (b1 && b2) || (!b1 && !b2);
|
}
|
|
BOOL CEquipment::isAlive()
|
{
|
return m_alive.alive;
|
}
|
|
BOOL CEquipment::isCimOn()
|
{
|
return m_bCimState;
|
}
|
|
BOOL CEquipment::isUpstreamInline()
|
{
|
return m_bUpstreamInline;
|
}
|
|
BOOL CEquipment::isDownstreamInline()
|
{
|
return m_bDownstreamInline;
|
}
|
|
BOOL CEquipment::isLocalAlarm()
|
{
|
return m_bLocalAlarm;
|
}
|
|
BOOL CEquipment::isAutoRecipeChange()
|
{
|
return m_bAutoRecipeChange;
|
}
|
|
BOOL CEquipment::isVCREnable(unsigned int index)
|
{
|
if (index >= VCR_MAX) return FALSE;
|
return m_bVCREnable[index];
|
}
|
|
BOOL CEquipment::isLinkSignalUpstreamOn(unsigned int path, unsigned int signal)
|
{
|
if (path >= PATH_MAX) return FALSE;
|
if (signal >= SIGNAL_MAX) return FALSE;
|
return m_bLinkSignalToUpstream[path][signal];
|
}
|
|
BOOL CEquipment::isLinkSignalDownstreamOn(unsigned int path, unsigned int signal)
|
{
|
if (path >= PATH_MAX) return FALSE;
|
if (signal >= SIGNAL_MAX) return FALSE;
|
return m_bLinkSignalToDownstream[path][signal];
|
}
|
|
void CEquipment::setLinkSignalUpstream(unsigned int path, unsigned int signal, BOOL bOn)
|
{
|
if (path >= PATH_MAX) return;
|
if (signal >= SIGNAL_MAX) return;
|
m_bLinkSignalToUpstream[path][signal] = bOn;
|
}
|
|
void CEquipment::setLinkSignalUpstreamBlock(unsigned int path, BOOL* pSignal)
|
{
|
if (path >= PATH_MAX) return;
|
for (int i = 0; i < SIGNAL_MAX; i++) {
|
m_bLinkSignalToUpstream[path][i] = pSignal[i];
|
}
|
}
|
|
void CEquipment::setLinkSignalDownstream(unsigned int path, unsigned int signal, BOOL bOn)
|
{
|
if (path >= PATH_MAX) return;
|
if (signal >= SIGNAL_MAX) return;
|
m_bLinkSignalToDownstream[path][signal] = bOn;
|
}
|
|
void CEquipment::setLinkSignalDownstreamBlock(unsigned int path, BOOL* pSignal)
|
{
|
if (path >= PATH_MAX) return;
|
for (int i = 0; i < SIGNAL_MAX; i++) {
|
m_bLinkSignalToDownstream[path][i] = pSignal[i];
|
}
|
}
|
|
int CEquipment::onStepEvent(CStep* pStep, int code)
|
{
|
if (code == STEP_EVENT_READDATA) {
|
if (isAlarmStep(pStep)) {
|
SERVO::CEqAlarmStep* pEqAlarmStep = (SERVO::CEqAlarmStep*)pStep;
|
int state = pEqAlarmStep->getAlarmState();
|
ASSERT(state == 0 || state == 1);
|
if (m_listener.onAlarm != nullptr) {
|
m_listener.onAlarm(this, state,
|
pEqAlarmStep->getAlarmId(),
|
pEqAlarmStep->getUnitId(),
|
pEqAlarmStep->getAlarmLevel());
|
}
|
|
return 1;
|
}
|
else if (isCimMessageConfirmStep(pStep)) {
|
SERVO::CEqReadIntStep* pEqReadIntStep = (SERVO::CEqReadIntStep*)pStep;
|
int value = pEqReadIntStep->getValue();
|
// ´Ë´¦½«value°´¸ßµÍλ²ð·ÖΪmessage idºÍpanel no.
|
// ¿ÉÄÜ»¹ÐèÒªÉϱ¨µ½cim
|
short msgId, panelNo;
|
msgId = (value & 0xffff0000 >> 16);
|
panelNo = (value & 0xffff);
|
LOGI("Cim Message Confirm(msgID = %d, panel no.=%d).", msgId, panelNo);
|
}
|
/*
|
else if (isVcrEventStep(pStep)) {
|
SERVO::CEqVcrEventStep* pEqVcrEventStep = (SERVO::CEqVcrEventStep*)pStep;
|
CVcrEventReport* pVcrEventReport = pEqVcrEventStep->getVcrEventReport();
|
ASSERT(pVcrEventReport);
|
if (m_listener.onVcrEventReport != nullptr) {
|
m_listener.onVcrEventReport(this, pVcrEventReport);
|
}
|
|
// 0426, Ïȹ̶¨·µ»Ø1(OK)
|
pEqVcrEventStep->setReturnCode(1);
|
return 1;
|
}
|
*/
|
}
|
|
|
return 0;
|
}
|
|
CPin* CEquipment::addPin(PinType type, char* pszName)
|
{
|
// ²»ÔÊÐíÃû×ÖÌí¼ÓÖØ¸´µÄpin
|
CPin* pPin = getPin(pszName);
|
if (pPin != nullptr) return nullptr;
|
|
|
// Ìí¼Óµ½PinÁÐ±í£¬¿´ÊÇÊäÈëpin»òÊä³öpin
|
if (type == PinType::INPUT) {
|
pPin = new CPin(this, type, pszName);
|
m_inputPins.push_back(pPin);
|
return pPin;
|
}
|
else if (type == PinType::OUTPUT) {
|
pPin = new CPin(this, type, pszName);
|
m_outputPins.push_back(pPin);
|
return pPin;
|
}
|
|
return nullptr;
|
}
|
|
CPin* CEquipment::getPin(char* pszName)
|
{
|
for (auto item : m_inputPins) {
|
if (item->getName().compare(pszName) == 0) {
|
return item;
|
}
|
}
|
|
for (auto item : m_outputPins) {
|
if (item->getName().compare(pszName) == 0) {
|
return item;
|
}
|
}
|
|
return nullptr;
|
}
|
|
std::vector<CPin*>& CEquipment::getInputPins()
|
{
|
return m_inputPins;
|
}
|
|
std::vector<CPin*>& CEquipment::getOutputPins()
|
{
|
return m_outputPins;
|
}
|
|
CRecipeList* CEquipment::getRecipeList(int unitNo)
|
{
|
return m_recipesManager.getRecipeList(unitNo);
|
}
|
|
int CEquipment::recvIntent(CPin* pPin, CIntent* pIntent)
|
{
|
ASSERT(pPin);
|
CPin* pFromPin = pPin->getConnectedPin();
|
ASSERT(pFromPin);
|
CEquipment* pFromEq = pFromPin->getEquipment();
|
ASSERT(pFromEq);
|
|
LOGI("<CEquipment><%s-%s>ÊÕµ½À´×Ô<%s.%s>µÄIntent<%d,%s,0x%x>",
|
this->getName().c_str(),
|
pPin->getName().c_str(),
|
pFromEq->getName().c_str(),
|
pFromPin->getName().c_str(),
|
pIntent->getCode(),
|
pIntent->getMsg(),
|
pIntent->getContext());
|
|
|
|
// ÒÔϽâÊÍ´¦ÀíÊý¾Ý
|
int code = pIntent->getCode();
|
|
|
// ²âÊÔ
|
if (code == FLOW_TEST) {
|
AfxMessageBox(pIntent->getMsg());
|
}
|
|
|
return 0;
|
}
|
|
int CEquipment::fetchedOutJob(int port, CJobDataB* pJobDataB)
|
{
|
if (m_pArm == nullptr) {
|
return -1;
|
}
|
|
// ÕÒµ½Ö¸¶¨µÄglass id,
|
Lock();
|
CGlass* pContext = nullptr;
|
for (int i = 0; i < SLOT_MAX; i++) {
|
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
|
if (pGlass != nullptr && compareJobData(pJobDataB, pGlass->getJobDataS())) {
|
pContext = pGlass;
|
if (pGlass != nullptr) pGlass->addRef();
|
m_slot[i].setContext(nullptr);
|
break;
|
}
|
}
|
if (pContext == nullptr) {
|
Unlock();
|
return -3;
|
}
|
|
((CArm*)m_pArm)->tempStore(pContext);
|
pContext->release();
|
Unlock();
|
|
|
if (m_processState != PROCESS_STATE::Ready) {
|
setProcessState(PROCESS_STATE::Ready);
|
}
|
|
if (m_listener.onDataChanged != nullptr) {
|
m_listener.onDataChanged(this, EDCC_FETCHOUT_JOB);
|
}
|
|
return 0;
|
}
|
|
int CEquipment::storedJob(int port, CJobDataB* pJobDataB, short putSlot)
|
{
|
if (m_pArm == nullptr) {
|
return -1;
|
}
|
|
CGlass* pGlass = nullptr;
|
if (((CArm*)m_pArm)->tempFetchOut(pGlass) != 0) {
|
return -2;
|
}
|
|
|
ASSERT(pGlass);
|
Lock();
|
pGlass->addPath(m_nID, getSlotUnit(putSlot));
|
m_slot[putSlot - 1].setContext(pGlass);
|
pGlass->release(); // tempFetchOutÐèÒªµ÷ÓÃÒ»´Îrelease
|
Unlock();
|
|
if (m_processState != PROCESS_STATE::Processing) {
|
setProcessState(PROCESS_STATE::Processing);
|
}
|
|
if (m_listener.onDataChanged != nullptr) {
|
m_listener.onDataChanged(this, EDCC_STORED_JOB);
|
}
|
|
return 0;
|
}
|
|
BOOL CEquipment::hasGlass()
|
{
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (m_slot[i].isEnable() && !m_slot[i].isEmpty()) {
|
return TRUE;
|
}
|
}
|
|
return FALSE;
|
}
|
|
CGlass* CEquipment::getGlass(const char* pszGlassId)
|
{
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
|
if (pGlass == nullptr) continue;
|
if (pGlass->getID().compare(pszGlassId) == 0) {
|
return pGlass;
|
}
|
}
|
|
return nullptr;
|
}
|
|
CGlass* CEquipment::getGlassFromSlot(int slotNo)
|
{
|
CSlot* pSlot = nullptr;
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
if (m_slot[i].getNo() != slotNo) continue;
|
pSlot = &m_slot[i];
|
break;
|
}
|
|
if (pSlot != nullptr) {
|
return (CGlass*)pSlot->getContext();
|
}
|
|
return nullptr;
|
}
|
|
CGlass* CEquipment::getGlassWithCassette(int cassetteSequenceNo, int jobSequenceNo)
|
{
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
|
if (pGlass == nullptr) continue;
|
CJobDataS* pJobDataS = pGlass->getJobDataS();
|
ASSERT(pJobDataS);
|
if (pJobDataS->getCassetteSequenceNo() == cassetteSequenceNo
|
&& pJobDataS->getJobSequenceNo() == jobSequenceNo) {
|
return pGlass;
|
}
|
}
|
|
|
return nullptr;
|
}
|
|
CJobDataS* CEquipment::getJobDataSWithCassette(int cassetteSequenceNo, int jobSequenceNo)
|
{
|
CSlot* pSlot = nullptr;
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
|
if (pGlass == nullptr) continue;
|
CJobDataS* pJobDataS = pGlass->getJobDataS();
|
ASSERT(pJobDataS);
|
if (pJobDataS->getCassetteSequenceNo() == cassetteSequenceNo
|
&& pJobDataS->getJobSequenceNo() == jobSequenceNo) {
|
return pJobDataS;
|
}
|
}
|
|
|
return nullptr;
|
}
|
|
bool CEquipment::isAlarmStep(SERVO::CStep* pStep)
|
{
|
return CToolUnits::startsWith(pStep->getName(), STEP_ALARM_START);
|
}
|
|
bool CEquipment::isPortTypeStep(SERVO::CStep* pStep)
|
{
|
std::regex pattern("^EQPort\\d+Type$");
|
return std::regex_match(pStep->getName(), pattern);
|
}
|
|
bool CEquipment::isPortModeStep(SERVO::CStep* pStep)
|
{
|
std::regex pattern("^EQPort\\d+Mode$");
|
return std::regex_match(pStep->getName(), pattern);
|
}
|
|
bool CEquipment::isPortCassetteTypeStep(SERVO::CStep* pStep)
|
{
|
std::regex pattern("^EQPort\\d+CassetteType$");
|
return std::regex_match(pStep->getName(), pattern);
|
}
|
|
bool CEquipment::isPortTransferModeStep(SERVO::CStep* pStep)
|
{
|
std::regex pattern("^EQPort\\d+TransferMode$");
|
return std::regex_match(pStep->getName(), pattern);
|
}
|
|
bool CEquipment::isPortEnableStep(SERVO::CStep* pStep)
|
{
|
std::regex pattern("^EQPort\\d+Enable$");
|
return std::regex_match(pStep->getName(), pattern);
|
}
|
|
bool CEquipment::isPortTypeAutoChangeEnableStep(SERVO::CStep* pStep)
|
{
|
std::regex pattern("^EQPort\\d+CassetteType$");
|
return std::regex_match(pStep->getName(), pattern);
|
}
|
|
bool CEquipment::isCassetteTransferStateStep(SERVO::CStep* pStep)
|
{
|
std::regex pattern("^EQPort\\d+Cassette.*");
|
return std::regex_match(pStep->getName(), pattern);
|
}
|
|
bool CEquipment::isCimMessageConfirmStep(SERVO::CStep* pStep)
|
{
|
return pStep->getName().compare(STEP_EQ_CIM_MESSAGE_CONFIRM) == 0;
|
}
|
|
bool CEquipment::isVcrEventStep(SERVO::CStep* pStep)
|
{
|
return pStep->getName().compare(STEP_EQ_VCR1_EVENT_REPORT) == 0;
|
}
|
|
int CEquipment::setEqMode(short mode)
|
{
|
SERVO::CEqModeChangeStep* pStep = (SERVO::CEqModeChangeStep*)getStepWithName(STEP_EQ_MODE_CHANGE);
|
if (pStep == nullptr) {
|
return -1;
|
}
|
|
return pStep->setEqMode(mode);
|
}
|
|
int CEquipment::setCimMode(BOOL bOn)
|
{
|
SERVO::CEqCimModeChangeStep* pStep = (SERVO::CEqCimModeChangeStep*)getStepWithName(STEP_CIM_MODE_CHANGE);
|
if (pStep == nullptr) {
|
return -1;
|
}
|
|
if (bOn)
|
return pStep->cimOn();
|
else
|
return pStep->cimOff();
|
}
|
|
int CEquipment::setCimMessage(const char* pszMessage, short id, short nTouchPanelNo)
|
{
|
SERVO::CEqCimMessageCmdStep* pStep = (SERVO::CEqCimMessageCmdStep*)getStepWithName(STEP_CIM_MESSAGE_CMD);
|
if (pStep == nullptr) {
|
return -1;
|
}
|
|
return pStep->setCimMessage(pszMessage, id, nTouchPanelNo);
|
}
|
|
int CEquipment::clearCimMessage(short id, short nTouchPanelNo)
|
{
|
SERVO::CEqCimMessageClearStep* pStep = (SERVO::CEqCimMessageClearStep*)getStepWithName(STEP_CIM_MESSAGE_CLEAR);
|
if (pStep == nullptr) {
|
return -1;
|
}
|
|
return pStep->clearCimMessage(id, nTouchPanelNo);
|
}
|
|
int CEquipment::setDateTime(short year, short month, short day, short hour, short minute, short second)
|
{
|
SERVO::CEqDateTimeSetCmdStep* pStep = (SERVO::CEqDateTimeSetCmdStep*)getStepWithName(STEP_DATETIME_SET_CMD);
|
if (pStep == nullptr) {
|
return -1;
|
}
|
|
return pStep->setDateTime(year, month, day, hour, minute, second);
|
}
|
|
int CEquipment::setDispatchingMode(DISPATCHING_MODE mode, ONWRITED onWritedBlock/* = nullptr*/)
|
{
|
SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(STEP_EQ_DISPATCHINT_MODE_CHANGE);
|
if (pStep == nullptr) {
|
return -1;
|
}
|
|
LOGI("<CEquipment-%s>×¼±¸ÉèÖÃDispatchingMode<%d>", m_strName.c_str(), (int)mode);
|
if (onWritedBlock != nullptr) {
|
pStep->writeShort((short)mode, onWritedBlock);
|
}
|
else {
|
pStep->writeShort((short)mode, [&, mode](int code) -> int {
|
if (code == WOK) {
|
LOGI("<CEquipment-%s>ÉèÖÃDispatchingMode³É¹¦.", m_strName.c_str());
|
}
|
else {
|
LOGI("<CEquipment-%s>ÉèÖÃDispatchingModeʧ°Ü£¬code:%d", m_strName.c_str(), code);
|
}
|
|
return 0;
|
});
|
}
|
|
return 0;
|
}
|
|
int CEquipment::indexerOperationModeChange(IDNEXER_OPERATION_MODE mode, ONWRITEDRET onWritedRetBlock)
|
{
|
SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(STEP_EQ_IN_OP_MODE_CHANGE);
|
if (pStep == nullptr) {
|
return -1;
|
}
|
|
unsigned short operationMode = (unsigned short)((unsigned short)mode + getIndexerOperationModeBaseValue());
|
LOGI("<CEquipment-%s>×¼±¸ÉèÖÃindexerOperationMode<%d>", m_strName.c_str(), (int)mode);
|
pStep->writeShort(operationMode, [&, pStep, mode, onWritedRetBlock](int code) -> int {
|
int retCode = 0;
|
if (code == WOK) {
|
LOGI("<CEquipment-%s>ÉèÖÃindexerOperationMode³É¹¦.", m_strName.c_str());
|
const char* pszRetData = nullptr;
|
pStep->getReturnData(pszRetData);
|
ASSERT(pszRetData);
|
retCode = (unsigned int)CToolUnits::toInt16(pszRetData);
|
LOGI("<CEquipment-%s>·µ»ØÖµ: %d", m_strName.c_str(), retCode);
|
}
|
else {
|
LOGI("<CEquipment-%s>ÉèÖÃindexerOperationModeʧ°Ü£¬code:%d", m_strName.c_str(), code);
|
}
|
|
if (onWritedRetBlock != nullptr) {
|
onWritedRetBlock(code, retCode);
|
}
|
|
return 0;
|
});
|
|
return 0;
|
}
|
|
int CEquipment::masterRecipeListRequest(short unitNo, ONSYNCINGSTATECHANGED block)
|
{
|
SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(STEP_EQ_MASTER_RECIPE_LIST_REQ);
|
if (pStep == nullptr) {
|
return -1;
|
}
|
|
LOGI("<CEquipment-%s>ÕýÔÚÇëÇóµ¥Ôª<%d>Ö÷Åä·½Áбí", m_strName.c_str(), unitNo);
|
m_recipesManager.setOnSyncingStateChanged(block);
|
if (m_recipesManager.syncing() != 0) {
|
return -2;
|
}
|
pStep->writeShort(unitNo, [&, unitNo](int code) -> int {
|
if (code == WOK) {
|
LOGI("<CEquipment-%s>ÇëÇóµ¥Ôª<%d>Ö÷Åä·½Áбí³É¹¦£¬ÕýÔڵȴýÊý¾Ý.", m_strName.c_str(), unitNo);
|
}
|
else {
|
m_recipesManager.syncFailed();
|
LOGI("<CEquipment-%s>ÇëÇóµ¥Ôª<%d>Ö÷Åä·½Áбíʧ°Ü£¬code:%d", m_strName.c_str(), unitNo, code);
|
}
|
|
return 0;
|
});
|
return 0;
|
}
|
|
int CEquipment::recipeParameterRequest(short masterRecipeId, short localRecipeId, short unitNo)
|
{
|
SERVO::CEqWriteStep* pStep = (SERVO::CEqWriteStep*)getStepWithName(STEP_EQ_MASTER_RECIPE_LIST_REQ);
|
if (pStep == nullptr) {
|
return -1;
|
}
|
|
LOGI("<CEquipment-%s>ÕýÔÚÇëÇóµ¥Ôª<%d>Ö÷Åä·½Áбí", m_strName.c_str(), unitNo);
|
if (m_recipesManager.syncing() != 0) {
|
return -2;
|
}
|
pStep->writeShort(unitNo, [&, unitNo](int code) -> int {
|
if (code == WOK) {
|
LOGI("<CEquipment-%s>ÇëÇóµ¥Ôª<%d>Ö÷Åä·½Áбí³É¹¦£¬ÕýÔڵȴýÊý¾Ý.", m_strName.c_str(), unitNo);
|
}
|
else {
|
m_recipesManager.syncFailed();
|
LOGI("<CEquipment-%s>ÇëÇóµ¥Ôª<%d>Ö÷Åä·½Áбíʧ°Ü£¬code:%d", m_strName.c_str(), unitNo, code);
|
}
|
|
return 0;
|
});
|
return 0;
|
}
|
|
CSlot* CEquipment::getAvailableSlot()
|
{
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
if (m_slot[i].isLock()) continue;
|
if (!m_slot[i].isEmpty()) continue;
|
|
return &m_slot[i];
|
}
|
|
return nullptr;
|
}
|
|
CSlot* CEquipment::getAvailableSlotForGlass(MaterialsType type)
|
{
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
if (m_slot[i].isLock()) continue;
|
if (!m_slot[i].isEmpty()) continue;
|
int lsPath = m_slot[i].getLinkSignalPath();
|
if (!m_bLinkSignalToDownstream[lsPath][SIGNAL_UPSTREAM_INLINE]
|
|| m_bLinkSignalToDownstream[lsPath][SIGNAL_UPSTREAM_TROUBLE]
|
|| !m_bLinkSignalToDownstream[lsPath][SIGNAL_INTERLOCK]
|
|| !m_bLinkSignalToDownstream[lsPath][SIGNAL_RECEIVE_ABLE]) continue;
|
|
MaterialsType slotType = m_slot[i].getType();
|
if (type == MaterialsType::G1 && slotType == MaterialsType::G2) continue;
|
if (type == MaterialsType::G2 && slotType == MaterialsType::G1) continue;
|
|
return &m_slot[i];
|
}
|
|
return nullptr;
|
}
|
|
CSlot* CEquipment::getAvailableSlotForGlassExcludeSignal(MaterialsType type)
|
{
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
if (m_slot[i].isLock()) continue;
|
if (!m_slot[i].isEmpty()) continue;
|
|
MaterialsType slotType = m_slot[i].getType();
|
if (type == MaterialsType::G1 && slotType == MaterialsType::G2) continue;
|
if (type == MaterialsType::G2 && slotType == MaterialsType::G1) continue;
|
|
return &m_slot[i];
|
}
|
|
return nullptr;
|
}
|
|
CSlot* CEquipment::getAvailableSlotForGlass2(MaterialsType type, const std::vector<int>& candidates)
|
{
|
for (auto item : candidates) {
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (item == i + 1) {
|
if (!m_slot[i].isEnable()) continue;
|
if (m_slot[i].isLock()) continue;
|
if (!m_slot[i].isEmpty()) continue;
|
|
MaterialsType slotType = m_slot[i].getType();
|
if (type == MaterialsType::G1 && slotType == MaterialsType::G2) continue;
|
if (type == MaterialsType::G2 && slotType == MaterialsType::G1) continue;
|
|
return &m_slot[i];
|
}
|
}
|
}
|
|
return nullptr;
|
}
|
|
CSlot* CEquipment::getNonEmptySlot(MaterialsType putSlotType)
|
{
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
if (m_slot[i].isLock()) continue;
|
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
|
if (pGlass == nullptr) continue;
|
|
MaterialsType glassType = pGlass->getType();
|
if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
|
if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
|
|
return &m_slot[i];
|
}
|
|
return nullptr;
|
}
|
|
CSlot* CEquipment::getProcessedSlot(MaterialsType putSlotType)
|
{
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
if (m_slot[i].isLock()) continue;
|
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
|
if (!isSlotProcessed(i)) continue;
|
if (pGlass == nullptr) continue;
|
int lsPath = m_slot[i].getLinkSignalPath();
|
if(!m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_INLINE]
|
|| m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_TROUBLE]
|
|| !m_bLinkSignalToUpstream[lsPath][SIGNAL_INTERLOCK]
|
|| !m_bLinkSignalToUpstream[lsPath][SIGNAL_SEND_ABLE] ) continue;
|
|
MaterialsType glassType = pGlass->getType();
|
if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
|
if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
|
|
return &m_slot[i];
|
}
|
|
return nullptr;
|
}
|
|
CSlot* CEquipment::getProcessedSlot2(MaterialsType putSlotType, const std::vector<int>& candidates)
|
{
|
for (auto item : candidates) {
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (item == i + 1) {
|
if (!m_slot[i].isEnable()) continue;
|
if (m_slot[i].isLock()) continue;
|
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
|
if (pGlass == nullptr) continue;
|
if (!isSlotProcessed(i+1)) continue;
|
int lsPath = m_slot[i].getLinkSignalPath();
|
if (!m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_INLINE]
|
|| m_bLinkSignalToUpstream[lsPath][SIGNAL_UPSTREAM_TROUBLE]
|
|| !m_bLinkSignalToUpstream[lsPath][SIGNAL_INTERLOCK]
|
|| !m_bLinkSignalToUpstream[lsPath][SIGNAL_SEND_ABLE]) continue;
|
|
MaterialsType glassType = pGlass->getType();
|
if (glassType == MaterialsType::G1 && putSlotType == MaterialsType::G2) continue;
|
if (glassType == MaterialsType::G2 && putSlotType == MaterialsType::G1) continue;
|
|
return &m_slot[i];
|
}
|
}
|
}
|
|
return nullptr;
|
}
|
|
CSlot* CEquipment::getSlot(int index)
|
{
|
if (index >= SLOT_MAX) return nullptr;
|
return &m_slot[index];
|
}
|
|
CGlass* CEquipment::getAnyGlass()
|
{
|
CSlot* pSlot = nullptr;
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
CGlass* pGlass = (CGlass*)m_slot[i].getContext();
|
if (pGlass == nullptr) continue;
|
return pGlass;
|
}
|
|
return nullptr;
|
}
|
|
BOOL CEquipment::canPlaceGlassInSlot(const short slotIndex)
|
{
|
if (slotIndex >= SLOT_MAX) return FALSE;
|
if (!m_slot[slotIndex].isEnable()) return FALSE;
|
if (m_slot[slotIndex].getContext() != nullptr) return FALSE;
|
|
return TRUE;
|
}
|
|
int CEquipment::removeGlass(int slotNo)
|
{
|
CSlot* pSlot = nullptr;
|
for (int i = 0; i < SLOT_MAX; i++) {
|
if (!m_slot[i].isEnable()) continue;
|
if (m_slot[i].getNo() != slotNo) continue;
|
pSlot = &m_slot[i];
|
break;
|
}
|
|
if (pSlot == nullptr) return -1;
|
pSlot->setContext(nullptr);
|
return 0;
|
}
|
|
short CEquipment::decodeRecipeListReport(const char* pszData, size_t size)
|
{
|
return m_recipesManager.decodeRecipeListReport(pszData, size);
|
}
|
|
short CEquipment::decodeRecipeParameterReport(const char* pszData, size_t size)
|
{
|
return m_recipesManager.decodeRecipeParameterReport(pszData, size);
|
}
|
|
int CEquipment::decodeProcessDataReport(CStep* pStep, const char* pszData, size_t size)
|
{
|
CProcessData processData;
|
int nRet = processData.unserialize(&pszData[0], (int)size);
|
if (nRet < 0) return nRet;
|
|
// »º´æAttribute£¬ÓÃÓÚµ÷ÊÔʱÏÔʾÐÅÏ¢
|
unsigned int weight = 201;
|
CAttributeVector& attrubutes = pStep->attributeVector();
|
processData.getAttributeVector(attrubutes, weight);
|
onProcessData(&processData);
|
|
return nRet;
|
}
|
|
int CEquipment::decodeReceivedJobReport(CStep* pStep, int port, const char* pszData, size_t size)
|
{
|
CJobDataS jobDataS;
|
int nRet = jobDataS.unserialize(&pszData[0], (int)size);
|
if (nRet < 0) return nRet;
|
|
// »º´æAttribute£¬ÓÃÓÚµ÷ÊÔʱÏÔʾÐÅÏ¢
|
unsigned int weight = 201;
|
CAttributeVector& attrubutes = pStep->attributeVector();
|
jobDataS.getAttributeVector(attrubutes, weight);
|
onReceivedJob(port, &jobDataS);
|
|
return nRet;
|
}
|
|
int CEquipment::onReceivedJob(int port, CJobDataS* pJobDataS)
|
{
|
LOGI("<CEquipment-%s>onReceivedJob.", m_strName.c_str());
|
|
// ¿ÉÒÔÔڴ˸üÐÂJobDataSÊý¾ÝÁË
|
CGlass* pGlass = getGlassFromSlot(port);
|
if (pGlass == nullptr) {
|
LOGE("<CEquipment-%s>onSentOutJob,ûÓÐÕÒµ½¶ÔÓ¦µÄGlass(CassetteSequenceNo:%d, JobSequenceNo:%d, ID=%s)£¬Çë¼ì²éÊý¾Ý£¬×¢Òâ·çÏÕ¡£",
|
m_strName.c_str(), pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo(),
|
pJobDataS->getGlass1Id().c_str());
|
return -1;
|
}
|
pGlass->updateJobDataS(pJobDataS);
|
|
return 0;
|
}
|
|
int CEquipment::decodeSentOutJobReport(CStep* pStep, int port, const char* pszData, size_t size)
|
{
|
CJobDataS jobDataS;
|
int nRet = jobDataS.unserialize(&pszData[0], (int)size);
|
if (nRet < 0) return nRet;
|
|
// »º´æAttribute£¬ÓÃÓÚµ÷ÊÔʱÏÔʾÐÅÏ¢
|
unsigned int weight = 201;
|
CAttributeVector& attrubutes = pStep->attributeVector();
|
jobDataS.getAttributeVector(attrubutes, weight);
|
onSentOutJob(port, &jobDataS);
|
|
return nRet;
|
}
|
|
int CEquipment::onSentOutJob(int port, CJobDataS* pJobDataS)
|
{
|
LOGI("<CEquipment-%s>onSentOutJob.", m_strName.c_str());
|
|
return 0;
|
}
|
|
int CEquipment::decodeFetchedOutJobReport(CStep* pStep, int port, const char* pszData, size_t size)
|
{
|
int index = 0;
|
short unitOrPort, unitOrPortNo, subUnitNo, subSlotNo;
|
CJobDataB jobDataB;
|
int nRet = jobDataB.unserialize(&pszData[index], (int)size);
|
if (nRet < 0) return nRet;
|
index += nRet;
|
|
memcpy(&unitOrPort, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&unitOrPortNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&subUnitNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&subSlotNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
|
|
// »º´æAttribute£¬ÓÃÓÚµ÷ÊÔʱÏÔʾÐÅÏ¢
|
unsigned int weight = 201;
|
pStep->addAttribute(new CAttribute("UnitOrPort",
|
std::to_string(unitOrPort).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("UnitOrPortNo",
|
std::to_string(unitOrPortNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("SubUnitNo",
|
std::to_string(subUnitNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("SubSlotNo",
|
std::to_string(subSlotNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("CassetteSequenceNo",
|
std::to_string(jobDataB.getCassetteSequenceNo()).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("JobSequenceNo",
|
std::to_string(jobDataB.getJobSequenceNo()).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("GlassId",
|
jobDataB.getGlassId().c_str(), "", weight++));
|
|
|
onFetchedOutJob(port, &jobDataB);
|
|
return index;
|
}
|
|
BOOL CEquipment::onPreFetchedOutJob(int port, CJobDataB* pJobDataB)
|
{
|
LOGI("<CEquipment-%s>onPreFetchedOutJob:port:%d|GlassId:%s",
|
m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
|
if (m_listener.onPreFethedOutJob != nullptr) {
|
return m_listener.onPreFethedOutJob(this, port, pJobDataB);
|
}
|
|
return TRUE;
|
}
|
|
int CEquipment::onFetchedOutJob(int port, CJobDataB* pJobDataB)
|
{
|
LOGI("<CEquipment-%s>onFetchedOutJob:port:%d|GlassId:%s",
|
m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
|
|
BOOL bCheck = onPreFetchedOutJob(port, pJobDataB);
|
if (bCheck) {
|
return fetchedOutJob(port, pJobDataB);
|
}
|
|
// Êý¾ÝÒì³££¬´¦Àí»òÏÔʾ
|
LOGI("<CEquipment-%s>onFetchedOutJob Error.ort:%d|GlassId:%s",
|
m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
|
return -1;
|
}
|
|
int CEquipment::decodeStoredJobReport(CStep* pStep, int port, const char* pszData, size_t size)
|
{
|
int index = 0;
|
short unitOrPort, unitOrPortNo, subUnitNo, subSlotNo;
|
CJobDataB jobDataB;
|
int nRet = jobDataB.unserialize(&pszData[index], (int)size);
|
if (nRet < 0) return nRet;
|
index += nRet;
|
|
memcpy(&unitOrPort, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&unitOrPortNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&subUnitNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&subSlotNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
|
|
// »º´æAttribute£¬ÓÃÓÚµ÷ÊÔʱÏÔʾÐÅÏ¢
|
unsigned int weight = 201;
|
pStep->addAttribute(new CAttribute("UnitOrPort",
|
std::to_string(unitOrPort).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("UnitOrPortNo",
|
std::to_string(unitOrPortNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("SubUnitNo",
|
std::to_string(subUnitNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("SubSlotNo",
|
std::to_string(subSlotNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("CassetteSequenceNo",
|
std::to_string(jobDataB.getCassetteSequenceNo()).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("JobSequenceNo",
|
std::to_string(jobDataB.getJobSequenceNo()).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("GlassId",
|
jobDataB.getGlassId().c_str(), "", weight++));
|
|
|
onStoredJob(port, &jobDataB);
|
|
return index;
|
}
|
|
int CEquipment::decodeVCREventReport(CStep* pStep, const char* pszData, size_t size)
|
{
|
CVcrEventReport vcrEventReport;
|
vcrEventReport.unserialize(pszData, size);
|
LOGI("<CEquipment-%s>decodeVCREventReport<Result:%d, GlassId:%s>\n", m_strName.c_str(),
|
vcrEventReport.getVcrResult(),
|
vcrEventReport.getGlassId().c_str());
|
|
|
// »º´æAttribute£¬ÓÃÓÚµ÷ÊÔʱÏÔʾÐÅÏ¢
|
unsigned int weight = 201;
|
CAttributeVector& attrubutes = pStep->attributeVector();
|
vcrEventReport.getAttributeVector(attrubutes, weight);
|
|
// 0426, Ïȹ̶¨·µ»Ø1(OK)
|
((CReadStep*)pStep)->setReturnCode((short)VCR_Reply_Code::OK);
|
|
return 0;
|
}
|
|
int CEquipment::decodePanelDataReport(CStep* pStep, const char* pszData, size_t size)
|
{
|
short cassetteNo, jobSequenceNo;
|
int index = 0;
|
std::string strPanelJudgeData, strPanelGradeData;
|
memcpy(&cassetteNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&jobSequenceNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
CToolUnits::convertString(&pszData[index], 128 * 2, strPanelJudgeData);
|
index += 128 * 2;
|
CToolUnits::convertString(&pszData[index], 256 * 2, strPanelJudgeData);
|
index += 256 * 2;
|
|
|
// »º´æAttribute£¬ÓÃÓÚµ÷ÊÔʱÏÔʾÐÅÏ¢
|
unsigned int weight = 201;
|
pStep->addAttribute(new CAttribute("CassetteNo",
|
std::to_string(cassetteNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("JobSequenceNo",
|
std::to_string(jobSequenceNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("PanelJudgeData",
|
strPanelJudgeData.c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("PanelGradeData",
|
strPanelGradeData.c_str(), "", weight++));
|
|
|
return 0;
|
}
|
|
int CEquipment::decodeFacDataReport(CStep* pStep, const char* pszData, size_t size)
|
{
|
int index = 0;
|
std::string strSvTimeRecord, strSvData;
|
CToolUnits::convertString(&pszData[index], 8 * 2, strSvTimeRecord);
|
index += 128 * 2;
|
CToolUnits::convertString(&pszData[index], 640 * 2, strSvData);
|
index += 256 * 2;
|
|
|
// »º´æAttribute£¬ÓÃÓÚµ÷ÊÔʱÏÔʾÐÅÏ¢
|
unsigned int weight = 201;
|
pStep->addAttribute(new CAttribute("SV Time Record",
|
strSvTimeRecord.c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("SV Data",
|
strSvData.c_str(), "", weight++));
|
|
|
return 0;
|
}
|
|
int CEquipment::decodeJobDataRequest(CStep* pStep, const char* pszData, size_t size)
|
{
|
int index = 0;
|
short cassetteSequenceNo, jobSequenceNo;
|
memcpy(&cassetteSequenceNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&jobSequenceNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
cassetteSequenceNo = 4000;
|
jobSequenceNo = 1;
|
|
|
|
// »º´æAttribute£¬ÓÃÓÚµ÷ÊÔʱÏÔʾÐÅÏ¢
|
unsigned int weight = 201;
|
pStep->addAttribute(new CAttribute("CassetteSequenceNo",
|
(std::to_string(cassetteSequenceNo)).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("JobSequenceNo",
|
(std::to_string(jobSequenceNo)).c_str(), "", weight++));
|
|
|
return 0;
|
}
|
|
int CEquipment::decodeJobProcessStartReport(CStep* pStep, const char* pszData, size_t size)
|
{
|
int port = (int)(__int64)pStep->getProp("Port");
|
LOGI("<CEquipment-%s>decodeJobProcessStartReport, port:%d", getName().c_str(), port);
|
|
short cassetteNo, jobSequenceNo, unitNo, subUnitNo, slotNo;
|
int year, month, day, hour, minute, second;
|
|
int index = 0;
|
memcpy(&cassetteNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&jobSequenceNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&unitNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&subUnitNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&slotNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
|
memcpy(&year, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
month = (int)pszData[index];
|
index += 1;
|
day = (int)pszData[index];
|
index += 1;
|
hour = (int)pszData[index];
|
index += 1;
|
minute = (int)pszData[index];
|
index += 1;
|
second = (int)pszData[index];
|
index += 1;
|
|
LOGI("<CEquipment-%s>cassetteNo:%d, jobSequenceNo:%d,unitNo:%d, subUnitNo:%d, slotNo:%d %d-%d-%d %d:%d:%d",
|
getName().c_str(),
|
cassetteNo,
|
jobSequenceNo,
|
unitNo,
|
subUnitNo,
|
slotNo,
|
year, month, day, hour, minute, second
|
);
|
|
|
if (m_processState != PROCESS_STATE::Processing) {
|
setProcessState(PROCESS_STATE::Processing);
|
}
|
|
|
// »º´æAttribute£¬ÓÃÓÚµ÷ÊÔʱÏÔʾÐÅÏ¢
|
unsigned int weight = 201;
|
pStep->addAttribute(new CAttribute("CassetteNo",
|
std::to_string(cassetteNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("JobSequenceNo",
|
std::to_string(jobSequenceNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("UnitNo",
|
std::to_string(unitNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("SubUnitNo",
|
std::to_string(subUnitNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("SlotNo",
|
std::to_string(slotNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("ProcessStartTime",
|
(std::to_string(year) + std::to_string(day) + std::to_string(day) + std::to_string(hour) + std::to_string(minute) + std::to_string(second)).c_str()
|
, "", weight++));
|
|
return 0;
|
}
|
|
int CEquipment::decodeJobProcessEndReport(CStep* pStep, const char* pszData, size_t size)
|
{
|
int port = (int)(__int64)pStep->getProp("Port");
|
LOGI("<CEquipment-%s>decodeJobProcessEndReport, port:%d", getName().c_str(), port);
|
|
short cassetteNo, jobSequenceNo, unitNo, subUnitNo, slotNo;
|
int year, month, day, hour, minute, second;
|
|
int index = 0;
|
std::string strPanelJudgeData, strPanelGradeData;
|
memcpy(&cassetteNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&jobSequenceNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&unitNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&subUnitNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
memcpy(&slotNo, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
|
memcpy(&year, &pszData[index], sizeof(short));
|
index += sizeof(short);
|
month = (int)pszData[index];
|
index += 1;
|
day = (int)pszData[index];
|
index += 1;
|
hour = (int)pszData[index];
|
index += 1;
|
minute = (int)pszData[index];
|
index += 1;
|
second = (int)pszData[index];
|
index += 1;
|
|
LOGI("<CEquipment-%s>cassetteNo:%d, jobSequenceNo:%d,unitNo:%d, subUnitNo:%d, slotNo:%d %d-%d-%d %d:%d:%d",
|
getName().c_str(),
|
cassetteNo,
|
jobSequenceNo,
|
unitNo,
|
subUnitNo,
|
slotNo,
|
year, month, day, hour, minute, second
|
);
|
|
|
if (m_processState != PROCESS_STATE::Complete) {
|
setProcessState(PROCESS_STATE::Complete);
|
}
|
|
CGlass* pGlass = getGlassFromSlot(slotNo);
|
if (pGlass == nullptr) {
|
LOGE("<CEquipment-%s>decodeJobProcessEndReport, ÕÒ²»µ½¶ÔÓ¦glass", getName().c_str());
|
}
|
else {
|
CJobDataS* pJs = pGlass->getJobDataS();
|
if (pJs->getCassetteSequenceNo() == cassetteNo
|
&& pJs->getJobSequenceNo() == jobSequenceNo) {
|
pGlass->processEnd(m_nID, getSlotUnit(slotNo));
|
if (m_processState != PROCESS_STATE::Complete) {
|
setProcessState(PROCESS_STATE::Complete);
|
}
|
}
|
else {
|
LOGE("<CEquipment-%s>decodeJobProcessEndReport, jobSequenceNo»òjobSequenceNo²»Æ¥Åä",
|
getName().c_str());
|
}
|
}
|
|
|
|
|
// »º´æAttribute£¬ÓÃÓÚµ÷ÊÔʱÏÔʾÐÅÏ¢
|
unsigned int weight = 201;
|
pStep->addAttribute(new CAttribute("CassetteNo",
|
std::to_string(cassetteNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("JobSequenceNo",
|
std::to_string(jobSequenceNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("UnitNo",
|
std::to_string(unitNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("SubUnitNo",
|
std::to_string(subUnitNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("SlotNo",
|
std::to_string(slotNo).c_str(), "", weight++));
|
pStep->addAttribute(new CAttribute("ProcessStartTime",
|
(std::to_string(year) + std::to_string(day) + std::to_string(day) + std::to_string(hour) + std::to_string(minute) + std::to_string(second)).c_str()
|
, "", weight++));
|
|
return 0;
|
}
|
|
int CEquipment::onPreStoredJob(int port, CJobDataB* pJobDataB, short& putSlot)
|
{
|
LOGI("<CEquipment-%s>onPreStoredJob:port:%d|GlassId:%s",
|
m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
|
|
// µ±Ç°Òª´æÆ¬£¬Ö®Ç°¿Ï¶¨ÓÐ°ÎÆ¬£¬Òò´ËƬ×ÓÔÚArmÄÇÀï
|
CGlass* pGlass = ((CArm*)m_pArm)->getGlassFromSlot(1);
|
if (pGlass == nullptr) {
|
LOGE("<CFliper-%s>onPreStoredJob,»º´æÖÐûÓÐÕÒµ½¶ÔÓ¦µÄGlass(CassetteSequenceNo:%d, JobSequenceNo:%d)£¬Çë¼ì²éÊý¾Ý£¬×¢Òâ·çÏÕ¡£", m_strName.c_str(),
|
pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo());
|
return FALSE;
|
}
|
|
CJobDataS* pJobDataS = pGlass->getJobDataS();
|
ASSERT(pJobDataS);
|
if (!compareJobData(pJobDataB, pJobDataS)) {
|
LOGE("<CEquipemnt-%s>onPreStoredJob,JobDataÊý¾Ý²»Æ¥Åä(JobDataB(%d, %d),JobDataS(%d, %d)), ×¢ÒâÅŲé·çÏÕ!", m_strName.c_str(),
|
pJobDataB->getCassetteSequenceNo(), pJobDataB->getJobSequenceNo(),
|
pJobDataS->getCassetteSequenceNo(), pJobDataS->getJobSequenceNo());
|
return FALSE;
|
}
|
|
// Èç¹ûûÓпÉÓÃλÖ㬱¨´í
|
Lock();
|
CSlot* pSlot = getSlot(putSlot - 1);
|
ASSERT(pSlot);
|
if (pSlot->getContext() != nullptr) {
|
Unlock();
|
LOGE("<CEquipemnt-%s>onPreStoredJob,Ö¸¶¨slot(port:%d)ÓÐÁÏ£¬Çë×¢Òâ·çÏÕ£¡", m_strName.c_str(), port);
|
return FALSE;
|
}
|
Unlock();
|
|
|
if (m_listener.onPreStoredJob != nullptr) {
|
if (!m_listener.onPreStoredJob(this, port, pJobDataB, putSlot)) {
|
return FALSE;
|
}
|
|
if(!canPlaceGlassInSlot(putSlot - 1)) {
|
return FALSE;
|
}
|
}
|
|
return TRUE;
|
}
|
|
int CEquipment::onStoredJob(int port, CJobDataB* pJobDataB)
|
{
|
LOGI("<CEquipment-%s>onStore:port:%d|GlassId:%s",
|
m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
|
|
short putSlot = 0;
|
BOOL bCheck = onPreStoredJob(port, pJobDataB, putSlot);
|
if (bCheck) {
|
return storedJob(port, pJobDataB, putSlot);
|
}
|
|
// Êý¾ÝÒì³££¬´¦Àí»òÏÔʾ
|
LOGI("<CEquipment-%s>onStoredJob Error.port:%d|GlassId:%s",
|
m_strName.c_str(), port, pJobDataB->getGlassId().c_str());
|
return -1;
|
}
|
|
int CEquipment::onProcessData(CProcessData* pProcessData)
|
{
|
LOGI("<CEquipment-%s>onProcessData.", m_strName.c_str());
|
|
return 0;
|
}
|
|
/*
|
* µ±´ÓCC-Link¼ì²âµ½É豸Send AbleΪOnʱµ÷Óô˺¯Êý
|
* ¿ÉÄÜ»á¶à´ÎÖØ¸´µ÷ÓÃ(¸ù¾ÝɨÃèÆµÂÊ), ×¢Òâ·À´ô
|
*/
|
int CEquipment::onSendAble(int port)
|
{
|
LOGI("<CEquipment-%s>onSendAble.port:%d", m_strName.c_str(), port);
|
|
return 0;
|
}
|
|
int CEquipment::onReceiveAble(int port)
|
{
|
LOGI("<CEquipment-%s>onReceiveAble.port:%d", m_strName.c_str(), port);
|
|
return 0;
|
}
|
|
int CEquipment::onProcessStateChanged(PROCESS_STATE state)
|
{
|
return 0;
|
}
|
|
int CEquipment::getIndexerOperationModeBaseValue()
|
{
|
return 0;
|
}
|
|
BOOL CEquipment::compareJobData(CJobDataB* pJobDataB, CJobDataS* pJobDataS)
|
{
|
ASSERT(pJobDataB);
|
ASSERT(pJobDataS);
|
|
if (pJobDataB->getCassetteSequenceNo() != pJobDataS->getCassetteSequenceNo())
|
return FALSE;
|
if (pJobDataB->getJobSequenceNo() != pJobDataS->getJobSequenceNo())
|
return FALSE;
|
|
return TRUE;
|
}
|
|
void CEquipment::printDebugString001()
|
{
|
for (int i = 0; i < 8; i++) {
|
LOGI("<CEquipment-%s>Link Signal to UP stream Path#%d, Signal:%s, %s, %s, %s",
|
m_strName.c_str(), i,
|
m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_INLINE] ? "ON" : "OFF",
|
m_bLinkSignalToUpstream[i][SIGNAL_UPSTREAM_TROUBLE] ? "ON" : "OFF",
|
m_bLinkSignalToUpstream[i][SIGNAL_INTERLOCK] ? "ON" : "OFF",
|
m_bLinkSignalToUpstream[i][SIGNAL_SEND_ABLE] ? "ON" : "OFF"
|
);
|
}
|
for (int i = 0; i < 8; i++) {
|
LOGI("<CEquipment-%s>Link Signal to Down stream Path#%d, Signal:%s, %s, %s, %s",
|
m_strName.c_str(), i,
|
m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_INLINE] ? "ON" : "OFF",
|
m_bLinkSignalToDownstream[i][SIGNAL_UPSTREAM_TROUBLE] ? "ON" : "OFF",
|
m_bLinkSignalToDownstream[i][SIGNAL_INTERLOCK] ? "ON" : "OFF",
|
m_bLinkSignalToDownstream[i][SIGNAL_SEND_ABLE] ? "ON" : "OFF"
|
);
|
}
|
}
|
}
|