NCL 3.0 – Programando em Múltiplos Dispositivos
O middleware em um sistema de Televisão Digital é a camada que provê suporte para o desenvolvimento de aplicações independentes de hardware e Sistema Operacional. Um dos requisitos essenciais a um middleware é prover o suporte para o desenvolvimento de aplicações para múltiplos dispositivos, ou seja, posso desenvolver uma aplicação que execute em minha TV Digital e em meu celular ao mesmo tempo, ou ainda melhor, posso controlar uma aplicação na TV usando meu celular ou outro dispositivo portátil, como um controle remoto.
O middleware Ginga através de seu subsistema Ginga-NCL provê este tipo de recurso. Vamos entender então como utilizamos o Ginga-NCL para desenvolver aplicações que executem em múltiplos dispositivos.
Para múltiplos dispositivos, podemos desenvolver aplicações que se cadastram em classes do tipo passiva e do tipoativa. Um dispositivo que se cadastra em uma classe do tipo passiva, ele é apenas capaz de exibir o objeto de mídia que lhe é passado (mapa de memória de vídeo ou amostras de áudio), ou seja, é apenas apresentado na tela do dispositivo o objeto de mídia relacionado, sem dar ao dispositivo o controle total da aplicação. Em uma classe ativa, o controle do dispositivo é passado para o objeto de mídia, permitindo ao usuário ter o controle absoluto da aplicação.
Na linguagem NCL 3.0, cada elemento <regionBase> pode estar associado a uma classe de dispositivos onde ocorrerá a apresentação. Portanto, se quisermos definir em qual dispositivo nossa aplicação irá executar, devemos identificar essa associação no elemento <regionBase>. Para fazer essa associação, devemos utilizar o atributo device, o qual pode conter as classes systemScreen(i) e systemAudio(i).
As classes systemScreen(1) ou systemAudio(1) são reservadas como classes passivas e as classessystemScreen(2) ou systemAudio(2) como classes ativas. Por default, se o atributo não for especificado, nenhuma classe é associada, e a execução da aplicação ocorre no dispositivo o qual executa o documento.
– Classe Passiva
Tomemos como exemplo o programa do Jô, exibido pela Rede Globo de Televisão. Jô Soares utiliza uma caneca durante o seu programa. Queremos que ao pegar a caneca para beber e a camêra focar o apresentador, apareça um ícone interativo na tela da TV em forma de caneca, informando ao usuário a existência de conteúdo interativo. Ao selecionar o ícone através de nossos celulares, a interatividade será carregada nos nossos dispositivos (celulares), interatividade a qual consiste em uma propaganda da caneca e um formulário para a compra da mesma. De forma passiva, o código em NCL ficaria assim:
…
<regionBase>
<region id=”rgProgramaJo” width=”100%” height=”100%” zIndex=”1″>
<region id=”rgIcone” top=”2%” left=”2%” width=”10%” height=”5%” zIndex=”2″/>
</region>
</regionBase>
<regionBase device=”systemScreen(1)”>
<region id=”rgFundo” width=”100%” height=”100%” zIndex=”1″>
<region id=”rgPropagandaCaneca” width=”80%” height=”100%” zIndex=”2″/>
<region id=”rgFormulario” right=”20%” width=”20%” height=”100%” zIndex=”2″/>
</region>
</regionBase>
…
Veja como é simples especificar que a minha aplicação será apresentada em múltiplas classes de dispositivos. Para isso, defini apenas um elemento (<regionBase device=”systemScreen(1)”>) para diferenciar a apresentação que será executada em múltiplos dispositivos, daquela que será apresentada na minha TV. Entretanto neste tipo de aplicação, devemos notar que se o ícone da caneca for selecionado, o vídeo da propaganda e o formulário de compra aparecerão em todos os dispositivos cadastrados como systemScreen(1). Para uma navegação independente em cada dispositivo, devemos adotar a próxima solução.
– Classe Ativa
Para um melhor controle de nossa aplicação, seria interessante criarmos um novo documento NCL (CelControle.ncl), o qual seria o responsável pelos níveis de interatividade em meu celular. Este novo objeto de mídia ao ser startado tomaria o controle dos dispositivos cadastrados na classe systemScreen(2).
Para que possamos passar o controle dos dispositivos para o novo objeto de mídia, devemos usar a variável globalservice.currentKeyMaster do elemento <media type=”application/x-ncl-settings”>. Para uso, devemos definí-la em um elemento <property>.
<media id=”variavelGlobal” type=”application/x-ncl-settings”>
<property name=”service.currentKeyMaster”/>
</media>
Para dar o controle de foco para o objeto de mídia CelControle.ncl, devemos usar o mesmo elo, o qual ele é iniciado (startado). A propaganda ao ser iniciada, a variável global usada por nós recebe o identificador do objeto CelControle.ncl, possibilitando então a navegação por teclas do aparelho de exibição.
…
<regionBase>
<region id=”rgPrograma” width=”100%” height=”100%” zIndex=”1″>
<region id=”rgIcone” top=”2%” left=”2%” width=”10%” height=”5%” zIndex=”2″/>
</region>
</regionBase>
<regionBase device=”systemScreen(2)”>
<region id=”CelControle” width=”100%” height=”100%” zIndex=”1″>
</regionBase>
…
<media id=”variavelGlobal” type=”application/x-ncl-settings”>
<property name=”service.currentKeyMaster”/>
</media>
…
<link id=”iniciaCelControle” xconnector=”onBeginSetStart”>
<bind role=”onBegin” component=”video”>
<bind role=”start” component=”CelControle”/>
<bind role=”set” component=”variavelGlobal” interface=”service.currentKeyMaster”>
<bindParam name=”var” value=”CelContole”/>
</bind>
</link>
…
Para conhecimento:
ABNT NBR 15606-5 - Ginga-NCL para receptores portáteis – Linguagem de aplicação XML para codificação de aplicações.
Programando em NCL 3.0 - Desenvolvimento de Aplicações para o Middleware Ginga
“A dúvida é o principio da sabedoria”
Aristóteles









