CameraOccupySysVar.hpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. /***********************************//**
  2. * @file CameraOccupySysVar.hpp
  3. * @author Gifur
  4. * @email guifaliao@gmail.com
  5. * @version 1.0.0.0
  6. * @date 2021-06-21
  7. * @copyright China Merchants Bank Co.,Ltd All rights reserved
  8. *
  9. * @brief
  10. * @details
  11. **************************************/
  12. #include "SpBase.h"
  13. #define CMAERA_OCCUPY_SPLIT_MASK '$'
  14. #define CMAERA_OCCUPY_SPLIT_MASK_STR "$"
  15. struct OccpyCameraStruct
  16. {
  17. CSimpleStringA strCameraName;
  18. CSimpleStringA strOccupier;
  19. OccpyCameraStruct():strCameraName(true),strOccupier(true) {
  20. }
  21. OccpyCameraStruct(const char* camera, const char* occpuier)
  22. :strCameraName(camera),strOccupier(occpuier) {
  23. }
  24. OccpyCameraStruct(const OccpyCameraStruct& rhs)
  25. :strCameraName(rhs.strCameraName),strOccupier(rhs.strOccupier) {
  26. }
  27. OccpyCameraStruct(const char* value):strCameraName(true),strOccupier(true) {
  28. CSimpleStringA strValue(value);
  29. if(!strValue.IsNullOrEmpty()) {
  30. FromSysVarString(strValue);
  31. }
  32. }
  33. bool operator==(const OccpyCameraStruct& rhs)
  34. {
  35. return (strCameraName == rhs.strCameraName && strOccupier == rhs.strOccupier);
  36. }
  37. bool Match(const OccpyCameraStruct& rhs) {
  38. if(strCameraName == rhs.strCameraName && strOccupier == rhs.strOccupier)
  39. return true;
  40. if(rhs.strCameraName.Compare("*") == 0 && rhs.strOccupier.Compare("*") == 0)
  41. return true;
  42. if(rhs.strCameraName.Compare("*") == 0 && strOccupier == rhs.strOccupier)
  43. return true;
  44. if(rhs.strOccupier.Compare("*") == 0 && strCameraName == rhs.strCameraName)
  45. return true;
  46. return false;
  47. }
  48. bool IsValid() {
  49. return (!strCameraName.IsNullOrEmpty() && !strOccupier.IsNullOrEmpty());
  50. }
  51. bool IsValid() const {
  52. return (!strCameraName.IsNullOrEmpty() && !strOccupier.IsNullOrEmpty());
  53. }
  54. CSimpleStringA toSysVarString() const {
  55. CSimpleStringA result(strCameraName);
  56. result.Append("=");
  57. result.Append(strOccupier);
  58. return result;
  59. }
  60. bool FromSysVarString(CSimpleStringA& value) {
  61. CAutoArray<CSimpleStringA> infos = value.Split('=');
  62. if(infos.GetCount() != 2) {return false;}
  63. strCameraName = infos[0];
  64. strOccupier = infos[1];
  65. return true;
  66. }
  67. };
  68. /*!
  69. * @brief 实时获取当前被占用的摄像头的名称和对应的实体
  70. * @param[in] pFunc 框架接口,inFilter 过滤器,通过实体名称或者摄像头名称对要获取的内容进行过滤
  71. * @param[out] outOccupiedCamres 数组类型
  72. * @return :
  73. */
  74. static inline ErrorCodeEnum GetOccupiedCameres(CAutoArray<OccpyCameraStruct>& outOccupiedCamres,
  75. CSmartPointer<IEntityFunction> pFunc,
  76. const OccpyCameraStruct* inFilter = NULL)
  77. {
  78. CSimpleStringA devicList;
  79. ErrorCodeEnum result = pFunc->GetSysVar("CameraOccupyingStatus", devicList);
  80. outOccupiedCamres.Clear();
  81. if(result == Error_Succeed && !devicList.IsNullOrEmpty()) {
  82. CSimpleStringA newValue;
  83. bool needToReplace = false;
  84. CAutoArray<CSimpleStringA> devItems = devicList.Split(CMAERA_OCCUPY_SPLIT_MASK);
  85. if(devItems.GetCount() > 0) {
  86. int counts = devItems.GetCount();
  87. if(inFilter != NULL) {
  88. counts = 0;
  89. for(int i=0; i<devItems.GetCount(); ++i) {
  90. OccpyCameraStruct item(devItems[i]);
  91. if(item.Match(*inFilter)) {
  92. counts++;
  93. }
  94. }
  95. }
  96. if(counts > 0) {
  97. outOccupiedCamres.Init(counts);
  98. int j=0;
  99. for(int i=0; i<devItems.GetCount(); ++i) {
  100. /*{deviceName1}={EntityName1}${deviceName2}={EntityName2}*/
  101. OccpyCameraStruct item(devItems[i]);
  102. if(inFilter == NULL || item.Match(*inFilter)) {
  103. outOccupiedCamres[j++] = item;
  104. }
  105. }
  106. }
  107. }
  108. }
  109. return result;
  110. }
  111. /*!
  112. * @brief 添加到指定摄像头信息到系统变量
  113. * @param[in] newItem,新插入的摄像头名称和实体名称,见 OccpyCameraStruct
  114. * @return :
  115. * 如果摄像头和所占用的实体名称完全吻合,返回 Error_AlreadyExist
  116. * 如果摄像头已在但实体名称是其他实体,则返回 Error_Duplication
  117. * 成功添加返回 Error_Succeed
  118. */
  119. static inline ErrorCodeEnum AppendOccpuiedCamera(
  120. const OccpyCameraStruct& newItem, CSmartPointer<IEntityFunction> pFunc)
  121. {
  122. CAutoArray<OccpyCameraStruct> existedList;
  123. ErrorCodeEnum result = GetOccupiedCameres(existedList, pFunc);
  124. CSimpleStringA newValue;
  125. if(existedList.GetCount() > 0) {
  126. for (int i=0; i<existedList.GetCount(); ++i)
  127. {
  128. OccpyCameraStruct& item = existedList[i];
  129. if(item == newItem) {
  130. result = Error_AlreadyExist;
  131. break;
  132. } else if(newItem.strCameraName == item.strCameraName) {
  133. result = Error_Duplication;
  134. break;
  135. }
  136. if(!newValue.IsNullOrEmpty()) newValue.Append(CMAERA_OCCUPY_SPLIT_MASK_STR);
  137. newValue.Append(item.toSysVarString());
  138. }
  139. }
  140. if(result == Error_Succeed) {
  141. if(!newValue.IsNullOrEmpty()) newValue.Append(CMAERA_OCCUPY_SPLIT_MASK_STR);
  142. newValue.Append(newItem.toSysVarString());
  143. result = pFunc->SetSysVar("CameraOccupyingStatus", newValue);
  144. }
  145. return result;
  146. }
  147. /*!
  148. * @brief 从系统变量中移除占用摄像头信息
  149. * @param[in] existedItem 需要移除的摄像头和实体信息,支持将存储值为*,意为忽略此项的比较
  150. */
  151. static inline void RemoveOccpuiedCamera(const OccpyCameraStruct& existedItem, CSmartPointer<IEntityFunction> pFunc)
  152. {
  153. if(!existedItem.IsValid() || pFunc == NULL)
  154. return;
  155. CAutoArray<OccpyCameraStruct> existedList;
  156. ErrorCodeEnum result = GetOccupiedCameres(existedList, pFunc);
  157. bool needToUpdate = false;
  158. CSimpleStringA newValue(true);
  159. if(existedList.GetCount() > 0) {
  160. for (int i=0; i<existedList.GetCount(); ++i)
  161. {
  162. OccpyCameraStruct& item = existedList[i];
  163. if(item.Match(existedItem)) {
  164. needToUpdate = true;
  165. continue;
  166. }
  167. if(!newValue.IsNullOrEmpty()) newValue.Append(CMAERA_OCCUPY_SPLIT_MASK_STR);
  168. newValue.Append(item.toSysVarString());
  169. }
  170. }
  171. if(needToUpdate) {
  172. result = pFunc->SetSysVar("CameraOccupyingStatus", newValue);
  173. }
  174. return;
  175. }
  176. static inline ErrorCodeEnum GetCameraOccpuiedStatus(CEntityBase *pEntity,
  177. const char* lpsczDevName, CSimpleStringA& owner)
  178. {
  179. OccpyCameraStruct filter(lpsczDevName, "*");
  180. CAutoArray<OccpyCameraStruct> existedList;
  181. owner.Clear();
  182. ErrorCodeEnum result = GetOccupiedCameres(existedList, pEntity->GetFunction(), &filter);
  183. if(existedList.GetCount() == 0) {
  184. result = Error_NotExist;
  185. }
  186. else if(existedList.GetCount() == 1) {
  187. owner = existedList[0].strOccupier;
  188. } else if(existedList.GetCount() > 0){
  189. result = Error_Duplication;
  190. }
  191. return result;
  192. }
  193. /*实体启动时调用一次,防止上次异常退出没有处理残留信息,导致出现摄像头被占用的假象*/
  194. static void ResetOwnCameraOccupiedStatus(CEntityBase* pEntity)
  195. {
  196. OccpyCameraStruct item("*", pEntity->GetEntityName());
  197. RemoveOccpuiedCamera(item, pEntity->GetFunction());
  198. }
  199. /*标明摄像头lpcszDevName被当前实体占用*/
  200. static inline ErrorCodeEnum SetCameraOccpuied(const char* lpcszDevName, CEntityBase* pEntity)
  201. {
  202. CSimpleStringA strTest(lpcszDevName);
  203. if(lpcszDevName == NULL || strTest.IsNullOrEmpty()
  204. || strTest[0] == '*'
  205. || -1 != strTest.IndexOf(CMAERA_OCCUPY_SPLIT_MASK_STR) || -1 != strTest.IndexOf("=")) {
  206. return Error_Param;
  207. }
  208. OccpyCameraStruct item(lpcszDevName, pEntity->GetEntityName());
  209. ErrorCodeEnum result = AppendOccpuiedCamera(item, pEntity->GetFunction());
  210. if(result == Error_AlreadyExist)
  211. result = Error_Succeed;
  212. return result;
  213. }
  214. /*取消摄像头lpcszDevName被当前实体占用的标识*/
  215. static inline void SetCameraUnoccpuied(const char* lpcszDevName, CEntityBase* pEntity)
  216. {
  217. if(lpcszDevName == NULL || strlen(lpcszDevName) == 0) {
  218. return;
  219. }
  220. OccpyCameraStruct item(lpcszDevName, pEntity->GetEntityName());
  221. RemoveOccpuiedCamera(item, pEntity->GetFunction());
  222. }
  223. /*!
  224. * @brief 通过系统变量判断摄像头是否在被其他实体占用
  225. * @param[in] inOutCameraInfo.strCameraName 摄像头名称
  226. * @param[out] inOutCameraInfo.strOccupier 占用该摄像头的实体名称
  227. * @return : true: 被其他实体占用且该实体处于正常状态,不包括被当前实体占用
  228. */
  229. static bool IsCameraOccupiedByOther(const char* lpcszDevName, CEntityBase* pEntity)
  230. {
  231. OccpyCameraStruct filter(lpcszDevName, "*");
  232. CAutoArray<OccpyCameraStruct> existedList;
  233. ErrorCodeEnum result = GetOccupiedCameres(existedList, pEntity->GetFunction(), &filter);
  234. if(existedList.GetCount() > 0) {
  235. for(int i=0; i<existedList.GetCount(); ++i) {
  236. if(existedList[i].strOccupier.Compare(pEntity->GetEntityName()) != 0) {
  237. CEntityRunInfo info;
  238. result = pEntity->GetFunction()->GetEntityRunInfo(existedList[i].strOccupier, info);
  239. if(result == Error_Succeed
  240. && (info.eState == EntityState_Idle || info.eState == EntityState_Busy
  241. || info.eState == EntityState_Pause
  242. || info.eState == EntityState_UnLoading)) {
  243. return true;
  244. }
  245. }
  246. }
  247. }
  248. return false;
  249. }
  250. #ifdef TWINKLE_LOCAL_DEBUG
  251. /*测试案例*/
  252. static int UniTest(CEntityBase* pEntity)
  253. {
  254. OccpyCameraStruct camera0("*", "*");
  255. OccpyCameraStruct camera("FirstCamera", pEntity->GetEntityName());
  256. OccpyCameraStruct camera2("SecondCamera", "GUIConsole");
  257. OccpyCameraStruct camera3("SecondCamera", pEntity->GetEntityName());
  258. OccpyCameraStruct camera4("ThirdCamera", pEntity->GetEntityName());
  259. OccpyCameraStruct camera5("*", pEntity->GetEntityName());
  260. ResetOwnCameraOccupiedStatus(pEntity);
  261. //RemoveOccpuiedCamera(camera0, pEntity->GetFunction());
  262. CAutoArray<OccpyCameraStruct> existedList;
  263. ErrorCodeEnum result = GetOccupiedCameres(existedList, pEntity->GetFunction());
  264. if(result != Error_Succeed) {
  265. return __LINE__;
  266. }
  267. if(existedList.GetCount() != 0) {
  268. return __LINE__;
  269. }
  270. result = AppendOccpuiedCamera(camera, pEntity->GetFunction());
  271. if(result != Error_Succeed) {
  272. return __LINE__;
  273. }
  274. if(IsCameraOccupiedByOther("FirstCamera", pEntity)) {
  275. return __LINE__;
  276. }
  277. if(IsCameraOccupiedByOther("SecondCamera", pEntity)) {
  278. return __LINE__;
  279. }
  280. result = AppendOccpuiedCamera(camera, pEntity->GetFunction());
  281. if(result != Error_AlreadyExist) {
  282. return __LINE__;
  283. }
  284. result = AppendOccpuiedCamera(camera2, pEntity->GetFunction());
  285. if(result != Error_Succeed) {
  286. return __LINE__;
  287. }
  288. if(!IsCameraOccupiedByOther("SecondCamera", pEntity)) {
  289. return __LINE__;
  290. }
  291. result = AppendOccpuiedCamera(camera3, pEntity->GetFunction());
  292. if(result != Error_Duplication) {
  293. return __LINE__;
  294. }
  295. result = GetOccupiedCameres(existedList, pEntity->GetFunction());
  296. if(result != Error_Succeed) {
  297. return __LINE__;
  298. }
  299. if(existedList.GetCount() != 2) {
  300. return __LINE__;
  301. }
  302. result = GetOccupiedCameres(existedList, pEntity->GetFunction(), &camera);
  303. if(existedList.GetCount() != 1) {
  304. return __LINE__;
  305. }
  306. if(!(existedList[0] == camera)) {
  307. return __LINE__;
  308. }
  309. result = AppendOccpuiedCamera(camera4, pEntity->GetFunction());
  310. if(result != Error_Succeed) {
  311. return __LINE__;
  312. }
  313. result = GetOccupiedCameres(existedList, pEntity->GetFunction(), &camera5);
  314. if(existedList.GetCount() != 2) {
  315. return __LINE__;
  316. }
  317. result = GetOccupiedCameres(existedList, pEntity->GetFunction());
  318. if(result != Error_Succeed) {
  319. return __LINE__;
  320. }
  321. if(existedList.GetCount() != 3) {
  322. return __LINE__;
  323. }
  324. RemoveOccpuiedCamera(camera5, pEntity->GetFunction());
  325. result = GetOccupiedCameres(existedList, pEntity->GetFunction());
  326. if(result != Error_Succeed) {
  327. return __LINE__;
  328. }
  329. if(existedList.GetCount() != 1) {
  330. return __LINE__;
  331. }
  332. if(!(existedList[0] == camera2)) {
  333. return __LINE__;
  334. }
  335. RemoveOccpuiedCamera(camera2, pEntity->GetFunction());
  336. if(result != Error_Succeed) {
  337. return __LINE__;
  338. }
  339. //RemoveOccpuiedCamera(camera0, pEntity->GetFunction());
  340. AppendOccpuiedCamera(camera, pEntity->GetFunction());
  341. AppendOccpuiedCamera(camera3, pEntity->GetFunction());
  342. return 0;
  343. }
  344. #endif //TWINKLE_LOCAL_DEBUG