|
@@ -15,7 +15,7 @@ using namespace ScannerSet;
|
|
|
#include "HSPScanner_client_g.h"
|
|
|
#include "PortableScanner_client_g.h"
|
|
|
#include "HeartBeat_client_g.h"
|
|
|
-
|
|
|
+#include "MediaController_client_g.h"
|
|
|
using namespace HSPScanner;
|
|
|
using namespace PortableScanner;
|
|
|
|
|
@@ -23,6 +23,9 @@ using namespace PortableScanner;
|
|
|
#include "CameraImpl.h"
|
|
|
#endif //RVC_OS_WIN
|
|
|
#include "DeviceCrossHelper.h"
|
|
|
+#include "EventCode.h"
|
|
|
+#include "ScannerSet_UserErrorCode.h"
|
|
|
+#include "CameraOccupySysVar.hpp"
|
|
|
|
|
|
#define ISSUCCEEDED(hr) ((hr) == Error_Succeed)
|
|
|
#define FAILURED(hr) (!(ISSUCCEEDED(hr)))
|
|
@@ -44,11 +47,6 @@ public:
|
|
|
{
|
|
|
|
|
|
}
|
|
|
-
|
|
|
- ~CHSPSInnerClient()
|
|
|
- {
|
|
|
- Dbg("to delete %s", __FUNCTION__);
|
|
|
- }
|
|
|
};
|
|
|
|
|
|
class CPortableScannerClient : public PortableScannerService_ClientBase
|
|
@@ -71,6 +69,16 @@ public:
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+class CMediaCtrlClient : public MediaController::MediaService_ClientBase
|
|
|
+{
|
|
|
+public:
|
|
|
+ CMediaCtrlClient(CEntityBase *pEntity)
|
|
|
+ :MediaController::MediaService_ClientBase(pEntity)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
template<typename TEntity>
|
|
|
struct AvailableEntityCheck {
|
|
|
typedef TEntity Type;
|
|
@@ -152,9 +160,9 @@ public:
|
|
|
SpReqAnsContext<ScannerService_StartPreview_Req, ScannerService_StartPreview_Ans>::Pointer m_ctx;
|
|
|
virtual void OnUnhandled()
|
|
|
{
|
|
|
- if(m_ctx != NULL)
|
|
|
+ if(m_ctx != NULL)
|
|
|
{
|
|
|
- m_ctx->Answer(Error_InvalidState);
|
|
|
+ m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -170,7 +178,7 @@ public:
|
|
|
{
|
|
|
if(m_ctx != NULL)
|
|
|
{
|
|
|
- m_ctx->Answer(Error_InvalidState);
|
|
|
+ m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -186,7 +194,7 @@ public:
|
|
|
{
|
|
|
if(m_ctx != NULL)
|
|
|
{
|
|
|
- m_ctx->Answer(Error_InvalidState);
|
|
|
+ m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -210,7 +218,7 @@ public:
|
|
|
{
|
|
|
if(m_ctx != NULL)
|
|
|
{
|
|
|
- m_ctx->Answer(Error_InvalidState);
|
|
|
+ m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -226,7 +234,7 @@ public:
|
|
|
{
|
|
|
if(m_ctx != NULL)
|
|
|
{
|
|
|
- m_ctx->Answer(Error_InvalidState);
|
|
|
+ m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -242,7 +250,8 @@ public:
|
|
|
{
|
|
|
if(m_ctx != NULL)
|
|
|
{
|
|
|
- m_ctx->Answer(Error_InvalidState);
|
|
|
+ DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("set winpos unhandle!");
|
|
|
+ m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -258,7 +267,7 @@ public:
|
|
|
{
|
|
|
if(m_ctx != NULL)
|
|
|
{
|
|
|
- m_ctx->Answer(Error_InvalidState);
|
|
|
+ m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -274,7 +283,7 @@ public:
|
|
|
{
|
|
|
if(m_ctx != NULL)
|
|
|
{
|
|
|
- m_ctx->Answer(Error_InvalidState);
|
|
|
+ m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -290,7 +299,7 @@ public:
|
|
|
{
|
|
|
if(m_ctx != NULL)
|
|
|
{
|
|
|
- m_ctx->Answer(Error_InvalidState);
|
|
|
+ m_ctx->Answer(Error_InvalidState, LOG_WARN_FSM_INVALID);
|
|
|
}
|
|
|
}
|
|
|
};
|
|
@@ -318,7 +327,7 @@ public:
|
|
|
|
|
|
BEGIN_FSM_STATE(CScannerFSM)
|
|
|
FSM_STATE_ENTRY(s0, "Idle", s0_on_entry, s0_on_exit, s0_on_event)
|
|
|
- FSM_STATE_ENTRY(s1, "Estimate", s1_on_entry, s1_on_exit, s1_on_event)
|
|
|
+ FSM_STATE_ENTRY(s1, "Estimate", s1_on_entry, s1_on_exit, s1_on_event) //no used now!!!
|
|
|
FSM_STATE_ENTRY(s2, "Operating", s2_on_entry, s2_on_exit, s2_on_event)
|
|
|
FSM_STATE_ENTRY(s3, "Failed", s3_on_entry, s3_on_exit, s3_on_event)
|
|
|
FSM_STATE_ENTRY(s4, "Invalid", s4_on_entry, s4_on_exit, s4_on_event)
|
|
@@ -331,7 +340,7 @@ public:
|
|
|
FSM_RULE_ENTRY_ANY(s4, s0, USER_EVT_DEV_RECOVER)
|
|
|
|
|
|
FSM_RULE_ENTRY_ANY(s0, s2, USER_EVT_OPERATING)
|
|
|
-
|
|
|
+ /*S2 中所有处理结果都返回1,见 s2_on_event 实现*/
|
|
|
FSM_RULE_ENTRY(s2, s0, USER_EVT_STARTPREVIEW_FINISHED, 1)
|
|
|
FSM_RULE_ENTRY(s2, s0, USER_EVT_STOPPREVIEW_FINISHED, 1)
|
|
|
FSM_RULE_ENTRY(s2, s0, USER_EVT_SCANIMAGEFINISHED, 1)
|
|
@@ -391,20 +400,33 @@ public:
|
|
|
int GetOnlineDevices(SpReqAnsContext<ScannerService_GetOnlineCameras_Req,
|
|
|
ScannerService_GetOnlineCameras_Ans>::Pointer ctx);
|
|
|
|
|
|
- ErrorCodeEnum DropOffPortScannerDevice();
|
|
|
+ ErrorCodeEnum DropOffPortScannerDevice(bool skipToCheck = true);
|
|
|
|
|
|
void InitializeMehodQueue();
|
|
|
void DestoryMethodQueue();
|
|
|
- void DealWithCrossTermCall(SpReqAnsContext<ScannerService_CrossTermCall_Req,
|
|
|
- ScannerService_CrossTermCall_Ans>::Pointer ctx);
|
|
|
|
|
|
ErrorCodeEnum OnDevExit();
|
|
|
ErrorCodeEnum AttachCheck();
|
|
|
+ ErrorCodeEnum AttachReleaseIfNecessary();
|
|
|
|
|
|
bool IsAgent() const {
|
|
|
return m_bJBMachine;
|
|
|
}
|
|
|
|
|
|
+ bool IsWorking() {
|
|
|
+ return (GetCurrState()->id == s2);
|
|
|
+ }
|
|
|
+
|
|
|
+ const char* GetChildEntityName() {
|
|
|
+ if(m_bUsePortableScanner) {
|
|
|
+ return "PortableScanner";
|
|
|
+ } else {
|
|
|
+ return "HSPSCanner";
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ void OnChildEntityStateChange(const EntityStateEnum& oldState, const EntityStateEnum& curState);
|
|
|
+
|
|
|
private:
|
|
|
|
|
|
CSimpleStringA m_csMachineType;
|
|
@@ -419,6 +441,7 @@ private:
|
|
|
CHSPSInnerClient* m_pHSPSClient;
|
|
|
CPortableScannerClient* m_pPortableClient;
|
|
|
CHeartBeatClient* m_pHeartBeatClient;
|
|
|
+ CMediaCtrlClient* m_pMediaControlClient;
|
|
|
|
|
|
ErrorCodeEnum m_ecSelfTest;
|
|
|
DWORD m_dwErroCode;
|
|
@@ -432,6 +455,7 @@ private:
|
|
|
|
|
|
#if defined(RVC_OS_WIN)
|
|
|
CAMERA_BUCKET m_cameralist;
|
|
|
+ CRITICAL_SECTION cs_devEvt;
|
|
|
#endif //RVC_OS_WIN
|
|
|
std::mutex mMtx;
|
|
|
|
|
@@ -454,6 +478,10 @@ public:
|
|
|
|
|
|
public:
|
|
|
|
|
|
+ bool IsHSPSConnectSessionOK();
|
|
|
+ bool IsPortableConnectSessionOK();
|
|
|
+ bool IsHeartbeatConnectSessionOK();
|
|
|
+
|
|
|
ErrorCodeEnum CheckHSPSConnectStatus();
|
|
|
ErrorCodeEnum ConnectToHSPScanner();
|
|
|
void FreeHSPScannerClient()
|
|
@@ -475,14 +503,41 @@ public:
|
|
|
m_pPortableClient = NULL;
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ bool IsNoralEntityState(const EntityStateEnum& state) {
|
|
|
+ if(state == EntityState_Idle || state == EntityState_Busy
|
|
|
+ || state == EntityState_Pause
|
|
|
+ || state == EntityState_UnLoading) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ return false;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
ErrorCodeEnum GetPortableScannerInfo() {
|
|
|
EntityStateEnum state = EntityState_NoStart;
|
|
|
ErrorCodeEnum rc = GetEntityCurState(state, "PortableScanner");
|
|
|
- Dbg("PortableScanner entity state: %d(%s)", state, SpStrError(rc));
|
|
|
+ LogWarn(Severity_Low,Error_Debug,LOG_ERR_SCANNERSET_PORTABLESCANNER_STATE,
|
|
|
+ CSimpleStringA::Format("PortableScanner entity state: %d(%u)", state, rc));
|
|
|
+ if(rc == Error_Succeed && IsNoralEntityState(state)) {
|
|
|
+ //let it empty.
|
|
|
+ } else if(IsPortScanHoldEnvCameraFromSysVar()){
|
|
|
+ HandleCamereAccessPriviledge(false, CAMTYPE_ENV, m_fixedCamera[CAMTYPE_ENV-1].strDevName);
|
|
|
+ ClearPortScanHoldLimitedDevice(CAMTYPE_MAX);
|
|
|
+ }
|
|
|
return rc;
|
|
|
}
|
|
|
+
|
|
|
ErrorCodeEnum IsPortScanHoldDevice(ScannerDeviceInfo* pInfo, int& curState);
|
|
|
ErrorCodeEnum IsPortScanHoldDevice(bool& hasHolden, int& DevID, CSimpleStringA& strDevName, bool& bBusy);
|
|
|
+ bool IsPortScanHoldLimitedDevice(CapTypeEnum& devType);
|
|
|
+ bool IsPortScanHoldEnvCameraFromSysVar()
|
|
|
+ {
|
|
|
+ CapTypeEnum devType(CAMTYPE_UNKNOWN);
|
|
|
+ return (IsPortScanHoldLimitedDevice(devType) && devType == CAMTYPE_ENV);
|
|
|
+ }
|
|
|
+ void ClearPortScanHoldLimitedDevice(const CapTypeEnum& devType, const char* lpcszDevName = NULL);
|
|
|
+
|
|
|
ErrorCodeEnum TryBindPSDevice(int nDevID, LPCTSTR lpcszDevName);
|
|
|
ErrorCodeEnum BindPSDevice(int nDevID, LPCTSTR lpcszDevName);
|
|
|
int GetAdvancedScannerDevice(ScannerDeviceInfo* pDevInfo);
|
|
@@ -490,6 +545,7 @@ public:
|
|
|
const CAutoArray<CSimpleStringA>& caForbitDeviceNames);
|
|
|
|
|
|
void SendBroadcastAbout();
|
|
|
+ void WaitPortableReleaseCamera(int nCameraType, DWORD dwTimeoutMilSec = 3000);
|
|
|
|
|
|
ErrorCodeEnum CheckHeartbeatConnectStatus();
|
|
|
ErrorCodeEnum ConnectToHeartbeat();
|
|
@@ -500,6 +556,26 @@ public:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ ErrorCodeEnum ConnectToMediaController();
|
|
|
+ void FreeMediaControllerClient()
|
|
|
+ {
|
|
|
+ if(m_pMediaControlClient) {
|
|
|
+ m_pMediaControlClient->GetFunction()->CloseSession();
|
|
|
+ m_pMediaControlClient = NULL;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ErrorCodeEnum GetMediaControllerInfo(EntityStateEnum& curState) {
|
|
|
+ EntityStateEnum state = EntityState_NoStart;
|
|
|
+ ErrorCodeEnum rc = GetEntityCurState(state, "MediaController");
|
|
|
+ DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("MediaController entity state: %d(%u)", state, rc);
|
|
|
+ curState = state;
|
|
|
+ return rc;
|
|
|
+ }
|
|
|
+
|
|
|
+ ErrorCodeEnum AccessCamerePriviledge(bool fWinOver, int nCameraType);
|
|
|
+ ErrorCodeEnum HandleCamereAccessPriviledge(bool fWinOver, int nCameraType, const char* lpcszDevName);
|
|
|
+
|
|
|
+
|
|
|
bool GetAttachedTerminal(CSimpleStringA &csTerm);
|
|
|
//Desperate
|
|
|
//ErrorCodeEnum SendRequest2Heatbeat(DWORD dwMethodSig, const CAutoBuffer& Req, CAutoBuffer& Ans);
|
|
@@ -510,9 +586,15 @@ public:
|
|
|
ErrorCodeEnum ReceiveAnswer5Heartbeat(SpOnewayCallContext<ScannerService_CrossTermInvokeInfo_Info>::Pointer ctx);
|
|
|
ErrorCodeEnum ReceiveRequest5Heartbeat(const ScannerService_CrossTermCall_Req& req,
|
|
|
ScannerService_CrossTermCall_Ans& ans);
|
|
|
+
|
|
|
+
|
|
|
+ UINT UnitTest();
|
|
|
+ void AfterInit();
|
|
|
+
|
|
|
private:
|
|
|
|
|
|
- ErrorCodeEnum GetEntityCurState(EntityStateEnum& state, LPCTSTR lpcszEntityName) {
|
|
|
+ ErrorCodeEnum GetEntityCurState(EntityStateEnum& state, LPCTSTR lpcszEntityName)
|
|
|
+ {
|
|
|
CSmartPointer<IEntityFunction> pFunc = GetEntityBase()->GetFunction();
|
|
|
CSmartPointer<IEntityFunctionPrivilege> pFuncPrivilege =
|
|
|
pFunc.ConvertCase<IEntityFunctionPrivilege>();
|
|
@@ -524,7 +606,8 @@ private:
|
|
|
return ecInfo;
|
|
|
}
|
|
|
|
|
|
- bool IsSuitableEntityAvailable() {
|
|
|
+ bool IsSuitableEntityAvailable()
|
|
|
+ {
|
|
|
if((m_bStand2SMachine && ISSUCCEEDED(ConnectToHSPScanner()))
|
|
|
|| ( (m_bUsePortableScanner) && ISSUCCEEDED(ConnectToPortableScanner()))
|
|
|
|| (m_bJBMachine && ISSUCCEEDED(ConnectToHeartbeat()))) {
|
|
@@ -532,7 +615,9 @@ private:
|
|
|
}
|
|
|
return false;
|
|
|
}
|
|
|
- void ReleaseSuitableEntity() {
|
|
|
+
|
|
|
+ void ReleaseSuitableEntity()
|
|
|
+ {
|
|
|
if(m_bStand2SMachine) {
|
|
|
FreeHSPScannerClient();
|
|
|
}else if(m_bUsePortableScanner) {
|
|
@@ -567,6 +652,10 @@ private:
|
|
|
return (PVOID)ctx.GetRawPointer();
|
|
|
//return reinterpret_cast<PVOID>(ctx.GetRawPointer());
|
|
|
}
|
|
|
+
|
|
|
+ bool ShouldUsePortableScanner() const {
|
|
|
+ return (m_bPadMachine || m_bDesk2SMachine || m_bDesk1SMachine);
|
|
|
+ }
|
|
|
};
|
|
|
|
|
|
struct StartPreviewTask : public ITaskSp
|
|
@@ -581,7 +670,7 @@ struct StartPreviewTask : public ITaskSp
|
|
|
if(ISSUCCEEDED(rc)) {
|
|
|
pEvt->param1 = m_fsm->StartPreview(m_ctx);
|
|
|
}else {
|
|
|
- m_ctx->Answer(Error_DevNotAvailable);
|
|
|
+ m_ctx->Answer(rc, LOG_WARN_ATTACH_FAILED);
|
|
|
pEvt->param1 = 10;
|
|
|
}
|
|
|
m_fsm->PostEventFIFO(pEvt);
|
|
@@ -605,7 +694,11 @@ struct StopPreviewTask : public ITaskSp
|
|
|
void Process()
|
|
|
{
|
|
|
FSMEvent* pEvt = new FSMEvent(USER_EVT_STOPPREVIEW_FINISHED);
|
|
|
+ const bool bOnlyHide = m_ctx->Req.reserved1 == 0 ? false : true;
|
|
|
pEvt->param1 = m_fsm->StopPreview(m_ctx);
|
|
|
+ if(!bOnlyHide) {
|
|
|
+ m_fsm->AttachReleaseIfNecessary();
|
|
|
+ }
|
|
|
m_fsm->PostEventFIFO(pEvt);
|
|
|
return;
|
|
|
}
|
|
@@ -684,6 +777,49 @@ struct ShowPropertyTask : public ITaskSp
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+
|
|
|
+struct PendingTask : public ITaskSp
|
|
|
+{
|
|
|
+ CScannerFSM* m_fsm;
|
|
|
+ SpReqAnsContext<ScannerService_SetWindowPos_Req,
|
|
|
+ ScannerService_SetWindowPos_Ans>::Pointer m_ctx;
|
|
|
+ PendingTask(CScannerFSM* fsm): m_fsm(fsm){}
|
|
|
+ void Process()
|
|
|
+ {
|
|
|
+ LOG_FUNCTION();
|
|
|
+ WaitingFSMForIdle();
|
|
|
+ SetWinPosEvent* pEvent = new SetWinPosEvent();
|
|
|
+ pEvent->m_ctx = m_ctx;
|
|
|
+ m_fsm->PostEventFIFO(pEvent);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ void SetContext(
|
|
|
+ SpReqAnsContext<ScannerService_SetWindowPos_Req,
|
|
|
+ ScannerService_SetWindowPos_Ans>::Pointer ctx)
|
|
|
+ {
|
|
|
+ m_ctx = ctx;
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+private:
|
|
|
+
|
|
|
+ void WaitingFSMForIdle()
|
|
|
+ {
|
|
|
+ static const int waitTimes = 30;
|
|
|
+ static const int waitEachTimeout = 300;
|
|
|
+ int waitCurrTimes = 0;
|
|
|
+
|
|
|
+ while(m_fsm->IsWorking() && (++waitCurrTimes <= waitTimes)) {
|
|
|
+ Sleep(waitEachTimeout);
|
|
|
+ }
|
|
|
+
|
|
|
+ if(waitCurrTimes > waitTimes) {
|
|
|
+ LogWarn(Severity_Low, Error_TimeOut,
|
|
|
+ LOG_EVT_SCANNERSET_HSPSCNT_TASK_TIMEOUT, "Waiting FSM to Idle timeout!");
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
struct SetWinPosTask : public ITaskSp
|
|
|
{
|
|
|
CScannerFSM* m_fsm;
|