GpioFSM.cpp 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997
  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_bHeadLightFlag(false), m_headlightDevPort(4), m_moveHoldTimes(0)
  237. , m_moveDisappearTimes(0)
  238. , m_bNewVersion(FALSE), m_bFuncVer2(FALSE), m_btLastRevcInput(-1)
  239. {
  240. memset(m_btOutputStatus, 0, MAX_PORT_NUM * sizeof(BYTE));
  241. }
  242. ErrorCodeEnum CGPIOFSM::OnInit()
  243. {
  244. LOG_FUNCTION();
  245. ErrorCodeEnum erroCode = Error_Succeed, eErrDev = Error_Succeed;
  246. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Source Code complied at: %s %s", __DATE__, __TIME__);
  247. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  248. pEntity->InitializeVendorLogSwitch();
  249. SetDevInitingFlag(true);
  250. SetDevInitFlag(false);
  251. CSimpleStringA strNoUse(true);
  252. erroCode = pEntity->ExtractVendorLibFullPath(strNoUse);
  253. if (erroCode != Error_Succeed) {
  254. DbgWithLink(LOG_LEVEL_ERROR, LOG_TYPE_SYSTEM)("load vendor dll or so(%s) failed, ec=%s", strNoUse.GetData(), SpStrError(erroCode));
  255. SetDevInitingFlag(false);
  256. return Error_DevLoadFileFailed;
  257. }
  258. FulfillAdapterInfoFrom(pEntity->vendorLibInfo);
  259. LogWarn(Severity_Low, Error_Unexpect, GPIO_UserErrorCode_RootInfo, (LPCTSTR)m_adapterInfo.adapterFilePath);
  260. erroCode = LoadUpAdapterLibrary();
  261. if (erroCode != Error_Succeed) {
  262. SetDevInitingFlag(false);
  263. return erroCode;
  264. }
  265. GpioInitParam initParam;
  266. initParam.dwPort = m_adapterInfo.GetPortInt();
  267. initParam.dwBaudRate = m_adapterInfo.GetBaudrateInt();
  268. initParam.dir[0] = true;
  269. initParam.dir[1] = true;
  270. initParam.dir[2] = false;
  271. initParam.dir[3] = false;
  272. initParam.dwPortNum = 3;
  273. if (m_adapterInfo.GetPortNumInt() == 4) {
  274. m_bNewVersion = TRUE;
  275. initParam.dwPortNum = 4;
  276. initParam.dir[3] = true;
  277. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("New available 4 port num");
  278. }
  279. int initTries = 0;
  280. ErrorCodeEnum err;
  281. do {
  282. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("to open device...port(%d), baudrate(%d).", m_adapterInfo.GetPortInt(), m_adapterInfo.GetBaudrateInt());
  283. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  284. err = m_hDevHelper->DevOpen(initParam);
  285. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  286. if (err == Error_Succeed) {
  287. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::DevOpen").setCostTime(ullEnd - ullStart)("open device succ");
  288. ToLogRootINIInfo();
  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. ToLogWarnInfoAboutTerm();
  299. #if defined(RVC_OS_LINUX)
  300. CSimpleStringA strType(devCatInfo.szType);
  301. if (strType.IndexOf("FUNCVER=2.0") != -1) {
  302. m_bFuncVer2 = TRUE;
  303. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Detect new interface version: %s", strType.GetData());
  304. }
  305. #endif //RVC_OS_LINUX
  306. }
  307. else {
  308. SetErrorAndLog(err, GPIO_UserErrorCode_GetDevCategory_Failed, "DevAdapter::GetDevCategory", "FulfillAdapterDevCategory", false, ullEnd - ullStart);
  309. }
  310. SetDevInitFlag(true);
  311. break;
  312. }
  313. else {
  314. SetErrorAndLog(err, GPIO_UserErrorCode_DevOpen_Failed, "DevAdapter::DevOpen", __FUNCTION__, false, ullEnd - ullStart);
  315. Sleep(300);
  316. initTries++;
  317. continue;
  318. }
  319. } while (initTries < MAX_GPIO_INIT_TRIES);
  320. if (!GetDevInitFlag()) {
  321. err = Error_DevConnFailed;
  322. }
  323. else {
  324. if (!m_bFuncVer2) {
  325. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  326. eErrDev = m_hDevHelper->WritePort(0, 0x00);
  327. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  328. if (eErrDev != Error_Succeed)
  329. SetErrorAndLog(eErrDev, GPIO_UserErrorCode_WritePort_Failed, "DevAdapter::WritePort", __FUNCTION__, false, ullEnd - ullStart, "", CombineJsonContext("WritePort(0) after DevOpen"));
  330. ullStart = SP::Module::Comm::RVCGetTickCount();
  331. eErrDev = m_hDevHelper->WritePort(1, 0x00);
  332. ullEnd = SP::Module::Comm::RVCGetTickCount();
  333. if (eErrDev != Error_Succeed)
  334. SetErrorAndLog(eErrDev, GPIO_UserErrorCode_WritePort_Failed, "DevAdapter::WritePort", __FUNCTION__, false, ullEnd - ullStart, "", CombineJsonContext("WritePort(1) after DevOpen"));
  335. if (m_bNewVersion) {
  336. ullStart = SP::Module::Comm::RVCGetTickCount();
  337. eErrDev = m_hDevHelper->WritePort(3, 0x00);
  338. ullEnd = SP::Module::Comm::RVCGetTickCount();
  339. if (eErrDev != Error_Succeed)
  340. SetErrorAndLog(eErrDev, GPIO_UserErrorCode_WritePort_Failed, "DevAdapter::WritePort", __FUNCTION__, false, ullEnd - ullStart, "", CombineJsonContext("WritePort(3) after DevOpen"));
  341. }
  342. }
  343. else {
  344. #if defined(RVC_OS_LINUX)
  345. ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  346. eErrDev = m_hDevHelper->SetStatus(GPIO_DEV_SN_LIGHT_SENSOR_ALL, GPIO_DEV_LIGHT_MODE_RESET);
  347. ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  348. if (eErrDev != Error_Succeed)
  349. SetErrorAndLog(eErrDev, GPIO_UserErrorCode_SetStatus_Failed, "DevAdapter::SetStatus", __FUNCTION__, false, ullEnd - ullStart, "", CombineJsonContext("SetStatus after DevOpen"));
  350. #endif //RVC_OS_LINUX
  351. }
  352. SetDevState(DEVICE_STATUS_NORMAL);
  353. }
  354. SetDevInitingFlag(false);
  355. m_moveHoldTimes = MAX_MOVE_HOLD_TIMES;//oiltmp about 5000*300ms = 25 minutes
  356. m_moveDisappearTimes = m_moveHoldTimes;
  357. return err;
  358. }
  359. void CGPIOFSM::AfterInit()
  360. {
  361. StartDetectWorkThread();
  362. }
  363. void CGPIOFSM::SelfTest(EntityTestEnum eTestType, CSmartPointer<ITransactionContext> pTransactionContext)
  364. {
  365. OnHardwareShakeHand(pTransactionContext);
  366. }
  367. void CGPIOFSM::GetDevInfo(SpReqAnsContext<GpioService_GetDevInfo_Req, GpioService_GetDevInfo_Ans>::Pointer ctx)
  368. {
  369. if (m_bOpening) {
  370. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(GpioService_LogCode_GetDevInfo).setAPI(__FUNCTION__)("device is opening");
  371. ctx->Answer(Error_NotInit);
  372. return;
  373. }
  374. if (!m_bOpened) {
  375. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setLogCode(GpioService_LogCode_GetDevInfo).setResultCode("RTA2901").setAPI(__FUNCTION__)("GPIO未打开");
  376. ctx->Answer(Error_DevNotAvailable, GPIO_UserErrorCode_DevOpen_Failed);
  377. }
  378. else {
  379. DevCategoryInfo info = { 0 };
  380. const ULONGLONG ullStart = SP::Module::Comm::RVCGetTickCount();
  381. ErrorCodeEnum erroCode = m_hDevHelper->GetDevCategory(info);
  382. const ULONGLONG ullEnd = SP::Module::Comm::RVCGetTickCount();
  383. ctx->Ans.state = (int)erroCode;
  384. if (erroCode == Error_Succeed) {
  385. ctx->Ans.model = info.szModel;
  386. ctx->Ans.type = info.szType;
  387. ctx->Ans.version = CSimpleStringA::Format("%d.%d.%d.%d",
  388. info.version.wMajor, info.version.wMinor, info.version.wRevision, info.version.wBuild);
  389. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_GetDevInfo)
  390. .setAPI("DevAdapter::GetDevCategory").setCostTime(ullEnd - ullStart)("model: %s, state:%d, type:%s, version:%s"
  391. , ctx->Ans.model.GetData(), ctx->Ans.state, ctx->Ans.type.GetData(), ctx->Ans.version.GetData());
  392. }
  393. else {
  394. SetErrorAndLog(erroCode, GPIO_UserErrorCode_GetDevCategory_Failed, "DevAdapter::GetDevCategory", __FUNCTION__, IsInBusiness(), ullEnd - ullStart, GpioService_LogCode_GetDevInfo);
  395. }
  396. ctx->Answer(Error_Succeed);
  397. }
  398. }
  399. void CGPIOFSM::Exit(SpOnewayCallContext<GpioService_Exit_Info>::Pointer ctx)
  400. {
  401. }
  402. bool CGPIOFSM::DetectBit(ULONG data, int pos)
  403. {
  404. if (!m_bFuncVer2) {
  405. ULONG tmp = 0;
  406. SETBIT(tmp, pos);
  407. return (data & tmp);
  408. }
  409. #if defined(RVC_OS_LINUX)
  410. else {
  411. DWORD dwReq = (GPIO_DEV_SN_SENSOR_SHAKE << pos);
  412. return (data & dwReq);
  413. }
  414. #endif //RVC_OS_LINUX
  415. return 0;
  416. }
  417. void CGPIOFSM::OnLogEvent(DWORD dwUserCode)
  418. {
  419. GpioSet_Info Req;
  420. if (!m_bOpened) {
  421. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("usercode [%x], but device is not open", dwUserCode);
  422. return;
  423. }
  424. else {
  425. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("receive usercode [%x]", dwUserCode);
  426. }
  427. Req.close = 0;
  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. m_bHeadLightFlag = true;
  452. Req.devseq = HEADLIGHT;
  453. Req.mode = 0;
  454. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machine light on");
  455. break;
  456. case LOG_EVT_HEADLIGHT_RED_ON:
  457. Req.devseq = HEADLIGHT_RED;
  458. Req.mode = 1;
  459. break;
  460. case LOG_EVT_CONTACTLESS_CARD_GREEN_ON:
  461. Req.devseq = CONTACTLESSCARD;
  462. Req.mode = 1;
  463. break;
  464. case LOG_EVT_IEBROWSER_LIGHT_ASSISTANT_ON:
  465. Req.devseq = HEADLIGHT_ASSIST;
  466. Req.mode = 1;
  467. break;
  468. case LOG_EVT_CARDISSUER_GREEN_OFF:
  469. case LOG_EVT_CARDISSUER_STORE_GREEN_OFF:
  470. Req.devseq = CARDREADER;
  471. Req.mode = 1;
  472. Req.close = 1;
  473. break;
  474. case LOG_EVT_CARDISSUER_RED_OFF:
  475. Req.devseq = CARDREADER_RED;
  476. Req.mode = 1;
  477. Req.close = 1;
  478. break;
  479. case LOG_EVT_IDCERTIFICATE_GREEN_OFF:
  480. Req.devseq = IDCERTIFICATE;
  481. Req.mode = 1;
  482. Req.close = 1;
  483. break;
  484. case LOG_EVT_FINGERPRINT_GREEN_OFF:
  485. Req.devseq = FINGERPRINT;
  486. Req.mode = 1;
  487. Req.close = 1;
  488. break;
  489. case LOG_EVT_PINPAD_GREEN_OFF:
  490. Req.devseq = PINPAD;
  491. Req.mode = 1;
  492. Req.close = 1;
  493. break;
  494. case LOG_EVT_HEADLIGHT_GREEN_OFF:
  495. m_bHeadLightFlag = false;
  496. Req.devseq = HEADLIGHT;
  497. Req.mode = 1;
  498. Req.close = 1;
  499. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("machine light off");
  500. break;
  501. case LOG_EVT_HEADLIGHT_RED_OFF:
  502. Req.devseq = HEADLIGHT_RED;
  503. Req.mode = 1;
  504. Req.close = 1;
  505. break;
  506. case LOG_EVT_CONTACTLESS_CARD_GREEN_OFF:
  507. Req.devseq = CONTACTLESSCARD;
  508. Req.mode = 1;
  509. Req.close = 1;
  510. break;
  511. case LOG_EVT_IEBROWSER_LIGHT_ASSISTANT_OFF:
  512. Req.devseq = HEADLIGHT_ASSIST;
  513. Req.mode = 1;
  514. Req.close = 1;
  515. break;
  516. case LOG_EVT_HSPS_LIGHT_ON:
  517. Req.devseq = HSPSCANNER;
  518. Req.mode = 1;
  519. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hspscanner light on");
  520. break;
  521. case LOG_EVT_HSPS_LIGHT_OFF:
  522. Req.devseq = HSPSCANNER;
  523. Req.mode = 1;
  524. Req.close = 1;
  525. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("hspscanner light off");
  526. break;
  527. default:
  528. //DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM)("unkown event: 0x%X", dwUserCode);
  529. return;
  530. }
  531. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("devseq[%d],mode[%d]close[%d]", Req.devseq, Req.mode, Req.close);
  532. m_bFuncVer2 ? SetEx(Req) : Set(Req);
  533. }
  534. //老接口,用于控制灯
  535. bool CGPIOFSM::SetOutDriving(GpioSet_Info req, OutDrivingInfo od, ULONG iIndex, ULONG pinSeq)
  536. {
  537. if (req.close == 1) {
  538. GetEntityBase()->GetFunction()->KillTimer(req.devseq);
  539. //oilyang add 20161222
  540. //如果关闭照明灯,以感知为准
  541. if (pinSeq == m_headlightDevPort)
  542. WritePin(pinSeq, m_bHeadLightFlag);
  543. else {
  544. if (pinSeq == PIN_HSPSCANNER_PREVIEW_LIGHT) {
  545. //额外多关闭高拍仪提示灯
  546. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("off light hspsanner.");
  547. WritePin(PIN_HSPSCANNER_LIGHT, false);
  548. }
  549. WritePin(pinSeq, false);
  550. }
  551. return true;
  552. }
  553. switch (od.OutputMode) {
  554. case OM_POSITIVE_LEVEL:
  555. {
  556. if (od.StopMode == SM_CALLTRIGGER) {
  557. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("0.0 mode: pinSeq=%u", pinSeq);
  558. //if it is hspsanner
  559. if (pinSeq == PIN_HSPSCANNER_PREVIEW_LIGHT) {
  560. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM)("light hspsanner.");
  561. WritePin(PIN_HSPSCANNER_LIGHT, true);
  562. }
  563. WritePin(pinSeq, true);
  564. }
  565. }
  566. break;
  567. case OM_POSITIVE_FLICKER:
  568. if (od.StopMode == SM_CYCLE) {
  569. SetContextInfo* pSci = new SetContextInfo();
  570. pSci->pinSeq = pinSeq;
  571. pSci->timerID = req.devseq;
  572. pSci->setTime = od.SetTime;
  573. pSci->resetTime = od.ResetTime;
  574. pSci->timeout = od.TimeOut;
  575. WritePin(pinSeq, true);
  576. ITimerListener* pListener = new TimerOutHelper<CGPIOFSM>(this, &CGPIOFSM::OnPositiveFlickerSetTimerout, pSci, true);
  577. GetEntityBase()->GetFunction()->SetTimer(pSci->timerID, pListener, pSci->setTime);
  578. }
  579. break;
  580. default:
  581. break;
  582. }
  583. return true;
  584. }
  585. void CGPIOFSM::WritePin(DWORD dwPinSeq, bool bHighLevel)
  586. {
  587. ErrorCodeEnum result(Error_Succeed);
  588. int idx = -1;
  589. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM)("Write Pin %s with %s", GetDriverPortString(dwPinSeq + 1), bHighLevel ? "[Active]" : "[InActive]");
  590. if (dwPinSeq > 16) {/** 目前只有一个高拍仪的提示灯会超过该值 [Gifur@202495]*/
  591. if (!m_bNewVersion || dwPinSeq < 24) {
  592. return;
  593. }
  594. idx = 3;
  595. }
  596. else if (dwPinSeq < 8) {
  597. idx = 0;
  598. }
  599. else {
  600. idx = 1;
  601. }
  602. if (bHighLevel)
  603. SETBIT(m_btOutputStatus[idx], dwPinSeq - 8 * idx);
  604. else
  605. CLEARBIT(m_btOutputStatus[idx], dwPinSeq - 8 * idx);
  606. const auto iBegin = SP::Module::Comm::RVCGetTickCount();
  607. result = m_hDevHelper->WritePort(idx, m_btOutputStatus[idx]);
  608. const auto iEnd = SP::Module::Comm::RVCGetTickCount();
  609. if (result != Error_Succeed) {
  610. SetErrorAndLog(result, GPIO_UserErrorCode_WritePort_Failed, "DevAdapter::WritePort", __FUNCTION__, false, iEnd - iBegin, "", CombineJsonContext(CSimpleStringA::Format("write port[%d] with %d", idx, m_btOutputStatus[idx])));
  611. }
  612. else {
  613. 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]);
  614. }
  615. return;
  616. }
  617. void CGPIOFSM::SetEx(GpioSet_Info req)
  618. {
  619. #if defined(RVC_OS_LINUX)
  620. int devicePort;
  621. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("SetEx request %s arrived!", GetLightSeqString(req.devseq));
  622. switch (req.devseq) {
  623. case CARDREADER:
  624. {
  625. devicePort = GPIO_DEV_SN_LIGHT_CARDISSUER;
  626. break;
  627. }
  628. case CARDREADER_RED:
  629. {
  630. devicePort = GPIO_DEV_SN_LIGHT_CARDISSUER_MAINTAIN;
  631. break;
  632. }
  633. case IDCERTIFICATE:
  634. {
  635. devicePort = GPIO_DEV_SN_LIGHT_IDCERTIFICATE;
  636. break;
  637. }
  638. case FINGERPRINT:
  639. {
  640. devicePort = GPIO_DEV_SN_LIGHT_FINGERPRINT;
  641. break;
  642. }
  643. case PINPAD:
  644. {
  645. devicePort = GPIO_DEV_SN_LIGHT_PINPAD;
  646. break;
  647. }
  648. case HEADLIGHT:
  649. {
  650. devicePort = GPIO_DEV_SN_LIGHT_FACE;
  651. break;
  652. }
  653. case HEADLIGHT_RED:
  654. {
  655. devicePort = 6/*GPIO_DEV_SN_LIGHT_MACHINE_FAULT*/;
  656. break;
  657. }
  658. case CONTACTLESSCARD:
  659. {
  660. devicePort = GPIO_DEV_SN_LIGHT_CONTACTLESSCARD;
  661. break;
  662. }
  663. case HEADLIGHT_ASSIST:
  664. {
  665. devicePort = GPIO_DEV_SN_LIGHT_FACE;
  666. break;
  667. }
  668. break;
  669. default:
  670. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_USER).setAPI(__FUNCTION__)("unsupport device seq: %d", req.devseq);
  671. return;
  672. }
  673. if (m_hDevHelper != nullptr) {
  674. DWORD dwReq = devicePort;
  675. DWORD dwMode = 0;
  676. if (!req.close) {
  677. dwMode |= GPIO_DEV_LIGHT_MODE_COLOR_NORMAL;
  678. if (!!req.mode) {
  679. dwMode |= GPIO_DEV_LIGHT_MODE_LIGHT_FLICKER;
  680. }
  681. else {
  682. dwMode |= GPIO_DEV_LIGHT_MODE_LIGHT_SUSTAIN;
  683. }
  684. }
  685. const auto iBegin = SP::Module::Comm::RVCGetTickCount();
  686. const ErrorCodeEnum ec = m_hDevHelper->SetStatus(dwReq, dwMode);
  687. const auto iEnd = SP::Module::Comm::RVCGetTickCount();
  688. if (ec != Error_Succeed) {
  689. SetErrorAndLog(ec, GPIO_UserErrorCode_SetStatus_Failed, "DevAdapter::SetStatus", __FUNCTION__, false, iEnd - iBegin, "", CombineJsonContext(CSimpleStringA::Format("SetStatus with 0x%X,0x%X", dwReq, dwMode)));
  690. }
  691. else {
  692. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_SYSTEM).setAPI("DevAdapter::SetStatus").setAPI(__FUNCTION__).setCostTime(iEnd - iBegin)("SetStatus with 0x%X,0x%X", dwReq, dwMode);
  693. }
  694. }
  695. else {
  696. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("dev helper object is invalid pointer!");
  697. }
  698. #endif //RVC_OS_LINUX
  699. }
  700. void CGPIOFSM::Set(GpioSet_Info req)
  701. {
  702. CSimpleStringA activeModeSecName = "";
  703. int devicePort;
  704. OutDrivingInfo odi;
  705. DbgWithLink(LOG_LEVEL_DEBUG, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("Set request %s arrived!", GetLightSeqString(req.devseq));
  706. switch (req.devseq) {
  707. case CARDREADER:
  708. case PINPAD:
  709. case CONTACTLESSCARD:
  710. {
  711. devicePort = req.devseq == CARDREADER ? 0 : (req.devseq == PINPAD ? 3 : 8);
  712. odi.OutputMode = OM_POSITIVE_FLICKER;
  713. odi.StopMode = SM_CYCLE;
  714. odi.SetTime = 200;
  715. odi.ResetTime = 200;
  716. odi.TimeOut = 5000;
  717. break;
  718. }
  719. case CARDREADER_RED:
  720. case HEADLIGHT_RED:
  721. {
  722. devicePort = req.devseq == CARDREADER_RED ? 6 : 5;
  723. odi.OutputMode = OM_POSITIVE_LEVEL;
  724. odi.StopMode = SM_CALLTRIGGER;
  725. odi.SetTime = 200;
  726. odi.ResetTime = 200;
  727. odi.TimeOut = 3000;
  728. break;
  729. }
  730. case IDCERTIFICATE:
  731. case FINGERPRINT:
  732. {
  733. devicePort = req.devseq == IDCERTIFICATE ? 2 : 10;
  734. odi.OutputMode = OM_POSITIVE_FLICKER;
  735. odi.StopMode = SM_CYCLE;
  736. odi.SetTime = 150;
  737. odi.ResetTime = 150;
  738. odi.TimeOut = 5000;
  739. break;
  740. }
  741. case HEADLIGHT:
  742. case HSPSCANNER:
  743. {
  744. devicePort = req.devseq == HEADLIGHT ? 4 : 12;
  745. odi.OutputMode = OM_POSITIVE_LEVEL;
  746. odi.StopMode = SM_CALLTRIGGER;
  747. odi.SetTime = 1000;
  748. odi.ResetTime = 1000;
  749. odi.TimeOut = 5000;
  750. break;
  751. }
  752. case HEADLIGHT_ASSIST:
  753. {
  754. devicePort = 4;
  755. odi.OutputMode = OM_POSITIVE_FLICKER;
  756. odi.StopMode = SM_CYCLE;
  757. odi.SetTime = 1000;
  758. odi.ResetTime = 500;
  759. odi.TimeOut = 5000;
  760. break;
  761. }
  762. default:
  763. odi.OutputMode = OM_POSITIVE_LEVEL;
  764. odi.StopMode = SM_CALLTRIGGER;
  765. odi.SetTime = 200;
  766. odi.ResetTime = 200;
  767. odi.TimeOut = 5000;
  768. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setAPI(__FUNCTION__)("unsupport device seq: %d", req.devseq);
  769. return;
  770. }
  771. SetOutDriving(req, odi, 0, devicePort);
  772. }
  773. void CGPIOFSM::StartDetectWorkThread()
  774. {
  775. ReceivingInfo ri;
  776. ri.ContinuousTriggerTime = 2;
  777. GetContextInfo* pGci = new GetContextInfo();
  778. /** 注意设备序号是实体内定义的逻辑,不是设备端口号,最后用作于计时器的ID去了*/
  779. pGci->timerID = PHONEPICKUP;
  780. m_PickUpTimeStamp = m_PutDownTimeStamp = SP::Module::Comm::RVCGetTickCount();
  781. m_DoorOpenTimeStamp = m_DoorCloseTimeStamp = SP::Module::Comm::RVCGetTickCount();
  782. ITimerListener* pListener = new TimerOutHelper<CGPIOFSM>(this, &CGPIOFSM::OnEventDetect, pGci);
  783. GetEntityBase()->GetFunction()->SetTimer(pGci->timerID, pListener, 100);
  784. }
  785. void CGPIOFSM::OnPositiveFlickerSetTimerout(void* pData)
  786. {
  787. SetContextInfo* pSCI = (SetContextInfo*)pData;
  788. GetEntityBase()->GetFunction()->KillTimer(pSCI->timerID);
  789. WritePin(pSCI->pinSeq, false); //实际操作
  790. pSCI->timerID = pSCI->timerID;
  791. ITimerListener* pListener = new TimerOutHelper<CGPIOFSM>(this, &CGPIOFSM::OnPositiveFlickerResetTimerout, pSCI, true);
  792. GetEntityBase()->GetFunction()->SetTimer(pSCI->timerID, pListener, pSCI->resetTime);
  793. }
  794. void CGPIOFSM::OnPositiveFlickerResetTimerout(void* pData)
  795. {
  796. SetContextInfo* pSCI = (SetContextInfo*)pData;
  797. GetEntityBase()->GetFunction()->KillTimer(pSCI->timerID);
  798. WritePin(pSCI->pinSeq, true); //实际操作
  799. ITimerListener* pListener = new TimerOutHelper<CGPIOFSM>(this, &CGPIOFSM::OnPositiveFlickerSetTimerout, pSCI, true);
  800. GetEntityBase()->GetFunction()->SetTimer(pSCI->timerID, pListener, pSCI->setTime);
  801. }
  802. void CGPIOFSM::OnEventDetect(void* pData)
  803. {
  804. GetContextInfo* pGci = (GetContextInfo*)pData;
  805. ULONG input = 0;
  806. BYTE btInput;
  807. ErrorCodeEnum err(Error_Succeed);
  808. if (!m_bFuncVer2) {
  809. const auto iBegin = SP::Module::Comm::RVCGetTickCount();
  810. err = m_hDevHelper->ReadPort(INPUT_PORT_2, btInput);
  811. const auto iEnd = SP::Module::Comm::RVCGetTickCount();
  812. if (err != Error_Succeed) {
  813. SetErrorAndLog(err, GPIO_UserErrorCode_ReadPort_Failed, "DevAdapter::ReadPort", __FUNCTION__, false, iEnd - iBegin, "",
  814. CombineJsonContext(CSimpleStringA::Format("read port[%d] with %d", INPUT_PORT_2, btInput)));
  815. }
  816. else if (btInput != m_btLastRevcInput) {
  817. m_btLastRevcInput = btInput;
  818. LogPinStatus(btInput);
  819. }
  820. }
  821. else {
  822. #if defined(RVC_OS_LINUX)
  823. DWORD dwReq(GPIO_DEV_SN_LIGHT_SENSOR_ALL);
  824. DWORD dwMode = 0;
  825. const auto iBegin = SP::Module::Comm::RVCGetTickCount();
  826. err = m_hDevHelper->DetectStatus(dwReq, dwMode);
  827. const auto iEnd = SP::Module::Comm::RVCGetTickCount();
  828. btInput = dwMode;
  829. if (err != Error_Succeed) {
  830. SetErrorAndLog(err, GPIO_UserErrorCode_DetectStatus_Failed, "DevAdapter::DetectStatus", __FUNCTION__, false, iEnd - iBegin, "",
  831. CombineJsonContext(CSimpleStringA::Format("detect status[%d] with %d", dwReq, dwMode)));
  832. }
  833. else if (btInput != m_btLastRevcInput) {
  834. m_btLastRevcInput = btInput;
  835. LogPinStatus(btInput);
  836. }
  837. #else
  838. err = Error_NotSupport;
  839. #endif //RVC_OS_LINUX
  840. }
  841. if (err != Error_Succeed) {
  842. m_btLastRevcInput = (BYTE)(-1);
  843. GetEntityBase()->GetFunction()->ResetTimer(pGci->timerID, ON_EVENT_DETECT_TIMOUE_MILLSECS);
  844. return;
  845. }
  846. /** 震动感应 */
  847. if (DetectBit(btInput, VIBRATIONSENSOR) && !m_bVibrationFlag) {
  848. m_bVibrationFlag = true;
  849. LogEvent(Severity_Middle, LOG_EVT_VIBRATIONSENSOR, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(17), __LINE__));
  850. }
  851. else if (!DetectBit(btInput, VIBRATIONSENSOR) && m_bVibrationFlag) {
  852. LogEvent(Severity_Middle, LOG_EVT_VIBRATIONSENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(17), __LINE__));
  853. m_bVibrationFlag = false;
  854. }
  855. /** 机箱门开关检测*/
  856. if (DetectBit(btInput, OPENSENSOR) && !m_bOpenFlag) {
  857. m_bOpenFlag = true;
  858. m_DoorOpenTimeStamp = SP::Module::Comm::RVCGetTickCount();
  859. LogEvent(Severity_Middle, LOG_EVT_OPENSENSOR_ON, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(18), __LINE__));
  860. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_DoorOpen)("[GPIO] The chassis door is open");
  861. }
  862. else if (!DetectBit(btInput, OPENSENSOR) && m_bOpenFlag) {
  863. m_bOpenFlag = false;
  864. m_DoorCloseTimeStamp = SP::Module::Comm::RVCGetTickCount();
  865. LogEvent(Severity_Middle, LOG_EVT_OPENSENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(18), __LINE__));
  866. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_DoorClose).setCostTime(m_DoorCloseTimeStamp - m_DoorOpenTimeStamp)("[GPIO] The chassis door is close");
  867. }
  868. /**话机检测*/
  869. if (DetectBit(btInput, PICKUPSENSOR)) {
  870. if (m_ePickUpFlag == InActive) {
  871. m_ePickUpFlag = Actived;
  872. m_PickUpTimeStamp = SP::Module::Comm::RVCGetTickCount();
  873. LogEvent(Severity_Middle, LOG_EVT_PICKUP, "Life the Phone up");
  874. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_PhonePickup)("[GPIO] 话机提起");
  875. LogWarn(Severity_Low, Error_Debug, GPIO_UserErrorCode_Phone_HandUp, "话机提起");
  876. }
  877. else if (m_ePickUpFlag == UnknownStatus) {
  878. m_ePickUpFlag = Actived;
  879. m_PickUpTimeStamp = SP::Module::Comm::RVCGetTickCount();
  880. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_PhonePickup)("[GPIO] 话机提起(启动时)");
  881. LogWarn(Severity_Low, Error_Debug, GPIO_UserErrorCode_Phone_HandUp_AtBegin, "话机提起(启动时)");
  882. }
  883. }
  884. else if (!DetectBit(btInput, PICKUPSENSOR)) {
  885. if (m_ePickUpFlag == Actived) {
  886. m_ePickUpFlag = InActive;
  887. m_PutDownTimeStamp = SP::Module::Comm::RVCGetTickCount();
  888. LogEvent(Severity_Middle, LOG_EVT_ONHOOK, "Put the Phone down");
  889. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_PhonePutDown).setCostTime(m_PutDownTimeStamp - m_PickUpTimeStamp)("[GPIO] 话机放下");
  890. LogWarn(Severity_Low, Error_Debug, GPIO_UserErrorCode_Phone_PutDown, "话机放下");
  891. }
  892. else if (m_ePickUpFlag == UnknownStatus) {
  893. m_ePickUpFlag = InActive;
  894. m_PutDownTimeStamp = SP::Module::Comm::RVCGetTickCount();
  895. }
  896. }
  897. /*物体靠近感知检测*/
  898. if (DetectBit(btInput, MOVESENSOR)) {
  899. if (!m_bMoveFlag) {
  900. m_bMoveFlag = true;
  901. m_moveDisappearTimes = 0;
  902. LogEvent(Severity_Middle, LOG_EVT_MOVESENSOR_ON, CSimpleStringA::Format("%s [Active] line: %d, times: %lu", GetDriverPortString(20), __LINE__, m_moveHoldTimes));
  903. }
  904. /** 只是发一次时间时,发现感知实体没有收到或者不处理第一次发出的时间,所以需要沿用原有的发送频率,再继续发送消失的事件,下同 [Gifur@202496]*/
  905. else if (m_moveHoldTimes != 0 && (m_moveHoldTimes % (REPEAT_FIRE_TIMEOUT_VALUE / ON_EVENT_DETECT_TIMOUE_MILLSECS)) == 0) {
  906. LogEvent(Severity_Middle, LOG_EVT_MOVESENSOR_ON, CSimpleStringA::Format("%s [Active] line: %d, times: %lu", GetDriverPortString(20), __LINE__, m_moveHoldTimes));
  907. }
  908. const bool toCheck = !!(m_moveHoldTimes != 0 && (m_moveHoldTimes % (8/*mins*/ * 60 * 1000 / ON_EVENT_DETECT_TIMOUE_MILLSECS) == 0));
  909. if (toCheck) {
  910. SYSTEMTIME localTime;
  911. GetLocalTime(&localTime);
  912. if (localTime.wHour < (WORD)8 || (localTime.wHour == 8 && localTime.wMinute <= (WORD)30) || localTime.wHour >= (WORD)18)
  913. {
  914. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA2903")("Move detect is abnormal(off work).");
  915. LogWarn(Severity_High, Error_Unexpect, LOG_EVT_MOVEDETECT_ABNORMAL_OFFWORK, "Move detect is abnormal(off work).");
  916. }
  917. else {
  918. DbgWithLink(LOG_LEVEL_WARN, LOG_TYPE_SYSTEM).setResultCode("RTA2902")("Move detect is abnormal(Work time).");
  919. LogWarn(Severity_High, Error_Unexpect, LOG_EVT_MOVEDETECT_ABNORMAL_WORKTIME, "Move detect is abnormal(Work time).");
  920. }
  921. }
  922. m_moveHoldTimes++;
  923. }
  924. else if (!DetectBit(btInput, MOVESENSOR)) {
  925. if (m_bMoveFlag) {
  926. m_bMoveFlag = false;
  927. m_moveHoldTimes = 0;
  928. LogEvent(Severity_Middle, LOG_EVT_MOVESENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(20), __LINE__));
  929. }
  930. else if (m_moveDisappearTimes != 0 && (m_moveDisappearTimes % (REPEAT_FIRE_TIMEOUT_VALUE / ON_EVENT_DETECT_TIMOUE_MILLSECS)) == 0) {
  931. LogEvent(Severity_Middle, LOG_EVT_MOVESENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(20), __LINE__));
  932. }
  933. m_moveDisappearTimes++;
  934. }
  935. /*卡嘴异物检测*/
  936. if (DetectBit(btInput, CARDGATESENSOR) && !m_bCardGateFlag) {
  937. m_bCardGateFlag = true;
  938. LogEvent(Severity_Middle, LOG_EVT_CARDGATESENSOR, CSimpleStringA::Format("%s [Active] line: %d", GetDriverPortString(21), __LINE__));
  939. DbgWithLink(LOG_LEVEL_INFO, LOG_TYPE_USER).setLogCode(GpioService_LogCode_Detect_CardMouseJam)("[GPIO] The card mouse is jam");
  940. }
  941. else if (!DetectBit(btInput, CARDGATESENSOR) && m_bCardGateFlag) {
  942. LogEvent(Severity_Middle, LOG_EVT_CARDGATESENSOR_OFF, CSimpleStringA::Format("%s [InActive] line: %d", GetDriverPortString(21), __LINE__));
  943. m_bCardGateFlag = false;
  944. }
  945. GetEntityBase()->GetFunction()->ResetTimer(pGci->timerID, ON_EVENT_DETECT_TIMOUE_MILLSECS);
  946. }