|  | @@ -110,6 +110,65 @@ class CTMenu(CBaseLog):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          return isOnTargetNode, targetText
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    '''
 | 
	
		
			
				|  |  | +    函数:退出 usb 信源界面;
 | 
	
		
			
				|  |  | +    参数:
 | 
	
		
			
				|  |  | +        opa     COptionAction对象;
 | 
	
		
			
				|  |  | +    返回:
 | 
	
		
			
				|  |  | +    '''
 | 
	
		
			
				|  |  | +    def __exitUsbSource(self, opa):
 | 
	
		
			
				|  |  | +        pass
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    '''
 | 
	
		
			
				|  |  | +    函数:移动到目标信源节点上。
 | 
	
		
			
				|  |  | +    参数:
 | 
	
		
			
				|  |  | +        opa                 COptionAction对象;
 | 
	
		
			
				|  |  | +        moveDirection       移动方向,True表示调用move_key[1](向下或向右), False表示调用move_key[0]。
 | 
	
		
			
				|  |  | +        maxTry              最大移动次数,防止死循环。
 | 
	
		
			
				|  |  | +    返回:Boolean是否在目标节点上, 文本或数值。
 | 
	
		
			
				|  |  | +    '''
 | 
	
		
			
				|  |  | +    def __move2SourceNode(self, opa, moveDirection, maxTry=15):
 | 
	
		
			
				|  |  | +        tryCount = 0
 | 
	
		
			
				|  |  | +        # 目标节点聚焦状态;
 | 
	
		
			
				|  |  | +        targetFocus = False
 | 
	
		
			
				|  |  | +        # 目标文本或数值;
 | 
	
		
			
				|  |  | +        targetText = None
 | 
	
		
			
				|  |  | +        # 移动到目标节点;
 | 
	
		
			
				|  |  | +        while True:
 | 
	
		
			
				|  |  | +            # 截图,截图完后马上进入信源;
 | 
	
		
			
				|  |  | +            pic = self.takePicture()
 | 
	
		
			
				|  |  | +            # 有些信源,需要手动enter
 | 
	
		
			
				|  |  | +            enterKey = opa.curOptionInfo['enter_key']
 | 
	
		
			
				|  |  | +            if enterKey != "default":
 | 
	
		
			
				|  |  | +                self.redRat3.sendKey(enterKey)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            # 判断是否移动成功;
 | 
	
		
			
				|  |  | +            targetFocus, targetText = opa.isOnTargetNode(pic)
 | 
	
		
			
				|  |  | +            if targetFocus is True:
 | 
	
		
			
				|  |  | +                self.info(u"===========到达目标信源节点===========")
 | 
	
		
			
				|  |  | +                break
 | 
	
		
			
				|  |  | +            # endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            # 如果是usb信源,特殊处理;
 | 
	
		
			
				|  |  | +            if 'usb' in targetText.lower():
 | 
	
		
			
				|  |  | +                self.__exitUsbSource(opa)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            # 因为信源界面消失了,需要再调用一次.
 | 
	
		
			
				|  |  | +            opa.callFirstOptionShortCutKey()
 | 
	
		
			
				|  |  | +            # 移动到下/上一节点;
 | 
	
		
			
				|  |  | +            if moveDirection:
 | 
	
		
			
				|  |  | +                opa.move2NextSiblingNode()
 | 
	
		
			
				|  |  | +            else:
 | 
	
		
			
				|  |  | +                opa.move2PrevSiblingNode()
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +            tryCount += 1
 | 
	
		
			
				|  |  | +            if tryCount > maxTry:
 | 
	
		
			
				|  |  | +                self.warn(u"已%s遍历超过%d次,仍未找到焦点" % ("正向" if moveDirection else "逆向", maxTry))
 | 
	
		
			
				|  |  | +                break
 | 
	
		
			
				|  |  | +        # end-while
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        return targetFocus, targetText
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      '''
 | 
	
		
			
				|  |  |      函数:聚焦到指定option中。
 | 
	
		
			
				|  |  |      参数:
 | 
	
	
		
			
				|  | @@ -125,7 +184,7 @@ class CTMenu(CBaseLog):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          # 首先,调用根菜单;
 | 
	
		
			
				|  |  |          opa.callFirstOptionShortCutKey()
 | 
	
		
			
				|  |  | -        time.sleep(1)
 | 
	
		
			
				|  |  | +        # time.sleep(1)
 | 
	
		
			
				|  |  |          if opa.isOnFirstOption() is False:
 | 
	
		
			
				|  |  |              self.error(u"未聚焦到根节点上,退出")
 | 
	
		
			
				|  |  |              self.__back2Home(opa)
 | 
	
	
		
			
				|  | @@ -265,6 +324,9 @@ class CTMenu(CBaseLog):
 | 
	
		
			
				|  |  |          optionName
 | 
	
		
			
				|  |  |          optionValue
 | 
	
		
			
				|  |  |      返回:
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    注意:如果optionValue是数值类型,将不会变更值。
 | 
	
		
			
				|  |  | +          如optionValue=10,实现该optionName的value是100,则不变更其值。
 | 
	
		
			
				|  |  |      '''
 | 
	
		
			
				|  |  |      def focusOptionValue(self, optionName, optionValue):
 | 
	
		
			
				|  |  |          self.info(u"【%s】【%s】" % (optionName, optionValue))
 | 
	
	
		
			
				|  | @@ -360,9 +422,11 @@ class CTMenu(CBaseLog):
 | 
	
		
			
				|  |  |          return True
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      '''
 | 
	
		
			
				|  |  | -    函数:
 | 
	
		
			
				|  |  | +    函数:检测输入的频道列表,是否都存在,返回不存在的频道列表。
 | 
	
		
			
				|  |  |      参数:
 | 
	
		
			
				|  |  | -    返回:
 | 
	
		
			
				|  |  | +        channelList         要检测的目标频道列表。
 | 
	
		
			
				|  |  | +    返回:Boolean, []
 | 
	
		
			
				|  |  | +        如果有频道没找到,返回False,并返回没找到的频道列表。如果全部找到返回True。
 | 
	
		
			
				|  |  |      '''
 | 
	
		
			
				|  |  |      def checkChannelList(self, channelList, maxTry=15):
 | 
	
		
			
				|  |  |          failChannelList = []
 | 
	
	
		
			
				|  | @@ -386,9 +450,12 @@ class CTMenu(CBaseLog):
 | 
	
		
			
				|  |  |          return checkResult, failChannelList
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      '''
 | 
	
		
			
				|  |  | -    函数:
 | 
	
		
			
				|  |  | +    函数:移动到黑屏的频道。
 | 
	
		
			
				|  |  |      参数:
 | 
	
		
			
				|  |  | -    返回:
 | 
	
		
			
				|  |  | +        channelCount           要查找多少次频道。
 | 
	
		
			
				|  |  | +        blackThreshold         黑屏阈值。
 | 
	
		
			
				|  |  | +        blackRate              黑屏比率。
 | 
	
		
			
				|  |  | +    返回:Boolean。找到返回True。
 | 
	
		
			
				|  |  |      '''
 | 
	
		
			
				|  |  |      def getBlackChannel(self, channelCount, blackThreshold=20, blackRate=2.0):
 | 
	
		
			
				|  |  |          result = False
 | 
	
	
		
			
				|  | @@ -411,6 +478,37 @@ class CTMenu(CBaseLog):
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          return result
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    '''
 | 
	
		
			
				|  |  | +    函数:设置信源。
 | 
	
		
			
				|  |  | +    参数:
 | 
	
		
			
				|  |  | +        optionName      目标信源;
 | 
	
		
			
				|  |  | +    返回:
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    注意:切换信源是特殊的情况处理:
 | 
	
		
			
				|  |  | +        1、信源菜单消失过快,会导致ocr识别完成后,菜单已消失。
 | 
	
		
			
				|  |  | +        2、usb信源下,可能会调用source按键失败,所以需要调用其他退出键(ok、exit、return)
 | 
	
		
			
				|  |  | +    '''
 | 
	
		
			
				|  |  | +    def setSourceValue(self, optionName):
 | 
	
		
			
				|  |  | +        self.info(u"【%s】" % optionName)
 | 
	
		
			
				|  |  | +        CTMenu.sourceInput.setPattern(11)
 | 
	
		
			
				|  |  | +        sourceList = self.__optionExcel.getOptionAllChildItemName(optionName)
 | 
	
		
			
				|  |  | +        opa = COptionAction(optionName, None, self.__optionConfig, self.__optionExcel)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        # 检测路径是否有效;
 | 
	
		
			
				|  |  | +        if not opa.checkRunOptionPath():
 | 
	
		
			
				|  |  | +            return False
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        # 首先,调用根菜单;
 | 
	
		
			
				|  |  | +        opa.callFirstOptionShortCutKey()
 | 
	
		
			
				|  |  | +        # 遍历到目标option中;
 | 
	
		
			
				|  |  | +        if self.__move2SourceNode(opa, True, sourceList.__len__()*1.5)[0] is False:
 | 
	
		
			
				|  |  | +            if self.__move2SourceNode(opa, False, sourceList.__len__()*1.5)[0] is False:
 | 
	
		
			
				|  |  | +                self.__back2Home(opa)
 | 
	
		
			
				|  |  | +                return False
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        self.info(u"成功进入指定信源:%s" % optionName)
 | 
	
		
			
				|  |  | +        return True
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  if __name__ == "__main__":
 | 
	
		
			
				|  |  |      ml = CTMenu()
 | 
	
	
		
			
				|  | @@ -567,9 +665,14 @@ if __name__ == "__main__":
 | 
	
		
			
				|  |  |          time.sleep(st)
 | 
	
		
			
				|  |  |          ml.getOptionValue('picture_preset')
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    ml.getBlackChannel(10)
 | 
	
		
			
				|  |  | -    if 1:
 | 
	
		
			
				|  |  | +    if 0:
 | 
	
		
			
				|  |  |          ml.openOption('picture')
 | 
	
		
			
				|  |  |          ml.moveToOption('brightness')
 | 
	
		
			
				|  |  |          ml.moveToOption('picture_reset')
 | 
	
		
			
				|  |  |          ml.moveToOption('picture_preset')
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    if 1:
 | 
	
		
			
				|  |  | +        # ml.setSourceValue('hdmi1')
 | 
	
		
			
				|  |  | +        ml.setSourceValue('hdmi2')
 | 
	
		
			
				|  |  | +        # ml.setSourceValue('dtv')
 | 
	
		
			
				|  |  | +        # ml.setSourceValue('av')
 |