logic.py 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248
  1. # -*- coding:utf-8 -*-
  2. import os, time
  3. from BaseLog import CBaseLog
  4. from ExtraData import CExtraData
  5. from OptionExcel import COptionExcel
  6. from OptionConfig import COptionConfig
  7. from OptionFocus import COptionFocus
  8. from OptionOCR import COptionOCR
  9. from OptionAction import COptionAction
  10. from ssat_sdk.source_input import SourceGenInput
  11. # 测试使用到
  12. import random
  13. class CMenuLogic(CBaseLog):
  14. sourceInput = SourceGenInput()
  15. def __init__(self):
  16. CBaseLog.__init__(self)
  17. self.__exData = CExtraData()
  18. self.__optionExcel = COptionExcel(self.__exData)
  19. self.__optionConfig = COptionConfig(self.__exData, self.__optionExcel)
  20. '''
  21. 函数:判断两值(for_ocr与ocr识别结果)是否相等;
  22. 参数:
  23. srcValue 源值,excel表格中读取的value值。
  24. tagValue 目标值,ocr识别的结果值。
  25. 返回:相同返回True。
  26. '''
  27. def __isValueEqual(self, srcValue, tagValue):
  28. self.info(u"源值=%s, 目标值=%s" % (str(srcValue), str(tagValue)))
  29. '''
  30. 函数:移动到目标节点上(路径节点和value节点)
  31. 参数:
  32. opa COptionAction对象;
  33. moveDirection 移动方向,True表示调用move_key[1](向下或向右), False表示调用move_key[0]。
  34. maxTry 最大移动次数,防止死循环。
  35. 返回:Boolean是否在目标节点上, 文本或数值。
  36. '''
  37. def __move2TargetNode(self, opa, moveDirection, maxTry=15):
  38. tryCount = 0
  39. # 是否到目标结点了;
  40. isOnTargetNode = False
  41. # 目标节点聚焦状态;
  42. targetFocus = False
  43. # 目标文本或数值;
  44. targetText = None
  45. # 移动到目标节点;
  46. while True:
  47. # 判断是否移动成功;
  48. targetFocus, targetText = opa.isOnTargetNode()
  49. if targetFocus is True:
  50. # 如果已在目标结点,退出循环;
  51. if opa.isOnTargetOption() or opa.isOnValueSheet():
  52. self.info(u"<到达目标路径节点或value节点>")
  53. isOnTargetNode = True
  54. break
  55. # 未到目标,进入下一节点;
  56. self.info(u"<进入下一节点>")
  57. opa.enterNode()
  58. continue
  59. # endif
  60. # 移动到下/上一节点;
  61. if moveDirection:
  62. opa.move2NextSiblingNode()
  63. else:
  64. opa.move2PrevSiblingNode()
  65. tryCount += 1
  66. if tryCount > maxTry:
  67. self.warn(u"已%s遍历超过%d次,仍未找到焦点" % ("正向" if moveDirection else "逆向", maxTry))
  68. break
  69. # end-while
  70. return isOnTargetNode, targetText
  71. '''
  72. 函数:返回到主页(不一定就是Home页,一般指返回运行前的那个画面)
  73. 参数:
  74. opa COptionAction对象;
  75. 返回:
  76. '''
  77. def __back2Home(self, opa):
  78. self.info(u"返回主页")
  79. while opa.pos > 0:
  80. opa.back2ParentNode()
  81. self.info(u"【如果设置value时,会自动回退到上一层父节点,此处操作正常。否则要多返回一层。】")
  82. '''
  83. 函数:设置指定的option的值为optionValue。
  84. 参数:
  85. optionName 要设置的option;
  86. optionValue option要设置的值;
  87. 返回: Boolean。
  88. '''
  89. def setOptionValue(self, optionName, optionValue):
  90. self.info(u"【%s】【%s】" % (optionName, optionValue))
  91. CMenuLogic.sourceInput.setPattern(11)
  92. opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
  93. # 检测路径是否有效;
  94. if opa.checkRunOptionPath() is False:
  95. self.__back2Home(opa)
  96. return False
  97. # 首先,调用根菜单;
  98. opa.callFirstOptionShortCutKey()
  99. time.sleep(1)
  100. if opa.isOnFirstOption() is False:
  101. self.error(u"未聚焦到根节点上,退出")
  102. self.__back2Home(opa)
  103. return False
  104. # 遍历到目标option中;
  105. if self.__move2TargetNode(opa, True)[0] is False:
  106. if self.__move2TargetNode(opa, False)[0] is False:
  107. self.__back2Home(opa)
  108. return False
  109. # 到达目标option后,进入value表;
  110. self.info(u"进入value表")
  111. opa.enterNode()
  112. # 遍历到value节点中;
  113. if self.__move2TargetNode(opa, True)[0] is False:
  114. if self.__move2TargetNode(opa, False)[0] is False:
  115. self.__back2Home(opa)
  116. return False
  117. # 找到value节点,设置值;
  118. self.info(u"设置value值:一般只适用于Number类型或Input类型,不适合选择类型。但都必须调用,因为里面有enterkey操作")
  119. opa.setOptionValue()
  120. # 返回主页;
  121. self.__back2Home(opa)
  122. '''
  123. 函数:移动到目标option后,读取该option的value值,与optionValue进行比较,相等表示检测值与目标值一致;
  124. 参数:
  125. optionName 要设置的option;
  126. optionValue option要设置的值;
  127. 返回: Boolean。
  128. '''
  129. def checkOptionValue(self, optionName, optionValue):
  130. self.info(u"【%s】【%s】" % (optionName, optionValue))
  131. CMenuLogic.sourceInput.setPattern(11)
  132. opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
  133. # 检测路径是否有效;
  134. if opa.checkRunOptionPath() is False:
  135. self.__back2Home(opa)
  136. return False
  137. # 首先,调用根菜单;
  138. opa.callFirstOptionShortCutKey()
  139. time.sleep(1)
  140. if opa.isOnFirstOption() is False:
  141. self.error(u"未聚焦到根节点上,退出")
  142. self.__back2Home(opa)
  143. return False
  144. # 遍历到目标option中;
  145. if self.__move2TargetNode(opa, True)[0] is False:
  146. if self.__move2TargetNode(opa, False)[0] is False:
  147. self.__back2Home(opa)
  148. return False
  149. # 到达目标option后,进入value表;
  150. self.info(u"进入value表")
  151. opa.enterNode()
  152. isValueEqual = False
  153. # 获取value节点值;
  154. valueFocus, valueText = opa.isOnTargetNode()
  155. self.info(u"===当前捕获的文本内容=%s,目标文本=%s,状态:%d===" % (str(valueText), str(optionValue), valueFocus))
  156. # 如果是数值,则判断获取的值是否相等;否则,只判断是否聚焦.
  157. if type(optionValue) == int or type(optionValue) == float:
  158. isValueEqual = True if float(optionValue) == float(valueText) else False
  159. else:
  160. isValueEqual = valueFocus
  161. # 因为只是查看值,没有设置值,所以需要再手动返回一层。
  162. opa.back2ParentNode(False)
  163. # 返回主页;
  164. self.__back2Home(opa)
  165. # 聚焦状态就是结果;
  166. self.info(u"checkOptionValue结果:optionValue=%s, ocrValue=%s, 结果=%d" % (str(optionValue), str(valueText), isValueEqual))
  167. return isValueEqual
  168. if __name__ == "__main__":
  169. ml = CMenuLogic()
  170. if 0:
  171. ml.setOptionValue('picture_preset', 'personal')
  172. time.sleep(2)
  173. ml.setOptionValue('picture_preset', 'dynamic')
  174. time.sleep(2)
  175. ml.setOptionValue('picture_preset', 'stadium')
  176. time.sleep(2)
  177. ml.setOptionValue('picture_preset', 'standard')
  178. time.sleep(2)
  179. ml.setOptionValue('picture_preset', 'natural')
  180. time.sleep(2)
  181. ml.setOptionValue('picture_preset', 'movie')
  182. if 1:
  183. value = random.randint(0, 100)
  184. ml.setOptionValue('backlight', value)
  185. time.sleep(8)
  186. ml.checkOptionValue('backlight', value + 10)
  187. time.sleep(8)
  188. ml.checkOptionValue('backlight', value)
  189. time.sleep(8)
  190. ml.checkOptionValue('backlight', value+20)
  191. # time.sleep(2)
  192. # ml.setOptionValue('brightness', value)
  193. # time.sleep(2)
  194. # ml.setOptionValue('contrast', value)
  195. # time.sleep(2)
  196. # ml.setOptionValue('saturation', value)
  197. # time.sleep(2)
  198. # ml.setOptionValue('tint', value)
  199. # time.sleep(2)
  200. # ml.setOptionValue('sharpness', value)
  201. if 0:
  202. ml.setOptionValue('picture_preset', 'stadium')
  203. time.sleep(5)
  204. print "personal", ml.checkOptionValue('picture_preset', 'personal')
  205. time.sleep(8)
  206. print "dynamic", ml.checkOptionValue('picture_preset', 'dynamic')
  207. time.sleep(8)
  208. print "stadium", ml.checkOptionValue('picture_preset', 'stadium')
  209. time.sleep(8)
  210. print "standard", ml.checkOptionValue('picture_preset', 'standard')
  211. time.sleep(8)
  212. print "natural", ml.checkOptionValue('picture_preset', 'natural')
  213. time.sleep(8)
  214. print "movie", ml.checkOptionValue('picture_preset', 'movie')