|
|
@@ -115,6 +115,7 @@ static const char* GetLightSeqString(int seq)
|
|
|
|
|
|
void CGpioServiceSession::Handle_Set(SpOnewayCallContext<GpioService_Set_Info>::Pointer ctx)
|
|
|
{
|
|
|
+ DbgToBeidou(ctx->link, __FUNCTION__)();
|
|
|
GpioService_Set_Info req = ctx->Info;
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("devseq=%d", req.devseq);
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("mode=%d", req.mode);
|
|
|
@@ -124,11 +125,13 @@ void CGpioServiceSession::Handle_Set(SpOnewayCallContext<GpioService_Set_Info>::
|
|
|
|
|
|
void CGpioServiceSession::Handle_GetStatus(SpReqAnsContext<GpioService_GetStatus_Req, GpioService_GetStatus_Ans>::Pointer ctx)
|
|
|
{
|
|
|
+ DbgToBeidou(ctx->link, __FUNCTION__)();
|
|
|
m_pEntity->GetStatus(ctx->Req.devseq, ctx);
|
|
|
}
|
|
|
|
|
|
void CGpioServiceSession::Handle_QueryCurrSet(SpReqAnsContext<GpioService_QueryCurrSet_Req, GpioService_QueryCurrSet_Ans>::Pointer ctx)
|
|
|
{
|
|
|
+ DbgToBeidou(ctx->link, __FUNCTION__)();
|
|
|
DevOutputInfo output;
|
|
|
output = m_pEntity->GetCurrDevStatus();
|
|
|
ctx->Ans.dir = output.dir;
|
|
|
@@ -187,6 +190,54 @@ void CGpioEntity::ToLogRootINIInfo()
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+struct GpioInitTask : public ITaskSp {
|
|
|
+ CGpioEntity* m_entity;
|
|
|
+ CSmartPointer<ITransactionContext> m_pTransactionContext;
|
|
|
+ GpioInitTask(CGpioEntity* entity, CSmartPointer<ITransactionContext> pTransactionContext) :m_entity(entity), m_pTransactionContext(pTransactionContext) {}
|
|
|
+
|
|
|
+ void Process()
|
|
|
+ {
|
|
|
+ m_entity->InitializeVendorLogSwitch();
|
|
|
+ ErrorCodeEnum err = m_entity->Initial();
|
|
|
+ if (err == Error_Succeed)
|
|
|
+ {
|
|
|
+ LOG_TRACE("Gpio open succeeded.");
|
|
|
+
|
|
|
+ //oiltest 20130118 for audiodg handle
|
|
|
+ m_entity->GetStatus(PHONEPICKUP, NULL);
|
|
|
+
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("subscribelog...");
|
|
|
+ m_entity->GetFunction()->SubscribeLog(m_entity->m_uuidHealth, m_entity, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "HealthManager");
|
|
|
+ m_entity->GetFunction()->SubscribeLog(m_entity->m_uuidIDC, m_entity, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "IDCertificate");
|
|
|
+ m_entity->GetFunction()->SubscribeLog(m_entity->m_uuidFP, m_entity, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "FingerPrint");
|
|
|
+ m_entity->GetFunction()->SubscribeLog(m_entity->m_uuidKB, m_entity, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "PinPad");
|
|
|
+ m_entity->GetFunction()->SubscribeLog(m_entity->m_uuidCR, m_entity, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "CardIssuer");
|
|
|
+ m_entity->GetFunction()->SubscribeLog(m_entity->m_uuidCA, m_entity, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "CustomerAware");
|
|
|
+ m_entity->GetFunction()->SubscribeLog(m_entity->m_uuidCC, m_entity, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "ContactlessCard");
|
|
|
+ m_entity->GetFunction()->SubscribeLog(m_entity->m_uuidDD, m_entity, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "DeviceControl");
|
|
|
+ m_entity->GetFunction()->SubscribeLog(m_entity->m_uuidCS, m_entity, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "CardSwiper");
|
|
|
+ m_entity->GetFunction()->SubscribeLog(m_entity->m_uuidHSPscanner, m_entity, Log_Event, Severity_Middle, Error_IgnoreAll, -1, "HSPScanner");
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("sub ok...");
|
|
|
+
|
|
|
+ m_pTransactionContext->SendAnswer(Error_Succeed);
|
|
|
+ DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("send Error_Succeed ok...");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("gpio open failed(%d).", err);
|
|
|
+ m_pTransactionContext->SendAnswer(Error_Unexpect);
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+void CGpioEntity::OnPreStart(CAutoArray<CSimpleStringA> strArgs, CSmartPointer<ITransactionContext> pTransactionContext)
|
|
|
+{
|
|
|
+ LOG_FUNCTION();
|
|
|
+ GpioInitTask* initTask = new GpioInitTask(this, pTransactionContext);
|
|
|
+ GetFunction()->PostThreadPoolTask(initTask);
|
|
|
+}
|
|
|
+
|
|
|
void CGpioEntity::ToLogWarnInfoAboutTerm(const AdapterInfo& m_adapterInfo)
|
|
|
{
|
|
|
LOG_FUNCTION();
|
|
|
@@ -203,10 +254,20 @@ void CGpioEntity::ToLogWarnInfoAboutTerm(const AdapterInfo& m_adapterInfo)
|
|
|
SP::Module::Util::HexBuf2StrBuf(fileHash, &strFileHash, 32);
|
|
|
|
|
|
//calculate file size
|
|
|
- struct stat statbuf;
|
|
|
- ZeroMemory(&statbuf, sizeof(statbuf));
|
|
|
- stat(m_adapterInfo.adapterFileName.GetData(), &statbuf);
|
|
|
- int fileSize = statbuf.st_size;
|
|
|
+#if defined(RVC_OS_LINUX)
|
|
|
+ struct stat statbuf;
|
|
|
+ ZeroMemory(&statbuf, sizeof(statbuf));
|
|
|
+ stat(m_adapterInfo.adapterFilePath.GetData(), &statbuf);
|
|
|
+ int fileSize = statbuf.st_size;
|
|
|
+#else
|
|
|
+ int fileSize = 0;
|
|
|
+ HANDLE hFile;
|
|
|
+ hFile = CreateFile(m_adapterInfo.adapterFilePath.GetData(), 0, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
|
|
|
+ if (hFile != INVALID_HANDLE_VALUE) {
|
|
|
+ fileSize = GetFileSize(hFile, NULL);
|
|
|
+ CloseHandle(hFile);
|
|
|
+ }
|
|
|
+#endif //RVC_OS_LINUX
|
|
|
|
|
|
termInfo["VendorDllName"] = m_adapterInfo.adapterFileName;
|
|
|
termInfo["VendorDllFileHash"] = strFileHash;
|
|
|
@@ -278,7 +339,7 @@ ErrorCodeEnum CGpioEntity::Initial()
|
|
|
DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("load up %s failed: %s", dllName.GetData(), SpStrError(eErrDev));
|
|
|
return Error_DevLoadFileFailed;
|
|
|
}
|
|
|
- m_adapterInfo.adapterFileName = dllName;
|
|
|
+ m_adapterInfo.adapterFilePath = dllName;
|
|
|
int initTries = 0;
|
|
|
do {
|
|
|
DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to open device.");
|
|
|
@@ -353,12 +414,15 @@ ErrorCodeEnum CGpioEntity::Initial()
|
|
|
}
|
|
|
|
|
|
err = m_hDevHelper->WritePort(0, 0x00);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write ports(0) returned: %s)", SpStrError(err));
|
|
|
+ if (err != Error_Succeed)
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("write ports(0) returned: %s)", SpStrError(err));
|
|
|
err = m_hDevHelper->WritePort(1, 0x00);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write ports(1) returned: %s)", SpStrError(err));
|
|
|
+ if (err != Error_Succeed)
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("write ports(1) returned: %s)", SpStrError(err));
|
|
|
if (m_bNewVersion) {
|
|
|
err = m_hDevHelper->WritePort(3, 0x00);
|
|
|
- DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("write ports(3) returned: %s)", SpStrError(err));
|
|
|
+ if (err != Error_Succeed)
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("write ports(3) returned: %s)", SpStrError(err));
|
|
|
}
|
|
|
|
|
|
//oilyang@20170214
|
|
|
@@ -893,7 +957,7 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
|
|
|
if (initCtt == 1) {
|
|
|
if (DetectBit(btInput, VIBRATIONSENSOR)) {
|
|
|
- if (!m_bVibrationFlag && (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)) {
|
|
|
+ if (!m_bVibrationFlag && IfHaveMoveDetect()) {
|
|
|
LogEvent(Severity_Middle, LOG_EVT_VIBRATIONSENSOR, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(17), __LINE__));
|
|
|
}
|
|
|
m_bVibrationFlag = true;
|
|
|
@@ -905,7 +969,7 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
|
|
|
if (m_bVibrationRound) {
|
|
|
if (DetectBit(btInput, VIBRATIONSENSOR) && !m_bVibrationFlag) {
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_VIBRATIONSENSOR, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(17), __LINE__));
|
|
|
m_bVibrationFlag = true;
|
|
|
m_bVibrationRound = false;
|
|
|
@@ -929,12 +993,12 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
if (initCtt == 1) {
|
|
|
if (DetectBit(btInput, OPENSENSOR)) {
|
|
|
if (!m_bOpenFlag) {
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_OPENSENSOR_ON, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(18), __LINE__));
|
|
|
m_bOpenFlag = true;
|
|
|
}
|
|
|
} else if (m_bOpenFlag) {
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_OPENSENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(18), __LINE__));
|
|
|
m_bOpenFlag = false;
|
|
|
}
|
|
|
@@ -943,13 +1007,13 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
|
|
|
if (m_bOpenRound) {
|
|
|
if (DetectBit(btInput, OPENSENSOR) && !m_bOpenFlag) {
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_OPENSENSOR_ON, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(18), __LINE__));
|
|
|
m_bOpenFlag = true;
|
|
|
m_bOpenRound = false;
|
|
|
}
|
|
|
} else if (!DetectBit(btInput, OPENSENSOR) && m_bOpenFlag) {
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_OPENSENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(18), __LINE__));
|
|
|
m_bOpenFlag = false;
|
|
|
m_bOpenRound = true;
|
|
|
@@ -968,7 +1032,7 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
|
|
|
if (initCtt == 1) {
|
|
|
|
|
|
- if (m_ePickUpFlag == Unknown) {
|
|
|
+ if (m_ePickUpFlag == UnknownStatus) {
|
|
|
if (DetectBit(btInput, PICKUPSENSOR)) m_ePickUpFlag = Actived;
|
|
|
else if (!DetectBit(btInput, PICKUPSENSOR)) m_ePickUpFlag = InActive;
|
|
|
DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Set initial value: %d", (int)m_ePickUpFlag);
|
|
|
@@ -978,7 +1042,7 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
if (DetectBit(btInput, PICKUPSENSOR)) {
|
|
|
if (m_ePickUpFlag == InActive) {
|
|
|
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_PICKUP, "话机提起");
|
|
|
|
|
|
m_ePickUpFlag = Actived;
|
|
|
@@ -986,7 +1050,7 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
|
|
|
} else if (m_ePickUpFlag == Actived) {
|
|
|
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_ONHOOK, "话机放下");
|
|
|
|
|
|
m_ePickUpFlag = InActive;
|
|
|
@@ -1001,13 +1065,13 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
|
|
|
if (m_ePickUpFlag == InActive) {
|
|
|
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_PICKUP, "话机提起");
|
|
|
|
|
|
m_ePickUpFlag = Actived;
|
|
|
m_bPickUpRound = false;
|
|
|
|
|
|
- } else if (m_ePickUpFlag == Unknown) {
|
|
|
+ } else if (m_ePickUpFlag == UnknownStatus) {
|
|
|
m_ePickUpFlag = Actived;
|
|
|
}
|
|
|
}
|
|
|
@@ -1015,13 +1079,13 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
|
|
|
if (m_ePickUpFlag == Actived) {
|
|
|
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_ONHOOK, "话机放下");
|
|
|
|
|
|
m_ePickUpFlag = InActive;
|
|
|
m_bPickUpRound = true;
|
|
|
|
|
|
- } else if (m_ePickUpFlag == Unknown) {
|
|
|
+ } else if (m_ePickUpFlag == UnknownStatus) {
|
|
|
m_ePickUpFlag = InActive;
|
|
|
}
|
|
|
}
|
|
|
@@ -1038,7 +1102,7 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
do {
|
|
|
if (initCtt == 1) {
|
|
|
if (DetectBit(btInput, MOVESENSOR)) {
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_MOVESENSOR_ON, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(20), __LINE__));
|
|
|
}
|
|
|
break;
|
|
|
@@ -1049,12 +1113,20 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
m_moveDisappearTimes = 0;
|
|
|
if (m_moveHoldTimes < MAX_MOVE_HOLD_TIMES) { // 100ms * 5000
|
|
|
if ((m_moveHoldTimes % LOG_TIME_VALUE) == 0) { //100ms * 25 = 2.5s 但因为厂家接口调用,不进来计数,需要800ms+
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_MOVESENSOR_ON, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(20), __LINE__));
|
|
|
}
|
|
|
} else if ((m_moveHoldTimes % MAX_MOVE_HOLD_TIMES) == 0) { //难道8分钟一直有人就异常?还有一个 Round 标识
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
- LogWarn(Severity_Middle, Error_Unexpect, LOG_EVT_MOVEDETECT_ABNORMAL, "移动次数异常");
|
|
|
+ if (IfHaveMoveDetect()) {
|
|
|
+ SYSTEMTIME localTime;
|
|
|
+ GetLocalTime(&localTime);
|
|
|
+ if (localTime.wHour > 8 && localTime.wHour < 18)
|
|
|
+ LogWarn(Severity_High, Error_Unexpect, LOG_EVT_MOVEDETECT_ABNORMAL_WORKTIME, "Move detect is abnormal(Work time).");
|
|
|
+ else
|
|
|
+ LogWarn(Severity_High, Error_Unexpect, LOG_EVT_MOVEDETECT_ABNORMAL_OFFWORK, "Move detect is abnormal(off work).");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
m_moveHoldTimes++;
|
|
|
m_bMoveRound = false;
|
|
|
@@ -1062,7 +1134,7 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
} else if (!DetectBit(btInput, MOVESENSOR)) {
|
|
|
m_moveHoldTimes = 0;
|
|
|
if ((m_moveDisappearTimes % LOG_TIME_VALUE) == 0) {
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_MOVESENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(20), __LINE__));
|
|
|
}
|
|
|
m_moveDisappearTimes++;
|
|
|
@@ -1083,7 +1155,7 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
if (initCtt == 1) {
|
|
|
if (DetectBit(btInput, CARDGATESENSOR)) {
|
|
|
if (!m_bCardGateFlag) {
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_CARDGATESENSOR, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(21), __LINE__));
|
|
|
m_bCardGateFlag = true;
|
|
|
}
|
|
|
@@ -1094,7 +1166,7 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
|
|
|
if (m_bCardGateRound) {
|
|
|
if (DetectBit(btInput, CARDGATESENSOR) && !m_bCardGateFlag) {
|
|
|
- if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus)
|
|
|
+ if (IfHaveMoveDetect())
|
|
|
LogEvent(Severity_Middle, LOG_EVT_CARDGATESENSOR, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(21), __LINE__));
|
|
|
m_bCardGateFlag = true;
|
|
|
m_bCardGateRound = false;
|
|
|
@@ -1154,7 +1226,7 @@ void CGpioEntity::OnPositiveLevelTimerOut(void* pData)
|
|
|
if (pGci->CttPhone > 1 && !bPhoneOne) {
|
|
|
do {
|
|
|
|
|
|
- if (m_ePickUpFlag == Unknown) {
|
|
|
+ if (m_ePickUpFlag == UnknownStatus) {
|
|
|
if (DetectBit(btInput, PICKUPSENSOR)) m_ePickUpFlag = Actived;
|
|
|
else if (!DetectBit(btInput, PICKUPSENSOR)) m_ePickUpFlag = InActive;
|
|
|
DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Set initial value: %d", (int)m_ePickUpFlag);
|
|
|
@@ -1378,6 +1450,14 @@ BYTE CGpioEntity::GetOutputStatus(int sn)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+bool CGpioEntity::IfHaveMoveDetect()
|
|
|
+{
|
|
|
+ if (m_eMachineType == RVC_Stand2S || m_eMachineType == RVC_Stand1SPlus ||m_eMachineType == RVC_CardPrinter)
|
|
|
+ return true;
|
|
|
+ else
|
|
|
+ return false;
|
|
|
+}
|
|
|
+
|
|
|
SP_BEGIN_ENTITY_MAP()
|
|
|
-SP_ENTITY(CGpioEntity)
|
|
|
-SP_END_ENTITY_MAP()
|
|
|
+ SP_ENTITY(CGpioEntity)
|
|
|
+SP_END_ENTITY_MAP()
|