GpioFSM.cpp 33 KB

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