Ir para o conteúdo

 Voltar a Linguagem NCL
Tela cheia

Ajuda chamada de um trecho de codigo imperativo

17 de Janeiro de 2012, 8:58 , por Desconhecido - | Ninguém seguindo este artigo por enquanto.
Visualizado 28 vezes
Pessoal,

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

  • 46ee4032deff13d23d380b6732b04a19?only path=false&size=50&d=404Lucas Modolo(usuário não autenticado)
    17 de Janeiro de 2012, 9:01

     

    <?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="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>

    • 46ee4032deff13d23d380b6732b04a19?only path=false&size=50&d=404Lucas Modolo(usuário não autenticado)
      17 de Janeiro de 2012, 9:02

       

      function funcao(val)
          print("funcao", val)
      end

      function handler(evt)

      end

      event.register(handler)

      • 6d8523ee8653cf0ab9ef0e1348918792?only path=false&size=50&d=404Marcio Moreno(usuário não autenticado)
        18 de Janeiro de 2012, 7:13

         

        Oi, Lucas!

         Voce estah definindo o handler de teclas como o lua (currentKeyMaster) e a tecla vermelha, quando pressionada, estah indo para esse objeto e nao para o formatador.

        Ou seja, para que o elo seja satisfeito, retire o currentKeyMaster do noh settings.

        Sds,
        Marcio Moreno

        • 46ee4032deff13d23d380b6732b04a19?only path=false&size=50&d=404Lucas Modolo(usuário não autenticado)
          18 de Janeiro de 2012, 8:39

           

          Olá Marcio, 

          Eu removi o currentKeyMaster do nó settings como sugerido e o problema continua a ocorrer.Vou detalhar melhor o problema.

          Com ou sem o currentKeyMaster o formatador recebe a tecla vermelha da primeira vez e o link é satisfeito, segue o log:

          LinkTransitionTriggerCondition::eventStateChanged from object '-1/main/lua1/descritor1' transition = '0'
          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.

          • 6d8523ee8653cf0ab9ef0e1348918792?only path=false&size=50&d=404Marcio Moreno(usuário não autenticado)
            18 de Janeiro de 2012, 9:43

             

            Oi, Lucas.

            Isso mesmo, se o lua eh o keyMaster, entao o botao vermelho nao serah interpretado pelo Formatador. O que pode estar acontecendo com sua NCL eh o que acontece com toda linguagem que trabalha com concorrencia. Nesse caso especifico, o documento eh iniciado, o noh settings eh interpretado enquanto o noh lua ainda nao estah ocorrendo. Para resolver isso, coloque um link onBegin lua set keymaster com um pequeno delay no set que tenho certeza que resolve. No entanto, vai criar outro problema para a logica da sua aplicacao, que eh nao receber mais o RED enquanto o lua for o keymaster.

            Vamos supor agora que nao existe tal coisa de keyMaster na sua aplicacao. Nesse caso, sempre que alguem pressionar o botao vermelho, uma atribuicao serah realizada nessa interface do lua. Essa interface eh passada para ocorrendo pelo Formatador, que disparou a atribuicao. Quando uma nova atribuicao eh disparada pelo botao vermelho, o formatador testa o estado da propriedade e verifica que nao deve ser feito nada ali.
            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

            • 46ee4032deff13d23d380b6732b04a19?only path=false&size=50&d=404Lucas Modolo(usuário não autenticado)
              18 de Janeiro de 2012, 15:28

               

              Olá Marcio,

              Refiz os testes agora com o elemento "property" mapeado para um atributo do código imperativo e não mais para um trecho de código. O controle da maquina de estado também foi realizado.

              Novamente, da primeira vez que aperto a tecla vermelha ou verde, o link correspondente é satisfeito.

              LinkTransitionTriggerCondition::eventStateChanged from object '-1/main/lua1/descritor1' transition = '0'
              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)

              • 145ea1662b45b86a90b987f094279123?only path=false&size=50&d=404Guilherme Lima(usuário não autenticado)
                20 de Janeiro de 2012, 11:40

                 

                De fato eh um bug. Esperamos corrigilo antes do lancamento da proxima versao (provavelmente na proxima semana). Obrigado pelo relato.

                • 6d8523ee8653cf0ab9ef0e1348918792?only path=false&size=50&d=404Marcio Moreno(usuário não autenticado)
                  20 de Janeiro de 2012, 11:57

                   

                  Apenas para complementar a informacao do Guilherme: o bug jah foi corrigido. No entanto, estava especificado no nosso roadmap o lancamento da versao 0.12.4 para hoje.

                  Provavelmente vamos atrasar esse lancamento para inserir esse bug fix e percorrer novamente toda a nossa linha de testes.

                  Lucas, sao feedbacks como o seu que a comunidade precisa. Esse tipo de post contribui muito para a evolucao da implementacao de referencia. Continue assim! Obrigado!

                  Sds. Marcio Moreno

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