GpioFSM.cpp 32 KB

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