UpsFSM.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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. m_adapterInfo.adapterFileName = dllName;
  18. result = m_hDevHelper.LoadUp(dllName);
  19. if (result != Error_Succeed) {
  20. return result;
  21. }
  22. CSmartPointer<IEntityFunction> spEntityFunction = GetEntityBase()->GetFunction();
  23. CSmartPointer<IConfigInfo> spConfig;
  24. result = spEntityFunction->OpenConfig(Config_Root, spConfig);
  25. if (result != Error_Succeed) {
  26. Dbg("open cfg file failed!");
  27. return result;
  28. }
  29. int baudRate = 0, port = 0;
  30. spConfig->ReadConfigValueInt("Device.Ups", "Baudrate", baudRate);
  31. spConfig->ReadConfigValueInt("Device.Ups", "Port", port);
  32. Dbg("port: %d, baudrate: %d", port, baudRate);
  33. result = m_hDevHelper->DevOpen(port, baudRate);
  34. if (result != Error_Succeed) {
  35. SetErrPackage(m_errPkg, "OnInit::DevOpen", m_csDevNo, result, MEC_DEVAPI_UPS_DevOpen);
  36. AlarmDEC(m_errPkg);
  37. return result;
  38. }
  39. Dbg("open ups succeed.");
  40. m_bDevOpen = true;
  41. ZeroMemory(m_devCatInfo.szModel, sizeof(m_devCatInfo.szModel));
  42. ZeroMemory(m_devCatInfo.szType, sizeof(m_devCatInfo.szType));
  43. ZeroMemory(m_devCatInfo.szVendor, sizeof(m_devCatInfo.szVendor));
  44. result = m_hDevHelper->GetDevCategory(m_devCatInfo);
  45. if (result == Error_Succeed)
  46. {
  47. Dbg("szVendor:%s", m_devCatInfo.szVendor);
  48. Dbg("szType:%s", m_devCatInfo.szType);
  49. Dbg("szModel:%s", m_devCatInfo.szModel);
  50. m_adapterInfo.devCatInfo = m_devCatInfo;
  51. }
  52. else {
  53. SetErrPackage(m_errPkg, "OnInit::GetDevCategory", m_csDevNo, result, MEC_DEVAPI_UPS_GetDevCategory);
  54. AlarmDEC(m_errPkg);
  55. }
  56. return Error_Succeed;
  57. }
  58. ErrorCodeEnum CUpsFSM::OnExit()
  59. {
  60. ErrorCodeEnum eErr = Error_Succeed;
  61. m_hDevHelper.TearDown();
  62. m_bDevOpen = false;
  63. return eErr;
  64. }
  65. void CUpsFSM::s0_on_entry()
  66. {
  67. UpsStatusEnum eUpsState;
  68. ErrorCodeEnum eErrCode = m_hDevHelper->GetDevStatus(eUpsState);
  69. if (eErrCode != Error_Succeed) {
  70. LOG_UPS_ERROR_MSG_MACRO(eErrCode, GetDevStatus);
  71. } else {
  72. Dbg("UpsState: %d", eUpsState);
  73. }
  74. m_testResult = Error_Succeed;
  75. if (m_FirstStart) {
  76. m_FirstStart = FALSE;
  77. ToLogWarnInfoAboutTerm(this, m_adapterInfo);
  78. }
  79. }
  80. void CUpsFSM::s0_on_exit()
  81. {
  82. }
  83. unsigned int CUpsFSM::s0_on_event(FSMEvent* e)
  84. {
  85. switch(e->iEvt)
  86. {
  87. case USER_EVT_SHUTDOWN:
  88. {
  89. e->SetHandled();
  90. ShutDownTask* task = new ShutDownTask(this);
  91. ShutDownEvent* sde = dynamic_cast<ShutDownEvent*>(e);
  92. task->ctx = sde->ctx;
  93. GetEntityBase()->GetFunction()->PostThreadPoolTask(task);
  94. return 0;
  95. }
  96. break;
  97. case USER_EVT_GETSTATUS:
  98. {
  99. e->SetHandled();
  100. UpsStatusEnum eUpsState;
  101. ErrorCodeEnum eErrState = m_hDevHelper->GetDevStatus(eUpsState);
  102. Dbg("%s,%d",SpStrError(eErrState), eUpsState);
  103. GetStatusEvent* pGse = dynamic_cast<GetStatusEvent*>(e);
  104. pGse->ctx->Ans.Status = eUpsState;
  105. Dbg("status: %d",pGse->ctx->Ans.Status);
  106. pGse->ctx->Answer(eErrState);
  107. }
  108. break;
  109. default:
  110. return 1;
  111. }
  112. return 0;
  113. }
  114. void CUpsFSM::s1_on_entry()
  115. {
  116. }
  117. void CUpsFSM::s1_on_exit()
  118. {
  119. }
  120. unsigned int CUpsFSM::s1_on_event(FSMEvent* e)
  121. {
  122. LOG_FUNCTION();
  123. switch(e->iEvt)
  124. {
  125. case USER_EVT_SHUTDOWN_FINISHED:
  126. {
  127. e->SetHandled();
  128. return e->param1;
  129. }
  130. default:
  131. return 1;
  132. }
  133. }
  134. void CUpsFSM::s2_on_entry()
  135. {
  136. CheckTask *pTask = new CheckTask(this);
  137. GetEntityBase()->GetFunction()->PostThreadPoolTask(pTask);
  138. m_testResult = Error_InvalidState;
  139. }
  140. void CUpsFSM::s2_on_exit()
  141. {
  142. }
  143. unsigned int CUpsFSM::s2_on_event(FSMEvent* pEvt)
  144. {
  145. int ret = 0;
  146. switch(pEvt->iEvt)
  147. {
  148. case USER_EVT_CHECK_FINISHED:
  149. ret = pEvt->param1;
  150. break;
  151. default:
  152. break;
  153. }
  154. return ret;
  155. }
  156. int CUpsFSM::ShutDown(SpReqAnsContext<UpsService_Shutdown_Req,UpsService_Shutdown_Ans>::Pointer ctx)
  157. {
  158. LOG_FUNCTION();
  159. UpsStatusEnum eUpsStatus;
  160. Dbg("shutdown time: %d, uptime: %d", ctx->Req.ShutdownTime, ctx->Req.UpTime);
  161. ErrorCodeEnum err = m_hDevHelper->GetDevStatus(eUpsStatus);
  162. Dbg("(%s)status:[%d],%d,%d",SpStrError(err), eUpsStatus, ctx->Req.ShutdownTime, ctx->Req.UpTime);
  163. if (ctx->Req.ShutdownTime < 0 || ctx->Req.UpTime < 0) {
  164. Dbg("error param");
  165. ctx->Answer(Error_Param);
  166. return 2; //do not jump
  167. }
  168. err = m_hDevHelper->Shutdown(ctx->Req.ShutdownTime,ctx->Req.UpTime);
  169. if (err == Error_Succeed)
  170. {
  171. Dbg("shutdown...");
  172. ctx->Answer(Error_Succeed);
  173. return 0;
  174. }
  175. else
  176. {
  177. LOG_UPS_ERROR_MSG_MACRO(err, Shutdown);
  178. ctx->Answer(Error_Unexpect);
  179. return 1;
  180. }
  181. }
  182. int CUpsFSM::CheckStatus()
  183. {
  184. int i = 0;
  185. while(1)
  186. {
  187. if (m_hDevHelper)
  188. {
  189. UpsStatusEnum eUpsStatus;
  190. ErrorCodeEnum eErr;
  191. eErr = m_hDevHelper->GetDevStatus(eUpsStatus);
  192. if (eErr == Error_Succeed)
  193. {
  194. Dbg("CheckStatus %d",eUpsStatus);
  195. if (eUpsStatus == UPS_STATUS_NORMAL || eUpsStatus == UPS_STATUS_NO_ELECTOR)
  196. return 0;
  197. }
  198. }
  199. Sleep(10000);
  200. i++;
  201. if (i > 30)
  202. {
  203. Dbg("have try 5 minutes.");
  204. i = 0;
  205. }
  206. }
  207. return 1;
  208. }
  209. void CUpsFSM::SelfTest(EntityTestEnum eTestType,CSmartPointer<ITransactionContext> pTransactionContext)
  210. {
  211. pTransactionContext->SendAnswer(m_testResult);
  212. }