Ir para o conteúdo

 Voltar a Linguagem Lua
Tela cheia

Dúvida prática sobre atribuição de valores em eventos

7 de Outubro de 2009, 15:10 , por Desconhecido - | 1 Pessoa seguindo este artigo.
Visualizado 48 vezes

Olá, estou tendo uma dificuldade na conversa entre o ncl e lua. Resumidamente: estava fazendo uma aplicação que acessa a internet para buscar uma informação, e então surgiu a necessidade de criação de um passo intermediário onde fosse checado se há ou não conexão antes de tentar acessar o conteúdo em si. 

Na declaração da mídia lua que acessa o conteúdo na internet, defini uma propriedade chamada 'encerra'. O código lua, quando o usuário deseja sair, envia um valor qualquer ao evento 'encerra' que serve como sinal para dar 'stop' nesta mídia no ncl utilizando 'onEndAttribution'. Até aqui tudo bem, está funcionando legal.

 <media id="luaAcesso" type="application/x-ginga-NCLua" src="Acesso.lua" descriptor="descritorLuaAcesso" >    
        <property name="encerra" />
</media>

 <link xconnector="aoTerminarAtribuiçãoParar">
        <bind role="onEndAttribution" component="luaAcesso" interface="encerra"/>
        <bind component="luaAcesso" role="stop" />
 </link>

Na checagem de conexão que decidi fazer, estou utilizando um outro arquivo lua que apenas tenta conectar e, conseguindo ou não, envia uma determinada resposta. Devido a dúvidas sobre funcionamento, decidi inicialmente utilizar a mesma maneira que já deu certo na outra vez mas desta vez criei duas propriedades, porque há dois resultados diferentes possiveis: conectado ou não. Quando se está conectado, atribui-se um valor qualquer a 'encerra1' e quando não está, atribui-se o valor em 'encerra2'. Segue a idéia do codigo abaixo:

 <media id="luaTeste" type="application/x-ginga-NCLua" src="TesteConexao.lua" descriptor="descritorTeste" >
        <property name="encerra1" />
        <property name="encerra2" />
</media>

<link xconnector="aoTerminarAtribuiçãoIniciarParar">
        <bind role="onEndAttribution" component="testeConexao" interface="encerra1"/>

        <bind component="luaAcesso" role="start" />
        <bind component="imagemTentandoConectar" role="stop" />
        <bind component="testeConexao" role="stop" />
 </link>

 <link xconnector="aoTerminarAtribuiçãoIniciarParar">
        <bind role="onEndAttribution" component="testeConexao" interface="encerra2"/>

        <bind component="imagemNaoConectado" role="start" />
        <bind component="imagemTentandoConectar" role="stop" />
        <bind component="testeConexao" role="stop" />
 </link>

 Em 'luaTeste':

 event.register (
   function (evt)
      if evt.class == 'ncl' and evt.type == 'presentation'
           and evt.action == 'start' then

          a = checagem()
         
         if (a==0) then
             local evtEncerra = {
                        class = 'ncl',
                        type  = 'attribution',
                        name  = 'encerra2',
                        value = '1',
                        }
            evtEncerra.action = 'start'; event.post(evtEncerra)
            evtEncerra.action = 'stop'; event.post(evtEncerra)
          
           else
             local evtEncerra = {
                        class = 'ncl',
                        type  = 'attribution',
                        name = 'encerra1',
                        value = '1',
                        }
            evtEncerra.action = 'start'; event.post(evtEncerra)
            evtEncerra.action = 'stop'; event.post(evtEncerra)
        
           end
       end
   end
)

Desta vez as coisas não funcionaram como da outra vez. Nos logs, tenho a seguinte mensagem ao carregar o teste de conexão:

ProceduralPlayerAdapter::stopEvent event not found 'encerra2'

O mesmo acontece se cair em 'encerra1', e o mesmo ocorre se eu tiver só uma propriedade 'encerra' desta vez.

O fato é: não entendi muito bem o funcionamento das propriedades e eventos na comunicação entre as linguagens. Gostaria de entender o que está errado nesta abordagem e, se alguém enxergar uma maneira mais apropriada de resolver o problema e quiser contribuir, agradeço.

Autor: Maurício Perdomo


55 comentários

  • 49b94670a089dfa9aea15ed3e81e513c?only path=false&size=50&d=404Bruno Lima(usuário não autenticado)
    11 de Outubro de 2009, 18:04

     

    <media id="luaTeste" type="application/x-ginga-NCLua" src="TesteConexao.lua" descriptor="descritorTeste" >         <property name="encerra1" />         <property name="encerra2" /> </media>O id que você está usando é diferente do que está sendo redferenciado.

    • Bc582f621be35e20ce9375c37b8a645a?only path=false&size=50&d=404Maurício Perdomo(usuário não autenticado)
      13 de Outubro de 2009, 9:49

       

      Ok, valeu pelo toque! Mas o que acontece é que fui mudar os nomes das coisas para facilitar a compreensão de quem lesse o tópico e isto acabou passando. A id no meu código está correta. 'luaTeste' e 'testeConexao' são a mesma coisa.

      <media id="testeConexao" type="application/x-ginga-NCLua" src="TesteConexao.lua" descriptor="descritorTeste" >

      • 5df5d8eeb3770422cc9c42a466faee62?only path=false&size=50&d=404Roberto Azevedo(usuário não autenticado)
        13 de Outubro de 2009, 14:37

         

        Olá Maurício,

        dei uma olhada no seu código aqui. Aparentemente ele está correto, mas deve ter algum pequeno erro que nao consegui olhar. Ao invés disso, fiz um exemplo menor, baseado no que você passou, que está funcionando. Acho que vc pode usá-lo como base:

        main.ncl

         <?xml version="1.0" encoding="ISO-8859-1"?>
        <!-- Generated by NCL Eclipse -->
        <ncl id="main" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile">
            <head>
                <regionBase>
                    <region id="rgTeste"/>
                </regionBase>
                <descriptorBase>
                    <descriptor id="descriptorTeste" region="rgTeste"/>
                </descriptorBase>
                <connectorBase>
                    <causalConnector id="onEndAttributionStop">
                        <simpleCondition role="onEndAttribution"/>
                        <simpleAction role="stop"/>
                    </causalConnector>
                </connectorBase>
            </head>
            <body>
                <port id="pTeste" component="testeConexao"/>
                
                <media descriptor="descriptorTeste" id="testeConexao" src="testeConexao.lua" type="application/x-ginga-NCLua">
                    <property name="encerra1"/>
                    <property name="encerra2"/>
                    <property name="encerra"/>
                </media>
                <link xconnector="onEndAttributionStop">
                    <bind component="testeConexao" interface="encerra" role="onEndAttribution"/>
                    <bind component="testeConexao" role="stop"/>
                </link>
            </body>
        </ncl>  

        testeConexao.lua

        local evt = {
            class = 'ncl',
            type  = 'attribution',
            name  = 'encerra',
        }

        function tratador (e)
            if e.class == 'ncl' and e.type == 'presentation'
                and e.action == 'start' then
            
                evt.value= '1';
                evt.action = 'start'; event.post(evt)
                evt.action = 'stop'; event.post(evt)
                  
            end       
        end

        event.register (tratador)

        Eu tambem consegui reproduzir o seu erro:

        ProceduralPlayerAdapter::stopEvent event not found 'encerra2'

        Aparentemente isso ocorre quando você posta o evento de stop e nao tem nenhum elo para ser ativado. Teste modificar o elo do exemplo acima para (Sem modificar o lua):

        <link xconnector="onEndAttributionStop">
                    <bind component="testeConexao" interface="encerra1" role="onEndAttribution"/>
                    <bind component="testeConexao" role="stop"/>
        </link>

        Voce devera receber essa mensagem de erro! Isso me leva a crer que talvez o erro esteja no seu conector, mas nao tenho absoluta certeza disso!

        • 68952f8a0c7710618defc82ce2d33bb0?only path=false&size=50&d=404Aécio Costa(usuário não autenticado)
          17 de Junho de 2010, 14:16

           

          cara. estou obtendo o mesmo erro:

           

          ApplicationPlayerAdapter::stopEvent event not found 'inicia' in object

           

          estou tentando fazer com que a minha midia Lua Starte uma mídia NCL pré definida!

          • A687fdf6ce6756b24515f09e00e106ce?only path=false&size=50&d=404José Geraldo de Sousa Junior(usuário não autenticado)
            6 de Abril de 2011, 15:24

             

            Oi Aécio,

            Os eventos de atribuição do NCLua aparentemente estão funcionando corretamente. Esta mensagem de erro que você postou é transmitida quando a ação de stop na atribuição está sendo chamada em uma propriedade inexistente. O nome da propriedade no objeto de mídia NCLua está exatamente igual ao nome colocado no post do evento de atribuiçao do código NCLua?

Concurso ITU-T de Aplicações para IPTV 2012

13 de Agosto de 2012, 19:38, por Desconhecido

Gostaríamos de lembrar aos possíveis interessados que o prazo de registro para participação no Concurso ITU-T de Aplicações para IPTV 2012 (IPTV Application Challenge) se encerra nesta semana, dia 15 de agosto de 2012. Já o prazo para a submissão de aplicações se encerra no dia 07 de setembro de 2012.



NCL Eclipse 1.6 disponível

10 de Janeiro de 2012, 21:19, por Desconhecido

Caros membros da Comunidade Ginga,



Concursos de Aplicações Ginga-NCL

22 de Setembro de 2011, 3:22, por Desconhecido

    Gostaríamos de relembra-los de que há dois concursos de aplicações Ginga-NCL com inscrições ainda abertas. O convite é aberto a toda a comunidade de desenvolvedores de aplicações para o Middleware Ginga-NCL, em nível internacional. São os seguintes concursos:



Novas versões: Ginga e Ginga-NCL Virtual Set-top Box (v.0.12.3)

1 de Agosto de 2011, 20:58, por Desconhecido



Algumas Boas Notícias da Comunidade Ginga

28 de Julho de 2011, 21:31, por Desconhecido

Autor: Roberto Azevedo