UpsFSM.cpp 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  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;
  72. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  73. return 0;
  74. }
  75. break;
  76. case USER_EVT_GETSTATUS:
  77. {
  78. e->SetHandled();
  79. UpsStatusEnum eUpsState;
  80. ErrorCodeEnum eErrState = m_hDevHelper->GetDevStatus(eUpsState);
  81. Dbg("%s,%d",SpStrError(eErrState), eUpsState);
  82. GetStatusEvent* pGse = dynamic_cast<GetStatusEvent*>(e);
  83. pGse->ctx->Ans.Status = eUpsState;
  84. Dbg("status: %d",pGse->ctx->Ans.Status);
  85. pGse->ctx->Answer(eErrState);
  86. }
  87. break;
  88. default:
  89. return 1;
  90. }
  91. return 0;
  92. }
  93. void CUpsFSM::s1_on_entry()
  94. {
  95. }
  96. void CUpsFSM::s1_on_exit()
  97. {
  98. }
  99. unsigned int CUpsFSM::s1_on_event(FSMEvent* e)
  100. {
  101. LOG_FUNCTION();
  102. switch(e->iEvt)
  103. {
  104. case USER_EVT_SHUTDOWN_FINISHED:
  105. {
  106. e->SetHandled();
  107. return e->param1;
  108. }
  109. default:
  110. return 1;
  111. }
  112. }
  113. void CUpsFSM::s2_on_entry()
  114. {
  115. CheckTask *pTask = new CheckTask(this);
  116. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  117. m_testResult = Error_InvalidState;
  118. }
  119. void CUpsFSM::s2_on_exit()
  120. {
  121. }
  122. unsigned int CUpsFSM::s2_on_event(FSMEvent* pEvt)
  123. {
  124. int ret = 0;
  125. switch(pEvt->iEvt)
  126. {
  127. case USER_EVT_CHECK_FINISHED:
  128. ret = pEvt->param1;
  129. break;
  130. default:
  131. break;
  132. }
  133. return ret;
  134. }
  135. int CUpsFSM::ShutDown(SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>::Pointer ctx)
  136. {
  137. LOG_FUNCTION();
  138. UpsStatusEnum eUpsStatus;
  139. Dbg("shutdown time: %d, uptime: %d", ctx->Req.ShutdownTime, ctx->Req.UpTime);
  140. ErrorCodeEnum err = m_hDevHelper->GetDevStatus(eUpsStatus);
  141. Dbg("(%s)status:[%d],%d,%d",SpStrError(err), eUpsStatus, ctx->Req.ShutdownTime, ctx->Req.UpTime);
  142. if (ctx->Req.ShutdownTime < 0 || ctx->Req.UpTime < 0) {
  143. Dbg("error param");
  144. ctx->Answer(Error_Param);
  145. return 2; //do not jump
  146. }
  147. err = m_hDevHelper->Shutdown(ctx->Req.ShutdownTime,ctx->Req.UpTime);
  148. if (err == Error_Succeed)
  149. {
  150. Dbg("shutdown...");
  151. ctx->Answer(Error_Succeed);
  152. return 0;
  153. }
  154. else
  155. {
  156. LOG_UPS_ERROR_MSG_MACRO(err, Shutdown);
  157. ctx->Answer(Error_Unexpect);
  158. return 1;
  159. }
  160. }
  161. int CUpsFSM::CheckStatus()
  162. {
  163. int i = 0;
  164. while(1)
  165. {
  166. if (m_hDevHelper)
  167. {
  168. UpsStatusEnum eUpsStatus;
  169. ErrorCodeEnum eErr;
  170. eErr = m_hDevHelper->GetDevStatus(eUpsStatus);
  171. if (eErr == Error_Succeed)
  172. {
  173. Dbg("CheckStatus %d",eUpsStatus);
  174. if (eUpsStatus == UPS_STATUS_NORMAL || eUpsStatus == UPS_STATUS_NO_ELECTOR)
  175. return 0;
  176. }
  177. }
  178. Sleep(10000);
  179. i++;
  180. if (i > 30)
  181. {
  182. Dbg("have try 5 minutes.");
  183. i = 0;
  184. }
  185. }
  186. return 1;
  187. }
  188. void CUpsFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  189. {
  190. pTransactionContext->SendAnswer(m_testResult);
  191. }