Estou com alguns problemas após a ultima atualização (Ginga-NCL C++ 0.12.3) e gostaria de saber se alguem pode me ajudar.
Notei que a chamada de um trecho de código imperativo utilizando o elemento "property" filho de um elemento "media" em um documento NCL não funciona mais como antes.
Consigo realizar a chamada de função apenas uma vez, nas outras tentativas aparentemente a condição do "link" não é satisfeita.
Não sei se o problema está no código imperativo (por exemplo, falta de controle da maquina de estado),
ou se o problema está na implementação do middleware.
Segue anexo o código da aplicação utilizada e o log, utilizei o Ginga-NCL Virtual Set-top Box.
Após apertar a tecla RED (F1) pela segunda vez o seguinte erro ocorre:
ExecutionObject::selectionEvent Can't select '-1/main/lua1/descritor1': isHandling = '1' isHandler = '1' isSleeping() = '1' isPaused() = '0'
Obrigado,
Lucas.
Autor: Lucas Modolo
88 comentários
<ncl id="main" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile"> <head>
<regionBase>
<region width="90%" height="90%" left="5%" top="5%" id="regiao1"/>
</regionBase> <descriptorBase>
<descriptor id="descritor1" region="regiao1" focusIndex="index1"/>
</descriptorBase> <connectorBase>
<causalConnector id="onSelectionSet">
<connectorParam name="keyCode"/>
<connectorParam name="valueSet"/>
<simpleCondition role="onSelection" key="$keyCode"/>
<simpleAction role="set" max="unbounded" qualifier="seq" value="$valueSet"/>
</causalConnector>
</connectorBase>
</head> <body>
<port id="porta1" component="lua1"/> <media id="lua1" src="main.lua" descriptor="descritor1">
<property name="funcao"/>
</media> <media id="nosettings" type="application/x-ginga-settings">
<property name="service.currentFocus" value="index1"/>
<property name="service.currentKeyMaster" value="lua1"/>
</media> <link id="link1" xconnector="onSelectionSet">
<bind component="lua1" role="onSelection">
<bindParam name="keyCode" value="RED"/>
</bind>
<bind component="lua1" interface="funcao" role="set">
<bindParam name="valueSet" value="teste_vermelho"/>
</bind>
</link> </body> </ncl>
print("funcao", val)
end function handler(evt) end event.register(handler)
Marcio Moreno
LinkTransitionTriggerCondition::eventStateChanged from object '-1/main/lua1/descritor1' transition = '1' FormatterCausalLink::conditionSatisfied(link1) starting action(s) FormatterScheduler::runAction event 'funcao_2' for '-1/main/lua1/descritor1' OVER PROPERTY
FormatterScheduler::runActionOverProperty over 'funcao_2' for '-1/main/lua1/descritor1' player '0x8520a00'
FormatterScheduler::runActionOverProperty call player set property
LuaPlayer::setScope 'funcao' type '11' begin '-1' end '-1
LuaPlayer::setCurrentScope 'funcao'
LuaPlayer::setPropertyValue set property 'funcao' = 'teste_vermelho' A partir da segunda vez que eu pressiono a tecla vermelha, com ou sem o currentKeyMaster, o seguinte erro ocorre: ExecutionObject::selectionEvent Can't select '-1/main/lua1/descritor1': isHandling = '1' isHandler = '0' isSleeping() = '1' isPaused() = '0' Agora fiquei com outra dúvida, pelo que você disse, o formatador não deveria receber a tecla vermelha quando o currentKeyMaster define o handler de teclas como o lua porém está recebendo. Obrigado, Lucas.
Note que o lua eh que controla quando acaba essa atribuicao, devendo controlar a maquina de estados dessa propriedade. Ou seja, um event.post de stop na propriedade resolve seu problema. Sds. Marcio Moreno
LinkTransitionTriggerCondition::eventStateChanged from object '-1/main/lua1/descritor1' transition = '1' FormatterCausalLink::conditionSatisfied(link_verde) starting action(s) FormatterScheduler::runAction event 'propriedade_2' for '-1/main/lua1/descritor1' OVER PROPERTY
FormatterScheduler::runActionOverProperty over 'propriedade_2' for '-1/main/lua1/descritor1' player '0x9935140'
FormatterScheduler::runActionOverProperty call player set property
LuaPlayer::setScope 'propriedade' type '11' begin '-1' end '-1
LuaPlayer::setCurrentScope 'propriedade'
LuaPlayer::setPropertyValue set property 'propriedade' = 'teste_verde'
ApplicationPlayerAdapter::updateStatus with code = '1' param = 'propriedade' and type = '11'
ApplicationPlayerAdapter::updateStatus call stopEvent 'propriedade' type '11'
'lua1_1'; anchor name = 'lua1' ExecutionObject::getEventFromAnchorId searching 'propriedade' for '-1/main/lua1/descritor1' with following events = 'lua1_0_GREEN'; anchor name = 'lua1' 'lua1_0_RED'; anchor name = 'lua1' 'lua1_1'; anchor name = 'lua1' 'propriedade_2'; ApplicationPlayerAdapter::stopEvent 'propriedade_2' considering anchor 'propriedade' Depois da primera tecla (verde ou vermelha) ser pressionada, tanto a tecla vermelha quanto a verde não satisfaz mais o link correspondente. ExecutionObject::selectionEvent Can't select '-1/main/lua1/descritor1': isHandling = '1' isHandler = '0' isSleeping() = '1' isPaused() = '0' Acompanhei a execução do ponto de vista da implementação e notei a seguinte situação: A função ExecutionObject::selectionEvent retorna da segunda vez pois ApplicationExecutionObject::isSleeping() = '1' já que currentEvent->getCurrentState() == EventUtil::ST_SLEEPING. Isso acontece porque na primeira vez que a tecla é pressionada o currentEvent de ApplicationExecutionObject é o evento setado por FormatterScheduler::runActionOverApplicationObject, após o link ser satisfeito a função FormatterScheduler::runActionOverProperty chama FormatterPlayerAdapter::setPropertyValue que seta o currentEvent de ApplicationExecutionObject para o AttributionEvent. Então na segunda vez que a tecla é pressionada o currentEvent não é mais o setado por FormatterScheduler::runActionOverApplicationObject e sim o evento setado por FormatterPlayerAdapter::setPropertyValue e esse evento está no estado EventUtil::ST_SLEEPING. O correto seria o currentEvent ser o evento setado por FormatterScheduler::runActionOverApplicationObject? Se sim, e se isso não for um problema na implementação do middleware, o que é necessário implementar na aplicação para que isso ocorra? Obrigado, Lucas. ---------- main.ncl ---------- <?xml version="1.0" encoding="ISO-8859-1"?>
<ncl id="main" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile"> <head>
<regionBase>
<region width="90%" height="90%" left="5%" top="5%" id="regiao1"/>
</regionBase> <descriptorBase>
<descriptor id="descritor1" region="regiao1" focusIndex="index1"/>
</descriptorBase> <connectorBase>
<causalConnector id="onSelectionSet">
<connectorParam name="keyCode"/>
<connectorParam name="valueSet"/>
<simpleCondition role="onSelection" key="$keyCode"/>
<simpleAction role="set" max="unbounded" qualifier="seq" value="$valueSet"/>
</causalConnector>
</connectorBase>
</head> <body>
<port id="porta1" component="lua1"/> <media id="lua1" src="main.lua" descriptor="descritor1">
<property name="propriedade"/>
</media> <media id="nosettings" type="application/x-ginga-settings">
<property name="service.currentFocus" value="index1"/>
</media> <link id="link_vermelho" xconnector="onSelectionSet">
<bind component="lua1" role="onSelection">
<bindParam name="keyCode" value="RED"/>
</bind>
<bind component="lua1" interface="propriedade" role="set">
<bindParam name="valueSet" value="teste_vermelho"/>
</bind>
</link>
<link id="link_verde" xconnector="onSelectionSet">
<bind component="lua1" role="onSelection">
<bindParam name="keyCode" value="GREEN"/>
</bind>
<bind component="lua1" interface="propriedade" role="set">
<bindParam name="valueSet" value="teste_verde"/>
</bind>
</link> </body> </ncl> ---------- main.lua ---------- local propriedade = ''
local dx, dy = canvas:attrSize() function desenha()
canvas:attrFont('vera', 20)
canvas:attrColor('black')
canvas:drawRect('fill', 0, 0, dx, dy) if propriedade == 'teste_vermelho' then
canvas:attrColor('red')
elseif propriedade == 'teste_verde' then
canvas:attrColor('green')
end
canvas:drawText(dx/4, dy/4, propriedade) canvas:flush()
end function handler(evt)
if evt.class == 'ncl' then
if evt.type == 'attribution' then
if evt.name == 'propriedade' then
if evt.action == 'start' then
propriedade = evt.value
evt.action = 'stop'
event.post(evt)
end
end
end
end desenha()
end event.register(handler)