GpioFSM.cpp 33 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021
  1. #include "GpioFSM.h"
  2. #include "publicFunExport.h"
  3. #include "EventCode.h"
  4. #include <bitset>
  5. const int MAX_GPIO_INIT_TRIES = 3;
  6. const int INPUT_PORT_2 = 2;
  7. const int MAX_MOVE_HOLD_TIMES = 5000;
  8. const int ON_EVENT_DETECT_TIMOUE_MILLSECS = 500;
  9. const int REPEAT_FIRE_TIMEOUT_VALUE = 10000; //10s
  10. #define SETBIT(x,y) x|=(1<<(y))
  11. #define CLEARBIT(x,y) x&=((1<<(y))^0xffffff)
  12. using namespace SP::Module::Comm;
  13. static const char* GetDriverPortStringZhCN(int pin)
  14. {
  15. switch (pin) {
  16. case 1: return "【驱动】读卡发卡器提示灯";
  17. case 2: return "【驱动】前端USB通断控制";
  18. case 3: return "【驱动】身份证阅读器提示灯";
  19. case 4: return "【驱动】密码键盘提示灯";
  20. case 5: return "【驱动】脸部照明灯";
  21. case 6: return "【驱动】故障灯";
  22. case 7: return "【驱动】读卡发卡器维护提示灯";
  23. case 8: return "【驱动】前端USB口提示灯";
  24. case 9: return "【驱动】非接IC读卡器提示灯";
  25. case 10: return "";
  26. case 11: return "【驱动】指纹仪提示灯";
  27. case 12: return "【驱动】凭条打印提示灯";
  28. case 13: return "【驱动】高拍仪提示灯";
  29. case 14: return "";
  30. case 15: return "";
  31. case 16: return "";
  32. case 17: return "【接收】震动探测器";
  33. case 18: return "【接收】机具门感应开关";
  34. case 19: return "【接收】话机提机感应开关";
  35. case 20: return "【接收】人体探测感应器";
  36. case 21: return "【接收】发卡器卡嘴覆盖探测器";
  37. //case 22: return "";
  38. //case 23: return "";
  39. //case 24: return "";
  40. //case 25: return "";
  41. case 26: return "【驱动】高拍仪提示灯";
  42. //case 27: return "";
  43. //case 28: return "";
  44. //case 29: return "";
  45. //case 30: return "";
  46. //case 31: return "";
  47. //case 32: return "";
  48. //case 33: return "";
  49. //case 34: return "";
  50. //case 35: return "";
  51. //case 36: return "";
  52. //case 37: return "";
  53. //case 38: return "";
  54. //case 39: return "";
  55. //case 40: return "";
  56. //case 41: return "";
  57. //case 42: return "";
  58. default:
  59. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unkown pin sequence: %d", pin);
  60. return "";
  61. break;
  62. }
  63. }
  64. static const char* pinStatusName[8][2] =
  65. {
  66. {"无震动", "**有震动**"},
  67. {"关门", "**开门**"},
  68. {"挂机", "**摘机**"},
  69. {"无移动", "**移动**"},
  70. {"卡嘴正常", "**卡嘴不正常**"},
  71. {"Pin 22 Normal", "**Pin 22 High**"},
  72. {"Pin 23 Normal", "**Pin 23 High**"},
  73. {"Pin 24 Normal", "**Pin 24 High**"}
  74. };
  75. static const char* GetDriverPortString(int pin)
  76. {
  77. switch (pin) {
  78. case 1: return "[Driver] CarIssuer Tip Light";
  79. case 2: return "[Driver] USB Switch";
  80. case 3: return "[Driver] IDCer Tip Light";
  81. case 4: return "[Driver] PinPad Tip Light";
  82. case 5: return "[Driver] Face Light";
  83. case 6: return "[Driver] Maintain Light";
  84. case 7: return "[Driver] CardIssuser Mouse Maintain Light";
  85. case 8: return "[Driver] USB Tip Light";
  86. case 9: return "[Driver] RF Tip Light";
  87. case 10: return "";
  88. case 11: return "[Driver] FingerPrint Tip Light";
  89. case 12: return "[Driver] Printer Tip Light";
  90. case 13: return "[Driver] HSPSCanner Read Light";
  91. case 14: return "";
  92. case 15: return "";
  93. case 16: return "";
  94. case 17: return "[Receiver] Shake Detecter";
  95. case 18: return "[Receiver] Door Detecter";
  96. case 19: return "[Receiver] Phone Detecter";
  97. case 20: return "[Receiver] Body Detecter";
  98. case 21: return "[Receiver] CardIssuer Mouse Detecter";
  99. //case 22: return "";
  100. //case 23: return "";
  101. //case 24: return "";
  102. //case 25: return "";
  103. case 26: return "[Driver] HSPSCanner Tip Light";
  104. //case 27: return "";
  105. //case 28: return "";
  106. //case 29: return "";
  107. //case 30: return "";
  108. //case 31: return "";
  109. //case 32: return "";
  110. //case 33: return "";
  111. //case 34: return "";
  112. //case 35: return "";
  113. //case 36: return "";
  114. //case 37: return "";
  115. //case 38: return "";
  116. //case 39: return "";
  117. //case 40: return "";
  118. //case 41: return "";
  119. //case 42: return "";
  120. default:
  121. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unkown pin sequence: %d", pin);
  122. return "";
  123. break;
  124. }
  125. }
  126. #define LIGHT_STRING_CONVERT(str) case str : return #str; break;
  127. static const char* GetLightSeqString(int seq)
  128. {
  129. switch (seq) {
  130. LIGHT_STRING_CONVERT(UNKNOWN_DEVICE)
  131. LIGHT_STRING_CONVERT(CARDREADER)
  132. LIGHT_STRING_CONVERT(CARDREADER_RED)
  133. LIGHT_STRING_CONVERT(IDCERTIFICATE)
  134. LIGHT_STRING_CONVERT(PINPAD)
  135. LIGHT_STRING_CONVERT(SHAKEDETECT)
  136. LIGHT_STRING_CONVERT(SWITCHINDUCTOR)
  137. LIGHT_STRING_CONVERT(PHONEPICKUP)
  138. LIGHT_STRING_CONVERT(MOVEDETECT)
  139. LIGHT_STRING_CONVERT(CARDGATEDETECT)
  140. LIGHT_STRING_CONVERT(HEADLIGHT)
  141. LIGHT_STRING_CONVERT(HEADLIGHT_RED)
  142. LIGHT_STRING_CONVERT(CONTACTLESSCARD)
  143. LIGHT_STRING_CONVERT(HEADLIGHT_ASSIST)
  144. LIGHT_STRING_CONVERT(HSPSCANNER)
  145. LIGHT_STRING_CONVERT(FINGERPRINT)
  146. default:
  147. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("Unkonwn LightSeq: %d", seq);
  148. return "UnConver One";
  149. break;
  150. }
  151. }
  152. #undef LIGHT_STRING_CONVERT
  153. /** Just for Debug [Gifur@2024911]*/
  154. void LogPinStatus(ULONG val)
  155. {
  156. char byteString[9] = { 0 };
  157. _itoa((int)val, byteString, 2);
  158. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("ReadPort returned btInput[%s]", byteString);
  159. std::bitset<8> pinSet((int)val);
  160. if (pinSet[0])
  161. {
  162. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[0][1]);
  163. }
  164. else
  165. {
  166. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[0][0]);
  167. }
  168. if (pinSet[1])
  169. {
  170. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[1][1]);
  171. }
  172. else
  173. {
  174. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[1][0]);
  175. }
  176. if (pinSet[2])
  177. {
  178. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[2][1]);
  179. }
  180. else
  181. {
  182. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[2][0]);
  183. }
  184. if (pinSet[3])
  185. {
  186. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[3][1]);
  187. }
  188. else
  189. {
  190. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[3][0]);
  191. }
  192. if (pinSet[4])
  193. {
  194. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[4][1]);
  195. }
  196. else
  197. {
  198. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[4][0]);
  199. }
  200. if (pinSet[5])
  201. {
  202. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[5][1]);
  203. }
  204. else
  205. {
  206. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[5][0]);
  207. }
  208. if (pinSet[6])
  209. {
  210. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[6][1]);
  211. }
  212. else
  213. {
  214. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[6][0]);
  215. }
  216. if (pinSet[7])
  217. {
  218. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[7][1]);
  219. }
  220. else
  221. {
  222. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)(pinStatusName[7][0]);
  223. }
  224. return;
  225. }
  226. CSimpleStringA CombineJsonContext(const char* szMessage)
  227. {
  228. CSimpleStringA result(true);
  229. if (szMessage == NULL || strlen(szMessage) == 0) {
  230. return result;
  231. }
  232. result = CSimpleStringA::Format("{\"addition\": \"%s\"}", szMessage);
  233. return result;
  234. }
  235. CGPIOFSM::CGPIOFSM(void) :m_bVibrationFlag(false), m_bOpenFlag(false), m_bMoveFlag(false), m_bCardGateFlag(false)
  236. , m_moveHoldTimes(0)
  237. , m_moveDisappearTimes(0)
  238. , m_bNewVersion(FALSE), m_bFuncVer2(FALSE), m_btLastRevcInput(-1), m_RecvErrTims(0)
  239. {
  240. memset(m_btOutputStatus, 0, MAX_PORT_NUM * sizeof(BYTE));
  241. memset(m_bLightStatus, 0, LIGHT_SEQ_MAX * sizeof(BOOL));
  242. }
  243. ErrorCodeEnum CGPIOFSM::OnInit()
  244. {
  245. LOG_FUNCTION();
  246. ErrorCodeEnum erroCode = Error_Succeed, eErrDev = Error_Succeed;
  247. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Source Code complied at: %s %s", __DATE__, __TIME__);
  248. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  249. pEntity->InitializeVendorLogSwitch();
  250. SetDevInitingFlag(true);
  251. SetDevInitFlag(false);
  252. CSimpleStringA strNoUse(true);
  253. erroCode = pEntity->ExtractVendorLibFullPath(strNoUse);
  254. if (erroCode != Error_Succeed) {
  255. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("load vendor dll or so(%s) failed, ec=%s", strNoUse.GetData(), SpStrError(erroCode));
  256. SetDevInitingFlag(false);
  257. return Error_DevLoadFileFailed;
  258. }
  259. FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
  260. LogWarn(Severity_Low, Error_Unexpect, GPIO_UserErrorCode_RootInfo, (LPCTSTR)m_adapterInfo.adapterFilePath);
  261. erroCode = LoadUpAdapterLibrary();
  262. if (erroCode != Error_Succeed) {
  263. SetDevInitingFlag(false);
  264. return erroCode;
  265. }
  266. GpioInitParam initParam;
  267. initParam.dwPort = m_adapterInfo.GetPortInt();
  268. initParam.dwBaudRate = m_adapterInfo.GetBaudrateInt();
  269. initParam.dir[0] = true;
  270. initParam.dir[1] = true;
  271. initParam.dir[2] = false;
  272. initParam.dir[3] = false;
  273. initParam.dwPortNum = 3;
  274. if (m_adapterInfo.GetPortNumInt() == 4) {
  275. m_bNewVersion = TRUE;
  276. initParam.dwPortNum = 4;
  277. initParam.dir[3] = true;
  278. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("New available 4 port num");
  279. }
  280. int initTries = 0;
  281. ErrorCodeEnum err;
  282. do {
  283. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to open device...port(%d), baudrate(%d).", m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
  284. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  285. err = m_hDevHelper->DevOpen(initParam);
  286. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  287. if (err == Error_Succeed) {
  288. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(ullEnd - ullStart)("open device succ");
  289. DevCategoryInfo devCatInfo;
  290. ZeroMemory(devCatInfo.szModel, sizeof(devCatInfo.szModel));
  291. ZeroMemory(devCatInfo.szType, sizeof(devCatInfo.szType));
  292. ZeroMemory(devCatInfo.szVendor, sizeof(devCatInfo.szVendor));
  293. ullStart = SP::Module::Comm::RVCGetTickCount();
  294. err = m_hDevHelper->GetDevCategory(devCatInfo);
  295. ullEnd = SP::Module::Comm::RVCGetTickCount();
  296. if (err == Error_Succeed) {
  297. m_adapterInfo.FulfillCategoryInfo(devCatInfo);
  298. #if defined(RVC_OS_LINUX)
  299. CSimpleStringA strType(devCatInfo.szType);
  300. if (strType.IndexOf("FUNCVER=2.0") != -1) {
  301. m_bFuncVer2 = TRUE;
  302. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Detect new interface version: %s", strType.GetData());
  303. }
  304. #endif //RVC_OS_LINUX
  305. }
  306. else {
  307. SetErrorAndLog(err, GPIO_UserErrorCode_GetDevCategory_Failed, "DevAdapter::GetDevCategory", "FulfillAdapterDevCategory", false, ullEnd - ullStart);
  308. }
  309. SetDevInitFlag(true);
  310. break;
  311. }
  312. else {
  313. SetErrorAndLog(err, GPIO_UserErrorCode_DevOpen_Failed, "DevAdapter::DevOpen", __FUNCTION__, false, ullEnd - ullStart);
  314. Sleep(300);
  315. initTries++;
  316. continue;
  317. }
  318. } while (initTries < MAX_GPIO_INIT_TRIES);
  319. if (!GetDevInitFlag()) {
  320. err = Error_DevConnFailed;
  321. }
  322. else {
  323. if (!m_bFuncVer2) {
  324. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  325. eErrDev = m_hDevHelper->WritePort(0, 0x00);
  326. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  327. if (eErrDev != Error_Succeed)
  328. SetErrorAndLog(eErrDev, GPIO_UserErrorCode_WritePort_Failed, "DevAdapter::WritePort", __FUNCTION__, false, ullEnd - ullStart, "", CombineJsonContext("WritePort(0) after DevOpen"));
  329. ullStart = SP::Module::Comm::RVCGetTickCount();
  330. eErrDev = m_hDevHelper->WritePort(1, 0x00);
  331. ullEnd = SP::Module::Comm::RVCGetTickCount();
  332. if (eErrDev != Error_Succeed)
  333. SetErrorAndLog(eErrDev, GPIO_UserErrorCode_WritePort_Failed, "DevAdapter::WritePort", __FUNCTION__, false, ullEnd - ullStart, "", CombineJsonContext("WritePort(1) after DevOpen"));
  334. if (m_bNewVersion) {
  335. ullStart = SP::Module::Comm::RVCGetTickCount();
  336. eErrDev = m_hDevHelper->WritePort(3, 0x00);
  337. ullEnd = SP::Module::Comm::RVCGetTickCount();
  338. if (eErrDev != Error_Succeed)
  339. SetErrorAndLog(eErrDev, GPIO_UserErrorCode_WritePort_Failed, "DevAdapter::WritePort", __FUNCTION__, false, ullEnd - ullStart, "", CombineJsonContext("WritePort(3) after DevOpen"));
  340. }
  341. }
  342. else {
  343. #if defined(RVC_OS_LINUX)
  344. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  345. eErrDev = m_hDevHelper->SetStatus(GPIO_DEV_SN_LIGHT_SENSOR_ALL, GPIO_DEV_LIGHT_MODE_RESET);
  346. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  347. if (eErrDev != Error_Succeed)
  348. SetErrorAndLog(eErrDev, GPIO_UserErrorCode_SetStatus_Failed, "DevAdapter::SetStatus", __FUNCTION__, false, ullEnd - ullStart, "", CombineJsonContext("SetStatus after DevOpen"));
  349. #endif //RVC_OS_LINUX
  350. }
  351. SetDevState(DEVICE_STATUS_NORMAL);
  352. }
  353. SetDevInitingFlag(false);
  354. m_moveHoldTimes = MAX_MOVE_HOLD_TIMES;//oiltmp about 5000*300ms = 25 minutes
  355. m_moveDisappearTimes = m_moveHoldTimes;
  356. return err;
  357. }
  358. void CGPIOFSM::AfterInit()
  359. {
  360. StartDetectWorkThread();
  361. }
  362. void CGPIOFSM::SelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext)
  363. {
  364. OnHardwareShakeHand(pTransactionContext);
  365. }
  366. void CGPIOFSM::GetDevInfo(SpReqAnsContext<GpioService_GetDevInfo_Req, GpioService_GetDevInfo_Ans>::Pointer ctx)
  367. {
  368. if (m_bOpening) {
  369. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(GpioService_LogCode_GetDevInfo).setAPI(__FUNCTION__)("device is opening");
  370. ctx->Answer(Error_NotInit);
  371. return;
  372. }
  373. if (!m_bOpened) {
  374. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(GpioService_LogCode_GetDevInfo).setResultCode("RTA2901").setAPI(__FUNCTION__)("GPIO未打开");
  375. ctx->Answer(Error_DevNotAvailable, GPIO_UserErrorCode_DevOpen_Failed);
  376. }
  377. else {
  378. DevCategoryInfo info = { 0 };
  379. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  380. ErrorCodeEnum erroCode = m_hDevHelper->GetDevCategory(info);
  381. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  382. ctx->Ans.state = (int)erroCode;
  383. if (erroCode == Error_Succeed) {
  384. ctx->Ans.model = info.szModel;
  385. ctx->Ans.type = info.szType;
  386. ctx->Ans.version = CSimpleStringA::Format("%d.%d.%d.%d",
  387. info.version.wMajor, info.version.wMinor, info.version.wRevision, info.version.wBuild);
  388. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_GetDevInfo)
  389. .setAPI("DevAdapter::GetDevCategory").setCostTime(ullEnd - ullStart)("model: %s, state:%d, type:%s, version:%s"
  390. , ctx->Ans.model.GetData(), ctx->Ans.state, ctx->Ans.type.GetData(), ctx->Ans.version.GetData());
  391. }
  392. else {
  393. SetErrorAndLog(erroCode, GPIO_UserErrorCode_GetDevCategory_Failed, "DevAdapter::GetDevCategory", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, GpioService_LogCode_GetDevInfo);
  394. }
  395. ctx->Answer(Error_Succeed);
  396. }
  397. }
  398. void CGPIOFSM::Exit(SpOnewayCallContext<GpioService_Exit_Info>::Pointer ctx)
  399. {
  400. }
  401. bool CGPIOFSM::DetectBit(ULONG data, int pos)
  402. {
  403. if (!m_bFuncVer2) {
  404. ULONG tmp = 0;
  405. SETBIT(tmp, pos);
  406. return (data & tmp);
  407. }
  408. #if defined(RVC_OS_LINUX)
  409. else {
  410. DWORD dwReq = (GPIO_DEV_SN_SENSOR_SHAKE << pos);
  411. return (data & dwReq);
  412. }
  413. #endif //RVC_OS_LINUX
  414. return 0;
  415. }
  416. void CGPIOFSM::OnLogEvent(DWORD dwUserCode)
  417. {
  418. GpioSet_Info Req;
  419. if (!m_bOpened) {
  420. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("usercode [%x], but device is not open", dwUserCode);
  421. return;
  422. }
  423. else {
  424. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("receive usercode [%x]", dwUserCode);
  425. }
  426. Req.close = 0;
  427. Req.devseq = -1;
  428. switch (dwUserCode) {
  429. case LOG_EVT_CARDISSUER_GREEN_ON:
  430. case LOG_EVT_CARDISSUER_STORE_GREEN_ON:
  431. Req.devseq = CARDREADER;
  432. Req.mode = 1;
  433. break;
  434. case LOG_EVT_CARDISSUER_RED_ON:
  435. Req.devseq = CARDREADER_RED;
  436. Req.mode = 1;
  437. break;
  438. case LOG_EVT_IDCERTIFICATE_GREEN_ON:
  439. Req.devseq = IDCERTIFICATE;
  440. Req.mode = 1;
  441. break;
  442. case LOG_EVT_FINGERPRINT_GREEN_ON:
  443. Req.devseq = FINGERPRINT;
  444. Req.mode = 1;
  445. break;
  446. case LOG_EVT_PINPAD_GREEN_ON:
  447. Req.devseq = PINPAD;
  448. Req.mode = 1;
  449. break;
  450. case LOG_EVT_HEADLIGHT_GREEN_ON:
  451. Req.devseq = HEADLIGHT;
  452. Req.mode = 0;
  453. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machine light on");
  454. break;
  455. case LOG_EVT_HEADLIGHT_RED_ON:
  456. Req.devseq = HEADLIGHT_RED;
  457. Req.mode = 1;
  458. break;
  459. case LOG_EVT_CONTACTLESS_CARD_GREEN_ON:
  460. Req.devseq = CONTACTLESSCARD;
  461. Req.mode = 1;
  462. break;
  463. case LOG_EVT_IEBROWSER_LIGHT_ASSISTANT_ON:
  464. Req.devseq = HEADLIGHT_ASSIST;
  465. Req.mode = 1;
  466. break;
  467. case LOG_EVT_CARDISSUER_GREEN_OFF:
  468. case LOG_EVT_CARDISSUER_STORE_GREEN_OFF:
  469. Req.devseq = CARDREADER;
  470. Req.mode = 1;
  471. Req.close = 1;
  472. break;
  473. case LOG_EVT_CARDISSUER_RED_OFF:
  474. Req.devseq = CARDREADER_RED;
  475. Req.mode = 1;
  476. Req.close = 1;
  477. break;
  478. case LOG_EVT_IDCERTIFICATE_GREEN_OFF:
  479. Req.devseq = IDCERTIFICATE;
  480. Req.mode = 1;
  481. Req.close = 1;
  482. break;
  483. case LOG_EVT_FINGERPRINT_GREEN_OFF:
  484. Req.devseq = FINGERPRINT;
  485. Req.mode = 1;
  486. Req.close = 1;
  487. break;
  488. case LOG_EVT_PINPAD_GREEN_OFF:
  489. Req.devseq = PINPAD;
  490. Req.mode = 1;
  491. Req.close = 1;
  492. break;
  493. case LOG_EVT_HEADLIGHT_GREEN_OFF:
  494. Req.devseq = HEADLIGHT;
  495. Req.mode = 1;
  496. Req.close = 1;
  497. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machine light off");
  498. break;
  499. case LOG_EVT_HEADLIGHT_RED_OFF:
  500. Req.devseq = HEADLIGHT_RED;
  501. Req.mode = 1;
  502. Req.close = 1;
  503. break;
  504. case LOG_EVT_CONTACTLESS_CARD_GREEN_OFF:
  505. Req.devseq = CONTACTLESSCARD;
  506. Req.mode = 1;
  507. Req.close = 1;
  508. break;
  509. case LOG_EVT_IEBROWSER_LIGHT_ASSISTANT_OFF:
  510. Req.devseq = HEADLIGHT_ASSIST;
  511. Req.mode = 1;
  512. Req.close = 1;
  513. break;
  514. case LOG_EVT_HSPS_LIGHT_ON:
  515. Req.devseq = HSPSCANNER;
  516. Req.mode = 1;
  517. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hspscanner light on");
  518. break;
  519. case LOG_EVT_HSPS_LIGHT_OFF:
  520. Req.devseq = HSPSCANNER;
  521. Req.mode = 1;
  522. Req.close = 1;
  523. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hspscanner light off");
  524. break;
  525. default:
  526. return;
  527. }
  528. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("devseq[%d],mode[%d]close[%d]", Req.devseq, Req.mode, Req.close);
  529. if (Req.devseq >= 0) {
  530. if (!Req.close) {
  531. if (m_bLightStatus[Req.devseq]) {
  532. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("the light(seq=%s) has been on", GetLightSeqString(Req.devseq));
  533. //return;
  534. }
  535. else {
  536. m_bLightStatus[Req.devseq] = true;
  537. }
  538. }
  539. else {
  540. if (m_bLightStatus[Req.devseq]) {
  541. m_bLightStatus[Req.devseq] = false;
  542. }
  543. else {
  544. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("the light(seq=%s) has been off", GetLightSeqString(Req.devseq));
  545. //return;
  546. }
  547. }
  548. }
  549. m_bFuncVer2 ? SetEx(Req) : Set(Req);
  550. }
  551. //老接口,用于控制灯
  552. bool CGPIOFSM::SetOutDriving(GpioSet_Info req, OutDrivingInfo od, ULONG iIndex, ULONG pinSeq)
  553. {
  554. int ret(-1);
  555. if (req.close == 1) {
  556. GetEntityBase()->GetFunction()->KillTimer(req.devseq);
  557. if (pinSeq == PIN_HSPSCANNER_PREVIEW_LIGHT) {
  558. //额外多关闭高拍仪提示灯
  559. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("off light hspsanner.");
  560. WritePin(PIN_HSPSCANNER_LIGHT, false);
  561. }
  562. ret = WritePin(pinSeq, false);
  563. return (ret == 0);
  564. }
  565. switch (od.OutputMode) {
  566. case OM_POSITIVE_LEVEL:
  567. {
  568. if (od.StopMode == SM_CALLTRIGGER) {
  569. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("0.0 mode: pinSeq=%u", pinSeq);
  570. //if it is hspsanner
  571. if (pinSeq == PIN_HSPSCANNER_PREVIEW_LIGHT) {
  572. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("light hspsanner.");
  573. WritePin(PIN_HSPSCANNER_LIGHT, true);
  574. }
  575. ret = WritePin(pinSeq, true);
  576. }
  577. }
  578. break;
  579. case OM_POSITIVE_FLICKER:
  580. if (od.StopMode == SM_CYCLE) {
  581. SetContextInfo* pSci = new SetContextInfo();
  582. pSci->pinSeq = pinSeq;
  583. pSci->timerID = req.devseq;
  584. pSci->setTime = od.SetTime;
  585. pSci->resetTime = od.ResetTime;
  586. pSci->timeout = od.TimeOut;
  587. ret = WritePin(pinSeq, true);
  588. if (ret == 0) {
  589. ITimerListener* pListener = new TimerOutHelper<CGPIOFSM>(this, &CGPIOFSM::OnPositiveFlickerSetTimerout, pSci, true);
  590. GetEntityBase()->GetFunction()->SetTimer(pSci->timerID, pListener, pSci->setTime);
  591. }
  592. }
  593. break;
  594. default:
  595. break;
  596. }
  597. return (ret == 0);
  598. }
  599. int CGPIOFSM::WritePin(DWORD dwPinSeq, bool bHighLevel)
  600. {
  601. ErrorCodeEnum result(Error_Succeed);
  602. int ret(-1);
  603. int idx = -1;
  604. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Write Pin %s with %s", GetDriverPortString(dwPinSeq + 1), bHighLevel ? "[Active]" : "[InActive]");
  605. if (dwPinSeq > 16) {/** 目前只有一个高拍仪的提示灯会超过该值 [Gifur@202495]*/
  606. if (!m_bNewVersion || dwPinSeq < 24) {
  607. return ret;
  608. }
  609. idx = 3;
  610. }
  611. else if (dwPinSeq < 8) {
  612. idx = 0;
  613. }
  614. else {
  615. idx = 1;
  616. }
  617. if (bHighLevel)
  618. SETBIT(m_btOutputStatus[idx], dwPinSeq - 8 * idx);
  619. else
  620. CLEARBIT(m_btOutputStatus[idx], dwPinSeq - 8 * idx);
  621. const auto iBegin = SP::Module::Comm::RVCGetTickCount();
  622. result = m_hDevHelper->WritePort(idx, m_btOutputStatus[idx]);
  623. const auto iEnd = SP::Module::Comm::RVCGetTickCount();
  624. if (result != Error_Succeed) {
  625. SetErrorAndLog(result, GPIO_UserErrorCode_WritePort_Failed, "DevAdapter::WritePort", __FUNCTION__, false, iEnd - iBegin, "", CombineJsonContext(CSimpleStringA::Format("write port[%d] with %d", idx, m_btOutputStatus[idx])));
  626. ret = 1;
  627. }
  628. else {
  629. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::WritePort").setAPI(__FUNCTION__).setCostTime(iEnd - iBegin)("write port[%d] with %d succ", idx, m_btOutputStatus[idx]);
  630. ret = 0;
  631. }
  632. return ret;
  633. }
  634. void CGPIOFSM::SetEx(GpioSet_Info req)
  635. {
  636. #if defined(RVC_OS_LINUX)
  637. int devicePort;
  638. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SetEx request %s arrived!", GetLightSeqString(req.devseq));
  639. switch (req.devseq) {
  640. case CARDREADER:
  641. {
  642. devicePort = GPIO_DEV_SN_LIGHT_CARDISSUER;
  643. break;
  644. }
  645. case CARDREADER_RED:
  646. {
  647. devicePort = GPIO_DEV_SN_LIGHT_CARDISSUER_MAINTAIN;
  648. break;
  649. }
  650. case IDCERTIFICATE:
  651. {
  652. devicePort = GPIO_DEV_SN_LIGHT_IDCERTIFICATE;
  653. break;
  654. }
  655. case FINGERPRINT:
  656. {
  657. devicePort = GPIO_DEV_SN_LIGHT_FINGERPRINT;
  658. break;
  659. }
  660. case PINPAD:
  661. {
  662. devicePort = GPIO_DEV_SN_LIGHT_PINPAD;
  663. break;
  664. }
  665. case HEADLIGHT:
  666. {
  667. devicePort = GPIO_DEV_SN_LIGHT_FACE;
  668. break;
  669. }
  670. case HEADLIGHT_RED:
  671. {
  672. devicePort = 6/*GPIO_DEV_SN_LIGHT_MACHINE_FAULT*/;
  673. break;
  674. }
  675. case CONTACTLESSCARD:
  676. {
  677. devicePort = GPIO_DEV_SN_LIGHT_CONTACTLESSCARD;
  678. break;
  679. }
  680. case HEADLIGHT_ASSIST:
  681. {
  682. devicePort = GPIO_DEV_SN_LIGHT_FACE;
  683. break;
  684. }
  685. break;
  686. default:
  687. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(__FUNCTION__)("unsupport device seq: %d", req.devseq);
  688. return;
  689. }
  690. if (m_hDevHelper != nullptr) {
  691. DWORD dwReq = devicePort;
  692. DWORD dwMode = 0;
  693. if (!req.close) {
  694. dwMode |= GPIO_DEV_LIGHT_MODE_COLOR_NORMAL;
  695. if (!!req.mode) {
  696. dwMode |= GPIO_DEV_LIGHT_MODE_LIGHT_FLICKER;
  697. }
  698. else {
  699. dwMode |= GPIO_DEV_LIGHT_MODE_LIGHT_SUSTAIN;
  700. }
  701. }
  702. const auto iBegin = SP::Module::Comm::RVCGetTickCount();
  703. const ErrorCodeEnum ec = m_hDevHelper->SetStatus(dwReq, dwMode);
  704. const auto iEnd = SP::Module::Comm::RVCGetTickCount();
  705. if (ec != Error_Succeed) {
  706. SetErrorAndLog(ec, GPIO_UserErrorCode_SetStatus_Failed, "DevAdapter::SetStatus", __FUNCTION__, false, iEnd - iBegin, "", CombineJsonContext(CSimpleStringA::Format("SetStatus with 0x%X,0x%X", dwReq, dwMode)));
  707. }
  708. else {
  709. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetStatus").setAPI(__FUNCTION__).setCostTime(iEnd - iBegin)("SetStatus with 0x%X,0x%X", dwReq, dwMode);
  710. }
  711. }
  712. else {
  713. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dev helper object is invalid pointer!");
  714. }
  715. #endif //RVC_OS_LINUX
  716. }
  717. void CGPIOFSM::Set(GpioSet_Info req)
  718. {
  719. CSimpleStringA activeModeSecName = "";
  720. int devicePort;
  721. OutDrivingInfo odi;
  722. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Set request %s arrived!", GetLightSeqString(req.devseq));
  723. switch (req.devseq) {
  724. case CARDREADER:
  725. case PINPAD:
  726. case CONTACTLESSCARD:
  727. {
  728. devicePort = req.devseq == CARDREADER ? 0 : (req.devseq == PINPAD ? 3 : 8);
  729. odi.OutputMode = OM_POSITIVE_FLICKER;
  730. odi.StopMode = SM_CYCLE;
  731. odi.SetTime = 200;
  732. odi.ResetTime = 200;
  733. odi.TimeOut = 5000;
  734. break;
  735. }
  736. case CARDREADER_RED:
  737. case HEADLIGHT_RED:
  738. {
  739. devicePort = req.devseq == CARDREADER_RED ? 6 : 5;
  740. odi.OutputMode = OM_POSITIVE_LEVEL;
  741. odi.StopMode = SM_CALLTRIGGER;
  742. odi.SetTime = 200;
  743. odi.ResetTime = 200;
  744. odi.TimeOut = 3000;
  745. break;
  746. }
  747. case IDCERTIFICATE:
  748. case FINGERPRINT:
  749. {
  750. devicePort = req.devseq == IDCERTIFICATE ? 2 : 10;
  751. odi.OutputMode = OM_POSITIVE_FLICKER;
  752. odi.StopMode = SM_CYCLE;
  753. odi.SetTime = 150;
  754. odi.ResetTime = 150;
  755. odi.TimeOut = 5000;
  756. break;
  757. }
  758. case HEADLIGHT:
  759. case HSPSCANNER:
  760. {
  761. devicePort = req.devseq == HEADLIGHT ? 4 : 12;
  762. odi.OutputMode = OM_POSITIVE_LEVEL;
  763. odi.StopMode = SM_CALLTRIGGER;
  764. odi.SetTime = 1000;
  765. odi.ResetTime = 1000;
  766. odi.TimeOut = 5000;
  767. break;
  768. }
  769. case HEADLIGHT_ASSIST:
  770. {
  771. devicePort = 4;
  772. odi.OutputMode = OM_POSITIVE_FLICKER;
  773. odi.StopMode = SM_CYCLE;
  774. odi.SetTime = 1000;
  775. odi.ResetTime = 500;
  776. odi.TimeOut = 5000;
  777. break;
  778. }
  779. default:
  780. odi.OutputMode = OM_POSITIVE_LEVEL;
  781. odi.StopMode = SM_CALLTRIGGER;
  782. odi.SetTime = 200;
  783. odi.ResetTime = 200;
  784. odi.TimeOut = 5000;
  785. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("unsupport device seq: %d", req.devseq);
  786. return;
  787. }
  788. SetOutDriving(req, odi, 0, devicePort);
  789. }
  790. void CGPIOFSM::StartDetectWorkThread()
  791. {
  792. ReceivingInfo ri;
  793. ri.ContinuousTriggerTime = 2;
  794. GetContextInfo* pGci = new GetContextInfo();
  795. /** 注意设备序号是实体内定义的逻辑,不是设备端口号,最后用作于计时器的ID去了*/
  796. pGci->timerID = PHONEPICKUP; /*8*/
  797. m_PickUpTimeStamp = m_PutDownTimeStamp = SP::Module::Comm::RVCGetTickCount();
  798. m_DoorOpenTimeStamp = m_DoorCloseTimeStamp = SP::Module::Comm::RVCGetTickCount();
  799. ITimerListener* pListener = new TimerOutHelper<CGPIOFSM>(this, &CGPIOFSM::OnEventDetect, pGci);
  800. GetEntityBase()->GetFunction()->SetTimer(pGci->timerID, pListener, 100);
  801. }
  802. void CGPIOFSM::OnPositiveFlickerSetTimerout(void* pData)
  803. {
  804. SetContextInfo* pSCI = (SetContextInfo*)pData;
  805. GetEntityBase()->GetFunction()->KillTimer(pSCI->timerID);
  806. const int ret = WritePin(pSCI->pinSeq, false); //实际操作
  807. if (ret == 0) {
  808. ITimerListener* pListener = new TimerOutHelper<CGPIOFSM>(this, &CGPIOFSM::OnPositiveFlickerResetTimerout, pSCI, true);
  809. GetEntityBase()->GetFunction()->SetTimer(pSCI->timerID, pListener, pSCI->resetTime);
  810. }
  811. }
  812. void CGPIOFSM::OnPositiveFlickerResetTimerout(void* pData)
  813. {
  814. SetContextInfo* pSCI = (SetContextInfo*)pData;
  815. GetEntityBase()->GetFunction()->KillTimer(pSCI->timerID);
  816. const int ret = WritePin(pSCI->pinSeq, true); //实际操作
  817. if (ret == 0) {
  818. ITimerListener* pListener = new TimerOutHelper<CGPIOFSM>(this, &CGPIOFSM::OnPositiveFlickerSetTimerout, pSCI, true);
  819. GetEntityBase()->GetFunction()->SetTimer(pSCI->timerID, pListener, pSCI->setTime);
  820. }
  821. }
  822. void CGPIOFSM::OnEventDetect(void* pData)
  823. {
  824. GetContextInfo* pGci = (GetContextInfo*)pData;
  825. ULONG input = 0;
  826. BYTE btInput;
  827. ErrorCodeEnum err(Error_Succeed);
  828. if (!m_bFuncVer2) {
  829. const auto iBegin = SP::Module::Comm::RVCGetTickCount();
  830. err = m_hDevHelper->ReadPort(INPUT_PORT_2, btInput);
  831. const auto iEnd = SP::Module::Comm::RVCGetTickCount();
  832. if (err != Error_Succeed) {
  833. SetErrorAndLog(err, GPIO_UserErrorCode_ReadPort_Failed, "DevAdapter::ReadPort", __FUNCTION__, false, iEnd - iBegin, "",
  834. CombineJsonContext(CSimpleStringA::Format("read port[%d] with %d", INPUT_PORT_2, btInput)));
  835. }
  836. else if (btInput != m_btLastRevcInput) {
  837. m_btLastRevcInput = btInput;
  838. LogPinStatus(btInput);
  839. }
  840. }
  841. else {
  842. #if defined(RVC_OS_LINUX)
  843. DWORD dwReq(GPIO_DEV_SN_LIGHT_SENSOR_ALL);
  844. DWORD dwMode = 0;
  845. const auto iBegin = SP::Module::Comm::RVCGetTickCount();
  846. err = m_hDevHelper->DetectStatus(dwReq, dwMode);
  847. const auto iEnd = SP::Module::Comm::RVCGetTickCount();
  848. btInput = dwMode;
  849. if (err != Error_Succeed) {
  850. SetErrorAndLog(err, GPIO_UserErrorCode_DetectStatus_Failed, "DevAdapter::DetectStatus", __FUNCTION__, false, iEnd - iBegin, "",
  851. CombineJsonContext(CSimpleStringA::Format("detect status[%d] with %d", dwReq, dwMode)));
  852. }
  853. else if (btInput != m_btLastRevcInput) {
  854. m_btLastRevcInput = btInput;
  855. LogPinStatus(btInput);
  856. }
  857. #else
  858. err = Error_NotSupport;
  859. #endif //RVC_OS_LINUX
  860. }
  861. if (err != Error_Succeed) {
  862. m_btLastRevcInput = (BYTE)(-1);
  863. if (++m_RecvErrTims >= 10) {
  864. SetDevState(DEVICE_STATUS_FAULT);
  865. LogWarn(Severity_Middle, Error_Debug, GPIO_UserErrorCode_EvtDetect_Error, "DevAdapterApi[DetectStatus/ReadPort] error already exceeds 10 times, give up");
  866. GetEntityBase()->GetFunction()->KillTimer(pGci->timerID);
  867. }
  868. else {
  869. GetEntityBase()->GetFunction()->ResetTimer(pGci->timerID, ON_EVENT_DETECT_TIMOUE_MILLSECS);
  870. }
  871. return;
  872. }
  873. else if(m_RecvErrTims != 0){
  874. m_RecvErrTims = 0;
  875. }
  876. /** 震动感应 */
  877. if (DetectBit(btInput, VIBRATIONSENSOR) && !m_bVibrationFlag) {
  878. m_bVibrationFlag = true;
  879. LogEvent(Severity_Middle, LOG_EVT_VIBRATIONSENSOR, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(17), __LINE__));
  880. }
  881. else if (!DetectBit(btInput, VIBRATIONSENSOR) && m_bVibrationFlag) {
  882. LogEvent(Severity_Middle, LOG_EVT_VIBRATIONSENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(17), __LINE__));
  883. m_bVibrationFlag = false;
  884. }
  885. /** 机箱门开关检测*/
  886. if (DetectBit(btInput, OPENSENSOR) && !m_bOpenFlag) {
  887. m_bOpenFlag = true;
  888. m_DoorOpenTimeStamp = SP::Module::Comm::RVCGetTickCount();
  889. LogEvent(Severity_Middle, LOG_EVT_OPENSENSOR_ON, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(18), __LINE__));
  890. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_DoorOpen)("[GPIO] The chassis door is open");
  891. }
  892. else if (!DetectBit(btInput, OPENSENSOR) && m_bOpenFlag) {
  893. m_bOpenFlag = false;
  894. m_DoorCloseTimeStamp = SP::Module::Comm::RVCGetTickCount();
  895. LogEvent(Severity_Middle, LOG_EVT_OPENSENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(18), __LINE__));
  896. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_DoorClose).setCostTime(m_DoorCloseTimeStamp - m_DoorOpenTimeStamp)("[GPIO] The chassis door is close");
  897. }
  898. /**话机检测*/
  899. if (DetectBit(btInput, PICKUPSENSOR)) {
  900. if (m_ePickUpFlag == InActive) {
  901. m_ePickUpFlag = Actived;
  902. m_PickUpTimeStamp = SP::Module::Comm::RVCGetTickCount();
  903. LogEvent(Severity_Middle, LOG_EVT_PICKUP, "Life the Phone up");
  904. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_PhonePickup)("[GPIO] 话机提起");
  905. }
  906. else if (m_ePickUpFlag == UnknownStatus) {
  907. m_ePickUpFlag = Actived;
  908. m_PickUpTimeStamp = SP::Module::Comm::RVCGetTickCount();
  909. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_PhonePickup)("[GPIO] 话机提起(启动时)");
  910. }
  911. }
  912. else if (!DetectBit(btInput, PICKUPSENSOR)) {
  913. if (m_ePickUpFlag == Actived) {
  914. m_ePickUpFlag = InActive;
  915. m_PutDownTimeStamp = SP::Module::Comm::RVCGetTickCount();
  916. LogEvent(Severity_Middle, LOG_EVT_ONHOOK, "Put the Phone down");
  917. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_PhonePutDown).setCostTime(m_PutDownTimeStamp - m_PickUpTimeStamp)("[GPIO] 话机放下");
  918. }
  919. else if (m_ePickUpFlag == UnknownStatus) {
  920. m_ePickUpFlag = InActive;
  921. m_PutDownTimeStamp = SP::Module::Comm::RVCGetTickCount();
  922. }
  923. }
  924. /*物体靠近感知检测*/
  925. if (DetectBit(btInput, MOVESENSOR)) {
  926. if (!m_bMoveFlag) {
  927. m_bMoveFlag = true;
  928. m_moveDisappearTimes = 0;
  929. LogEvent(Severity_Middle, LOG_EVT_MOVESENSOR_ON, CSimpleStringA::Format("%s [Active] line: %d, times: %lu", GetDriverPortString(20), __LINE__, m_moveHoldTimes));
  930. }
  931. /** 只是发一次时间时,发现感知实体没有收到或者不处理第一次发出的时间,所以需要沿用原有的发送频率,再继续发送消失的事件,下同 [Gifur@202496]*/
  932. else if (m_moveHoldTimes != 0 && (m_moveHoldTimes % (REPEAT_FIRE_TIMEOUT_VALUE / ON_EVENT_DETECT_TIMOUE_MILLSECS)) == 0) {
  933. LogEvent(Severity_Middle, LOG_EVT_MOVESENSOR_ON, CSimpleStringA::Format("%s [Active] line: %d, times: %lu", GetDriverPortString(20), __LINE__, m_moveHoldTimes));
  934. }
  935. const bool toCheck = !!(m_moveHoldTimes != 0 && (m_moveHoldTimes % (8/*mins*/ * 60 * 1000 / ON_EVENT_DETECT_TIMOUE_MILLSECS) == 0));
  936. if (toCheck) {
  937. SYSTEMTIME localTime;
  938. GetLocalTime(&localTime);
  939. if (localTime.wHour < (WORD)8 || (localTime.wHour == 8 && localTime.wMinute <= (WORD)30) || localTime.wHour >= (WORD)18)
  940. {
  941. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA2903")("Move detect is abnormal(off work).");
  942. LogWarn(Severity_High, Error_Unexpect, LOG_EVT_MOVEDETECT_ABNORMAL_OFFWORK, "Move detect is abnormal(off work).");
  943. }
  944. else {
  945. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA2902")("Move detect is abnormal(Work time).");
  946. LogWarn(Severity_High, Error_Unexpect, LOG_EVT_MOVEDETECT_ABNORMAL_WORKTIME, "Move detect is abnormal(Work time).");
  947. }
  948. }
  949. m_moveHoldTimes++;
  950. }
  951. else if (!DetectBit(btInput, MOVESENSOR)) {
  952. if (m_bMoveFlag) {
  953. m_bMoveFlag = false;
  954. m_moveHoldTimes = 0;
  955. LogEvent(Severity_Middle, LOG_EVT_MOVESENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(20), __LINE__));
  956. }
  957. else if (m_moveDisappearTimes != 0 && (m_moveDisappearTimes % (REPEAT_FIRE_TIMEOUT_VALUE / ON_EVENT_DETECT_TIMOUE_MILLSECS)) == 0) {
  958. LogEvent(Severity_Middle, LOG_EVT_MOVESENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(20), __LINE__));
  959. }
  960. m_moveDisappearTimes++;
  961. }
  962. /*卡嘴异物检测*/
  963. if (DetectBit(btInput, CARDGATESENSOR) && !m_bCardGateFlag) {
  964. m_bCardGateFlag = true;
  965. LogEvent(Severity_Middle, LOG_EVT_CARDGATESENSOR, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(21), __LINE__));
  966. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_CardMouseJam)("[GPIO] The card mouse is jam");
  967. }
  968. else if (!DetectBit(btInput, CARDGATESENSOR) && m_bCardGateFlag) {
  969. LogEvent(Severity_Middle, LOG_EVT_CARDGATESENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(21), __LINE__));
  970. m_bCardGateFlag = false;
  971. }
  972. GetEntityBase()->GetFunction()->ResetTimer(pGci->timerID, ON_EVENT_DETECT_TIMOUE_MILLSECS);
  973. }