UpsFSM.cpp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include "stdafx.h"
  2. #include "UpsFSM.h"
  3. #include "GetDevInfoHelper.h"
  4. const int MAX_UPS_INIT_TRIES = 3;
  5. ErrorCodeEnum CUpsFSM::OnInit()
  6. {
  7. LOG_FUNCTION();
  8. GET_DEV_ENTITY_BASE_POINTER()->InitializeVendorLogSwitch();
  9. CSimpleStringA dllName;
  10. auto pEntity = GET_DEV_ENTITY_BASE_POINTER();
  11. auto result = pEntity->ExtractVendorLibFullPath(dllName);
  12. if (result != Error_Succeed) {
  13. return result;
  14. }
  15. HARDWARE_ENTITY_SET_VENDOR_NAME(m_entCode, pEntity->vendorLibInfo.strVendor);
  16. Dbg("vendor library path: %s", (LPCTSTR)dllName);
  17. result = m_hDevHelper.LoadUp(dllName);
  18. if (result != Error_Succeed) {
  19. return result;
  20. }
  21. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  22. CSmartPointer<IConfigInfo> spConfig;
  23. result = spEntityFunction->OpenConfig(Config_Root, spConfig);
  24. if (result != Error_Succeed) {
  25. Dbg("open cfg file failed!");
  26. return result;
  27. }
  28. int baudRate = 0, port = 0;
  29. spConfig->ReadConfigValueInt("Device.Ups", "Baudrate", baudRate);
  30. spConfig->ReadConfigValueInt("Device.Ups", "Port", port);
  31. Dbg("port: %d, baudrate: %d", port, baudRate);
  32. result = m_hDevHelper->DevOpen(port, baudRate);
  33. if (result != Error_Succeed) {
  34. LOG_UPS_ERROR_MSG_MACRO(result, DevOpen);
  35. return result;
  36. }
  37. Dbg("open ups succeed.");
  38. m_bDevOpen = true;
  39. return Error_Succeed;
  40. }
  41. ErrorCodeEnum CUpsFSM::OnExit()
  42. {
  43. ErrorCodeEnum eErr = Error_Succeed;
  44. m_hDevHelper.TearDown();
  45. m_bDevOpen = false;
  46. return eErr;
  47. }
  48. void CUpsFSM::s0_on_entry()
  49. {
  50. UpsStatusEnum eUpsState;
  51. ErrorCodeEnum eErrCode = m_hDevHelper->GetDevStatus(eUpsState);
  52. if (eErrCode != Error_Succeed) {
  53. LOG_UPS_ERROR_MSG_MACRO(eErrCode, GetDevStatus);
  54. } else {
  55. Dbg("UpsState: %d", eUpsState);
  56. }
  57. m_testResult = Error_Succeed;
  58. }
  59. void CUpsFSM::s0_on_exit()
  60. {
  61. }
  62. unsigned int CUpsFSM::s0_on_event(FSMEvent* e)
  63. {
  64. switch(e->iEvt)
  65. {
  66. case USER_EVT_SHUTDOWN:
  67. {
  68. e->SetHandled();
  69. ShutDownTask* task = new ShutDownTask(this);
  70. ShutDownEvent* sde = dynamic_cast<ShutDownEvent*>(e);
  71. task->ctx = sde->ctx; //oiltest
  72. Dbg("%d, in %d",sde->ctx->Req.ShutdownTime, sde->ctx->Req.UpTime);
  73. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  74. return 0;
  75. }
  76. break;
  77. case USER_EVT_GETSTATUS:
  78. {
  79. e->SetHandled();
  80. UpsStatusEnum eUpsState;
  81. ErrorCodeEnum eErrState = m_hDevHelper->GetDevStatus(eUpsState);
  82. Dbg("%d,%d",eErrState,eUpsState);
  83. GetStatusEvent* pGse = dynamic_cast<GetStatusEvent*>(e);
  84. pGse->ctx->Ans.Status = eUpsState;
  85. Dbg("%d",pGse->ctx->Ans.Status);
  86. pGse->ctx->Answer(eErrState);
  87. }
  88. break;
  89. default:
  90. return 1;
  91. }
  92. return 0;
  93. }
  94. void CUpsFSM::s1_on_entry()
  95. {
  96. }
  97. void CUpsFSM::s1_on_exit()
  98. {
  99. }
  100. unsigned int CUpsFSM::s1_on_event(FSMEvent* e)
  101. {
  102. LOG_FUNCTION();
  103. switch(e->iEvt)
  104. {
  105. case USER_EVT_SHUTDOWN_FINISHED:
  106. {
  107. e->SetHandled();
  108. return e->param1;
  109. }
  110. default:
  111. return 1;
  112. }
  113. }
  114. void CUpsFSM::s2_on_entry()
  115. {
  116. CheckTask *pTask = new CheckTask(this);
  117. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  118. m_testResult = Error_InvalidState;
  119. }
  120. void CUpsFSM::s2_on_exit()
  121. {
  122. }
  123. unsigned int CUpsFSM::s2_on_event(FSMEvent* pEvt)
  124. {
  125. int ret = 0;
  126. switch(pEvt->iEvt)
  127. {
  128. case USER_EVT_CHECK_FINISHED:
  129. ret = pEvt->param1;
  130. break;
  131. default:
  132. break;
  133. }
  134. return ret;
  135. }
  136. int CUpsFSM::ShutDown(SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>::Pointer ctx)
  137. {
  138. LOG_FUNCTION();
  139. UpsStatusEnum eUpsStatus;
  140. ErrorCodeEnum err = m_hDevHelper->GetDevStatus(eUpsStatus);
  141. Dbg("(%d)status:[%d],%d,%d",err,eUpsStatus,ctx->Req.ShutdownTime,ctx->Req.UpTime);
  142. err = m_hDevHelper->Shutdown(ctx->Req.ShutdownTime,ctx->Req.UpTime);
  143. if (err == Error_Succeed)
  144. {
  145. Dbg("shutdown...");
  146. ctx->Answer(Error_Succeed);
  147. return 0;
  148. }
  149. else
  150. {
  151. LOG_UPS_ERROR_MSG_MACRO(err, Shutdown);
  152. ctx->Answer(Error_Unexpect);
  153. return 1;
  154. }
  155. }
  156. int CUpsFSM::CheckStatus()
  157. {
  158. int i = 0;
  159. while(1)
  160. {
  161. if (m_hDevHelper)
  162. {
  163. UpsStatusEnum eUpsStatus;
  164. ErrorCodeEnum eErr;
  165. eErr = m_hDevHelper->GetDevStatus(eUpsStatus);
  166. if (eErr == Error_Succeed)
  167. {
  168. Dbg("CheckStatus %d",eUpsStatus);
  169. if (eUpsStatus == UPS_STATUS_NORMAL || eUpsStatus == UPS_STATUS_NO_ELECTOR)
  170. return 0;
  171. }
  172. }
  173. Sleep(10000);
  174. i++;
  175. if (i > 30)
  176. {
  177. Dbg("have try 5 minutes.");
  178. i = 0;
  179. }
  180. }
  181. return 1;
  182. }
  183. void CUpsFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  184. {
  185. pTransactionContext->SendAnswer(m_testResult);
  186. }