|
@@ -8,6 +8,7 @@ from OptionAction import COptionAction
|
|
|
from ssat_sdk.source_input import SourceGenInput
|
|
|
from ssat_sdk.tv_detect import *
|
|
|
from ssat_sdk.device_manage.capturecard_manager import CCardManager
|
|
|
+from ssat_sdk.utils.string_util import strcmp
|
|
|
# 测试使用到
|
|
|
import random
|
|
|
|
|
@@ -28,6 +29,8 @@ class CTMenu(CBaseLog):
|
|
|
self.__exData = CExtraData()
|
|
|
self.__optionExcel = COptionExcel(self.__exData)
|
|
|
self.__optionConfig = COptionConfig(self.__exData, self.__optionExcel)
|
|
|
+ self.__curOpa = None
|
|
|
+ self.__lastOpa = None
|
|
|
|
|
|
@property
|
|
|
def exData(self):
|
|
@@ -41,6 +44,46 @@ class CTMenu(CBaseLog):
|
|
|
def optionConfig(self):
|
|
|
return self.__optionConfig
|
|
|
|
|
|
+ @property
|
|
|
+ def opa(self):
|
|
|
+ return self.__curOpa
|
|
|
+
|
|
|
+ @property
|
|
|
+ def pos(self):
|
|
|
+ return self.__curOpa.pos
|
|
|
+
|
|
|
+ def setOpa(self, opa):
|
|
|
+ self.__curOpa = opa
|
|
|
+
|
|
|
+ def setCurPos(self, pos):
|
|
|
+ self.__curOpa.setCurPos(pos)
|
|
|
+
|
|
|
+ '''
|
|
|
+ 函数:同步两个opa信息;
|
|
|
+ 参数:
|
|
|
+ 返回:
|
|
|
+ '''
|
|
|
+
|
|
|
+ def SyncOptionInfo(self):
|
|
|
+ if self.__lastOpa:
|
|
|
+ self.info(u"lastOpa.pos=%d" % self.__lastOpa.pos)
|
|
|
+ len = self.__lastOpa.pos - self.__curOpa.getPathLength()
|
|
|
+ # 前者位置大于当前opa长度;
|
|
|
+ if len > 0:
|
|
|
+ # 判断路径是否为子集关系;
|
|
|
+ if self.__lastOpa.isOptionInPaths(self.__lastOpa.getPathLength(), self.__curOpa.curOptionName) is True:
|
|
|
+ while len > 0:
|
|
|
+ len -= 1
|
|
|
+ self.__lastOpa.back2ParentNode()
|
|
|
+ # 同时设置当前opa位置;
|
|
|
+ self.__curOpa.setCurPos(self.__curOpa.getPathLength())
|
|
|
+ else:
|
|
|
+ # 判断路径是否为子集关系;
|
|
|
+ if self.__curOpa.isOptionInPaths(self.__lastOpa.pos, self.__lastOpa.curOptionName) is True:
|
|
|
+ self.__curOpa.setCurPos(self.__lastOpa.pos)
|
|
|
+ # 记录;
|
|
|
+ self.__lastOpa = self.__curOpa
|
|
|
+
|
|
|
def takePicture(self):
|
|
|
img = os.path.join(getSATTmpDIR(), "menutree_runpath.png")
|
|
|
self.captureCard.takePicture(img)
|
|
@@ -113,6 +156,12 @@ class CTMenu(CBaseLog):
|
|
|
|
|
|
return isOnTargetNode, targetText
|
|
|
|
|
|
+ def move2TargetNode(self, opa, moveDirection, maxTry=15):
|
|
|
+ return self.__move2TargetNode(opa, moveDirection, maxTry)
|
|
|
+
|
|
|
+ def back2Home(self):
|
|
|
+ return self.__back2Home(self.__curOpa)
|
|
|
+
|
|
|
'''
|
|
|
函数:退出 usb 信源界面;
|
|
|
参数:
|
|
@@ -177,7 +226,7 @@ class CTMenu(CBaseLog):
|
|
|
# 有些信源,需要手动enter
|
|
|
enterKey = opa.curOptionInfo['enter_key']
|
|
|
if enterKey != "default":
|
|
|
- self.redRat3.sendKey(enterKey)
|
|
|
+ opa.executeKey(enterKey)
|
|
|
|
|
|
# 判断是否移动成功;
|
|
|
targetFocus, targetText = opa.isOnTargetNode(pic)
|
|
@@ -195,7 +244,7 @@ class CTMenu(CBaseLog):
|
|
|
# 2次:移动到下/上一节点;
|
|
|
opa.move2NextSiblingNode() if moveDirection else opa.move2PrevSiblingNode()
|
|
|
opa.move2NextSiblingNode() if moveDirection else opa.move2PrevSiblingNode()
|
|
|
- self.redRat3.sendKey(enterKey, duration=2)
|
|
|
+ opa.executeKey(enterKey)
|
|
|
# 因为信源界面消失了,需要再调用一次.
|
|
|
opa.callFirstOptionShortCutKey()
|
|
|
continue
|
|
@@ -226,13 +275,15 @@ class CTMenu(CBaseLog):
|
|
|
self.__back2Home(opa)
|
|
|
return False
|
|
|
|
|
|
- # 首先,调用根菜单;
|
|
|
- opa.callFirstOptionShortCutKey()
|
|
|
- # time.sleep(1)
|
|
|
- if opa.isOnFirstOption() is False:
|
|
|
- self.error(u"未聚焦到根节点上,退出")
|
|
|
- self.__back2Home(opa)
|
|
|
- return False
|
|
|
+ # 只有从0层开始才需要调用根菜单;
|
|
|
+ if self.__curOpa.pos == 0:
|
|
|
+ # 首先,调用根菜单;
|
|
|
+ opa.callFirstOptionShortCutKey()
|
|
|
+ # time.sleep(1)
|
|
|
+ if opa.isOnFirstOption() is False:
|
|
|
+ self.error(u"未聚焦到根节点上,退出")
|
|
|
+ self.__back2Home(opa)
|
|
|
+ return False
|
|
|
|
|
|
# 遍历到目标option中;
|
|
|
if self.__move2TargetNode(opa, True)[0] is False:
|
|
@@ -294,24 +345,24 @@ class CTMenu(CBaseLog):
|
|
|
def setOptionValue(self, optionName, optionValue):
|
|
|
self.info(u"【%s】【%s】" % (optionName, optionValue))
|
|
|
CTMenu.sourceInput.setPattern(11)
|
|
|
- opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
|
|
|
+ self.__curOpa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
|
|
|
|
|
|
# 检测路径是否有效;
|
|
|
- if self.__openOption(opa) is False:
|
|
|
+ if self.__openOption(self.__curOpa) is False:
|
|
|
return False
|
|
|
|
|
|
# 遍历到value节点中;
|
|
|
- if self.__move2TargetNode(opa, True)[0] is False:
|
|
|
- if self.__move2TargetNode(opa, False)[0] is False:
|
|
|
- self.__back2Home(opa)
|
|
|
+ if self.__move2TargetNode(self.__curOpa, True)[0] is False:
|
|
|
+ if self.__move2TargetNode(self.__curOpa, False)[0] is False:
|
|
|
+ self.__back2Home(self.__curOpa)
|
|
|
return False
|
|
|
|
|
|
# 找到value节点,设置值;
|
|
|
self.info(u"设置value值:一般只适用于Number类型或Input类型,不适合选择类型。但都必须调用,因为里面有enterkey操作")
|
|
|
- opa.setOptionValue()
|
|
|
+ self.__curOpa.setOptionValue()
|
|
|
|
|
|
# 返回主页;
|
|
|
- self.__back2Home(opa)
|
|
|
+ self.__back2Home(self.__curOpa)
|
|
|
return True
|
|
|
|
|
|
'''
|
|
@@ -325,15 +376,14 @@ class CTMenu(CBaseLog):
|
|
|
def checkOptionValue(self, optionName, optionValue):
|
|
|
self.info(u"【%s】【%s】" % (optionName, optionValue))
|
|
|
CTMenu.sourceInput.setPattern(11)
|
|
|
- opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
|
|
|
-
|
|
|
+ self.__curOpa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
|
|
|
# 进入节点;
|
|
|
- if self.__openOption(opa) is False:
|
|
|
+ if self.__openOption(self.__curOpa) is False:
|
|
|
return False
|
|
|
|
|
|
isValueEqual = False
|
|
|
# 获取value节点值;
|
|
|
- valueFocus, valueText = opa.isOnTargetNode()
|
|
|
+ valueFocus, valueText = self.__curOpa.isOnTargetNode()
|
|
|
self.info(u"===当前捕获的文本内容=%s,目标文本=%s,状态:%d===" % (str(valueText), str(optionValue), valueFocus))
|
|
|
|
|
|
# 如果是数值,则判断获取的值是否相等;否则,只判断是否聚焦.
|
|
@@ -342,11 +392,8 @@ class CTMenu(CBaseLog):
|
|
|
else:
|
|
|
isValueEqual = valueFocus
|
|
|
|
|
|
- # 因为只是查看值,没有设置值,所以需要再手动返回一层。
|
|
|
- opa.back2ParentNode(False)
|
|
|
-
|
|
|
# 返回主页;
|
|
|
- self.__back2Home(opa)
|
|
|
+ self.__back2Home(self.__curOpa)
|
|
|
|
|
|
# 聚焦状态就是结果;
|
|
|
self.info(
|
|
@@ -363,15 +410,41 @@ class CTMenu(CBaseLog):
|
|
|
def openOption(self, optionName):
|
|
|
self.info(u"【%s】" % optionName)
|
|
|
CTMenu.sourceInput.setPattern(11)
|
|
|
- opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
|
|
|
+ self.__curOpa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
|
|
|
+
|
|
|
+ # 同步前后信息;
|
|
|
+ self.SyncOptionInfo()
|
|
|
|
|
|
- if self.__openOption(opa) is False:
|
|
|
+ if self.__openOption(self.__curOpa) is False:
|
|
|
return False
|
|
|
|
|
|
# 聚焦状态就是结果;
|
|
|
self.info(u"成功open指定option=%s" % optionName)
|
|
|
return True
|
|
|
|
|
|
+ '''
|
|
|
+ 函数:设置self.__curOpa的值;
|
|
|
+ 参数:
|
|
|
+ 返回:
|
|
|
+
|
|
|
+ 注意:一般在使用了openOption后,才调用该函数.且该函数不返回(不调用back2Home);
|
|
|
+ '''
|
|
|
+
|
|
|
+ def setValue(self, optionValue):
|
|
|
+ self.info(u"开始设置值:optionName=%s, optionValue=%s" % (self.__curOpa.curOptionName, str(optionValue)))
|
|
|
+ self.__curOpa.setValue(optionValue)
|
|
|
+ # 遍历到value节点中;
|
|
|
+ if self.__move2TargetNode(self.__curOpa, True)[0] is False:
|
|
|
+ if self.__move2TargetNode(self.__curOpa, False)[0] is False:
|
|
|
+ self.__back2Home(self.__curOpa)
|
|
|
+ return False
|
|
|
+
|
|
|
+ # 找到value节点,设置值;
|
|
|
+ self.info(u"设置value值:一般只适用于Number类型或Input类型,不适合选择类型。但都必须调用,因为里面有enterkey操作")
|
|
|
+ self.__curOpa.setOptionValue()
|
|
|
+
|
|
|
+ return True
|
|
|
+
|
|
|
'''
|
|
|
函数:聚焦到指定option的value上,不设置不打开不返回。
|
|
|
参数:
|
|
@@ -386,16 +459,16 @@ class CTMenu(CBaseLog):
|
|
|
def focusOptionValue(self, optionName, optionValue):
|
|
|
self.info(u"【%s】【%s】" % (optionName, optionValue))
|
|
|
CTMenu.sourceInput.setPattern(11)
|
|
|
- opa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
|
|
|
+ self.__curOpa = COptionAction(optionName, optionValue, self.__optionConfig, self.__optionExcel)
|
|
|
|
|
|
# 进入节点;
|
|
|
- if self.__openOption(opa) is False:
|
|
|
+ if self.__openOption(self.__curOpa) is False:
|
|
|
return False
|
|
|
|
|
|
# 遍历到value节点中;
|
|
|
- if self.__move2TargetNode(opa, True)[0] is False:
|
|
|
- if self.__move2TargetNode(opa, False)[0] is False:
|
|
|
- self.__back2Home(opa)
|
|
|
+ if self.__move2TargetNode(self.__curOpa, True)[0] is False:
|
|
|
+ if self.__move2TargetNode(self.__curOpa, False)[0] is False:
|
|
|
+ self.__back2Home(self.__curOpa)
|
|
|
return False
|
|
|
|
|
|
return True
|
|
@@ -410,21 +483,18 @@ class CTMenu(CBaseLog):
|
|
|
def getOptionValue(self, optionName):
|
|
|
self.info(u"【%s】" % optionName)
|
|
|
CTMenu.sourceInput.setPattern(11)
|
|
|
- opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
|
|
|
+ self.__curOpa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
|
|
|
|
|
|
# 检测路径是否有效;
|
|
|
- if self.__openOption(opa) is False:
|
|
|
+ if self.__openOption(self.__curOpa) is False:
|
|
|
return False, None
|
|
|
|
|
|
# 获取value节点值;
|
|
|
- valueFocus, valueText = opa.isOnTargetNode()
|
|
|
+ valueFocus, valueText = self.__curOpa.isOnTargetNode()
|
|
|
self.info(u"===当前捕获的文本内容=%s,聚焦状态:%d===" % (str(valueText), valueFocus))
|
|
|
|
|
|
- # 因为只是查看值,没有设置值,所以需要再手动返回一层。
|
|
|
- opa.back2ParentNode(False)
|
|
|
-
|
|
|
# 返回主页;
|
|
|
- self.__back2Home(opa)
|
|
|
+ self.__back2Home(self.__curOpa)
|
|
|
|
|
|
return valueFocus, valueText
|
|
|
|
|
@@ -437,9 +507,9 @@ class CTMenu(CBaseLog):
|
|
|
def focusOption(self, optionName):
|
|
|
self.info(u"【%s】" % optionName)
|
|
|
CTMenu.sourceInput.setPattern(11)
|
|
|
- opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
|
|
|
+ self.__curOpa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
|
|
|
|
|
|
- return self.__focusOption(opa)
|
|
|
+ return self.__focusOption(self.__curOpa)
|
|
|
|
|
|
'''
|
|
|
函数:
|
|
@@ -448,8 +518,8 @@ class CTMenu(CBaseLog):
|
|
|
'''
|
|
|
|
|
|
def inputUnlock(self, stdText, password=''):
|
|
|
- opa = COptionAction(None, None, self.__optionConfig, self.__optionExcel)
|
|
|
- return opa.inputUnlock(stdText, password)
|
|
|
+ self.__curOpa = COptionAction(None, None, self.__optionConfig, self.__optionExcel)
|
|
|
+ return self.__curOpa.inputUnlock(stdText, password)
|
|
|
|
|
|
'''
|
|
|
函数:当焦点已经在option层级上时,移动到指定的option上。
|
|
@@ -461,19 +531,19 @@ class CTMenu(CBaseLog):
|
|
|
'''
|
|
|
|
|
|
def moveToOption(self, optionName):
|
|
|
- opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
|
|
|
+ self.__curOpa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
|
|
|
# 已经在该层级上.
|
|
|
- opa.setCurPos(opa.getPathLength() - 1)
|
|
|
+ self.__curOpa.setCurPos(self.__curOpa.getPathLength() - 1)
|
|
|
|
|
|
# 检测路径是否有效;
|
|
|
- if opa.checkRunOptionPath() is False:
|
|
|
- self.__back2Home(opa)
|
|
|
+ if self.__curOpa.checkRunOptionPath() is False:
|
|
|
+ self.__back2Home(self.__curOpa)
|
|
|
return False
|
|
|
|
|
|
# 遍历到目标option中;
|
|
|
- if self.__move2TargetNode(opa, True)[0] is False:
|
|
|
- if self.__move2TargetNode(opa, False)[0] is False:
|
|
|
- self.__back2Home(opa)
|
|
|
+ if self.__move2TargetNode(self.__curOpa, True)[0] is False:
|
|
|
+ if self.__move2TargetNode(self.__curOpa, False)[0] is False:
|
|
|
+ self.__back2Home(self.__curOpa)
|
|
|
return False
|
|
|
|
|
|
self.info(u"已移动到目标节点[%s]" % optionName)
|
|
@@ -549,27 +619,48 @@ class CTMenu(CBaseLog):
|
|
|
2、usb信源下,可能会调用source按键失败,所以需要调用其他退出键(ok、exit、return)
|
|
|
'''
|
|
|
|
|
|
- def setSourceValue(self, optionName):
|
|
|
+ def setSourceValue(self, optionParent, optionName):
|
|
|
self.info(u"【%s】" % optionName)
|
|
|
CTMenu.sourceInput.setPattern(11)
|
|
|
sourceList = self.__optionExcel.getOptionAllSiblingItemTextList1d(optionName)
|
|
|
- opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
|
|
|
+ self.__curOpa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
|
|
|
|
|
|
# 检测路径是否有效;
|
|
|
- if not opa.checkRunOptionPath():
|
|
|
+ if not self.__curOpa.checkRunOptionPath():
|
|
|
return False
|
|
|
|
|
|
# 首先,调用根菜单;
|
|
|
- opa.callFirstOptionShortCutKey()
|
|
|
+ self.__curOpa.callFirstOptionShortCutKey()
|
|
|
# 遍历到目标option中;
|
|
|
- if self.__move2SourceNode(opa, True, sourceList.__len__() * 2)[0] is False:
|
|
|
- if self.__move2SourceNode(opa, False, sourceList.__len__() * 2)[0] is False:
|
|
|
- self.__back2Home(opa)
|
|
|
+ if self.__move2SourceNode(self.__curOpa, True, sourceList.__len__() * 2)[0] is False:
|
|
|
+ if self.__move2SourceNode(self.__curOpa, False, sourceList.__len__() * 2)[0] is False:
|
|
|
+ self.__back2Home(self.__curOpa)
|
|
|
return False
|
|
|
|
|
|
self.info(u"成功进入指定信源:%s" % optionName)
|
|
|
return True
|
|
|
|
|
|
+ '''
|
|
|
+ 函数:识别传入的option / optionValue,是否在当前页面中存在
|
|
|
+ 参数:
|
|
|
+ option:在value不传入的情况下,option为非value层的option名;
|
|
|
+ value:传入的情况下,option为value层的value_name,value则为value名
|
|
|
+ 返回:
|
|
|
+ boolean,是否识别到该option / optionValue
|
|
|
+ '''
|
|
|
+
|
|
|
+ def checkOptionExist(self, option, value=None):
|
|
|
+ self.__curOpa = COptionAction(option, value, self.optionConfig, self.optionExcel)
|
|
|
+ self.__curOpa.setCurPos(self.__curOpa.getPathLength())
|
|
|
+ return self.__curOpa.isOnTargetNode()[0]
|
|
|
+
|
|
|
+ '''
|
|
|
+ 调用当前opa的back2ParentNode()
|
|
|
+ '''
|
|
|
+
|
|
|
+ def back2parentNode(self):
|
|
|
+ return self.__curOpa.back2ParentNode()
|
|
|
+
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
ml = CTMenu()
|
|
@@ -587,6 +678,16 @@ if __name__ == "__main__":
|
|
|
time.sleep(st)
|
|
|
ml.setOptionValue('picture_preset', 'movie')
|
|
|
|
|
|
+ ml.openOption('picture_preset')
|
|
|
+ ml.setValue('movie')
|
|
|
+
|
|
|
+ print "--------------------------------------------------"
|
|
|
+
|
|
|
+ ml.openOption('brightness')
|
|
|
+ ml.setValue(90)
|
|
|
+
|
|
|
+ ml.back2Home()
|
|
|
+
|
|
|
if 0:
|
|
|
st = 5
|
|
|
value = random.randint(0, 100)
|
|
@@ -739,7 +840,7 @@ if __name__ == "__main__":
|
|
|
print u'------------------------------'
|
|
|
ml.setSourceValue('av')
|
|
|
|
|
|
- if 1:
|
|
|
+ if 0:
|
|
|
# ml.setOptionValue('auto_volume_control', 'off')
|
|
|
# ml.setOptionValue('lock', 'on')
|
|
|
ml.setSourceValue('dtv')
|