Desenvolvimento de
Aplicações para TV Digital em
Ginga-NCL
Carlos de Salles Soares Neto
JIM 2010 – Jornada de Informática do Maranhão
Agenda
• Ambiente declarativo Ginga-NCL
– ~ 90 minutos
• Linguagem Lua
– ~ 90 minutos
• Aplicações NCLua
– ~ 60 minutos
JIM 2010 – Jornada de Informática do Maranhão
Ambiente Declarativo Ginga-NCL
JIM 2010 – Jornada de Informática do Maranhão
Arquitetura Básica do
Middleware Ginga
Sistema Operacional
Ginga – Núcleo Comum
JVM
Ginga – Serviços Específicos
Ponte
Máquina de Apresentação
(Ginga-NCL)
Máquina de Execução
(Ginga-J)
JIM 2010 – Jornada de Informática do Maranhão
Paradigmas de Programação
• Declarativo



ex: NCL, HTML, SQL
“o que fazer”
linguagens de domínio específico
• Imperativo



ex: Lua, C++, Java
“como fazer” (algoritmo)
relação direta com a CPU
JIM 2010 – Jornada de Informática do Maranhão
Paradigma Imperativo
• valor
• variável
• expressão
• função
• comando
JIM 2010 – Jornada de Informática do Maranhão
Como definir um documento
hipermídia? “Quero tocar...”
o quê? nós
onde? regiões
como? descritores
quando? elos e conectores
JIM 2010 – Jornada de Informática do Maranhão
7
O quê? Nós
áudio
vídeo
imagem
JIM 2010 – Jornada de Informática do Maranhão
8
Onde? Regiões
rgVideo1
JIM 2010 – Jornada de Informática do Maranhão
9
Como? Descritores
dVideo1
JIM 2010 – Jornada de Informática do Maranhão
10
video1
dVideo1
rgVideo1
JIM 2010 – Jornada de Informática do Maranhão
11
Quando? Elos e conectores
video1
audio1
Quando video1
terminar, inicia audio1
Quando audio1 iniciar,
inicia imagem1
elo
imagem1
JIM 2010 – Jornada de Informática do Maranhão
12
Quando? Elos e conectores
video1
C
onEnd
A
Start
audio1
C
Quando video1
terminar, inicia audio1
Quando audio1 iniciar,
inicia imagem1
elo
onBeginS
tart
A
conector
C
papel de condição
A
papel de ação
imagem1
JIM 2010 – Jornada de Informática do Maranhão
13
Estrutura: contextos
body
ctx1
audio1
video1
abertura
imagem1
JIM 2010 – Jornada de Informática do Maranhão
14
Como acessar uma mídia num contexto?
(Como entrar/sair de um contexto?)
ctx1
pVideo1
O vídeo video1 do
contexto ctx1 é
acessível através
da porta pVideo1
video1
audio1
imagem1
JIM 2010 – Jornada de Informática do Maranhão
15
Visões de um documento –
Estrutural
• portas, nós e elos
lBeginVideo1StartTitulo1
(onBeginStart )
pInicio
video1
body
titulo1
lEndVideo 1StopTitulo1
(onEndStop)
JIM 2010 – Jornada de Informática do Maranhão
16
Visões de um documento –
Leiaute
• posicionamento e dimensões iniciais dos
objetos de mídia
rgTV: 0, 0 (100 % x 100 %)
rgTitulo 1: 25%,5%( 50%x15%)
rgVideo 1:
25%, 25%( 50%x50%)
JIM 2010 – Jornada de Informática do Maranhão
17
Visões de um documento –
Temporal
• objetos de mídia dispostos no tempo
pInicio
rgVideo1
video 1
onBeginStart
onEndStop
rgTitulo1
titulo1
JIM 2010 – Jornada de Informática do Maranhão
18
Visões de um documento –
Espacial
• retratos do documento em certos instantes
de tempo
1
2
3
video 1 @
rgVideo 1
video 1 @ rgVideo 1
video 1 @ rgVideo 1
imagem 1 @
rgImagem 1
JIM 2010 – Jornada de Informática do Maranhão
19
Ferramenta de autoria
Composer
JIM 2010 – Jornada de Informática do Maranhão
20
Ferramenta de autoria Composer
• Visão Estrutural
pVideo1
ctx1
video1
audio1
imagem1
JIM 2010 – Jornada de Informática do Maranhão
21
Estrutura de um documento NCL –
Perfil TV digital
<?xml version="1.0" encoding="ISO-8859-1"?>
<ncl id="exemplo01"
xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile">
<head>
</head>
<body>
cabeçalho do documento
1
corpo do documento
2
</body>
</ncl>
JIM 2010 – Jornada de Informática do Maranhão
22
<head>
<regionBase>
...
</regionBase>
cabeçalho
regiões - onde
<descriptorBase>
...
</descriptorBase>
<connectorBase>
...
</connectorBase>
d1
d2
d3
descritores - como
conectores - quando
</head>
<body>
corpo
<port id="pInicio" component="video1" />
<!-- contextos e nós de mídia --> contextos e mídias – o quê
<!-- elos -->
1
E
onEnd
S
Start
onEnd
E
E
Start
onEnd
Start
S
S
2
audio1
video1
imagem1
elos - quando
</body>
JIM 2010 – Jornada de Informática do Maranhão
23
Meu primeiro documento
hipermídia
• reprodução de um vídeo simples
– sem elos de sincronismo
– sem elos de interatividade
exemplo01.ncl
JIM 2010 – Jornada de Informática do Maranhão
24
Meu primeiro documento hipermídia
• reprodução de um vídeo simples
– sem elos de sincronismo
– sem elos de interatividade
body
pInicio
video1
dVideo1
rgVideo1
JIM 2010 – Jornada de Informática do Maranhão
25
Planejando um documento NCL
• visões
– estrutural
– de leiaute
– temporal
JIM 2010 – Jornada de Informática do Maranhão
26
Exemplo 1 – Visão estrutural
pInicio
video1
body
JIM 2010 – Jornada de Informática do Maranhão
27
Exemplo 1 – Visão de leiaute
rgTV: 0, 0 (100%x100%)
rgVideo1:
25%,25% (50% x 50%)
JIM 2010 – Jornada de Informática do Maranhão
28
Exemplo 1 – Visão temporal
video01
JIM 2010 – Jornada de Informática do Maranhão
29
Construindo um documento NCL
<?xml ...?>
<ncl ...>
cabeçalho
</regionBase>
<descriptorBase>
d1
d2
d3
audio1
video1
imagem1
E
onEnd
S
Start
onEnd
E
E
</connectorBase>
</head>
2
<body>
<head>
<regionBase>
</descriptorBase>
<connectorBase>
corpo
1
Start
onEnd
Start
S
S
</body>
</ncl>
JIM 2010 – Jornada de Informática do Maranhão
30
Sobre o atributo id
• Todo elemento NCL deve possuir um
identificador único em todo o documento
(independente do seu tipo)
• O id deve começar sempre por uma letra
• Isto é inválido:

– <region id=“video1” .../> ( … )
– <media id=“video1” ... />

– <region id=“rgVideo1” .../> ( ... )
• Isto é válido:
– <media id=“video1” ... />
JIM 2010 – Jornada de Informática do Maranhão
31
Como definir um documento
hipermídia?
o quê
“tocar”?
nós
quando? elos e conectores
onde? regiões
como? descritores
JIM 2010 – Jornada de Informática do Maranhão
32
Exemplo 1 – região
<regionBase>
<region id="rgVideo1" left="25%" top=“25%" width=“50%"
height=“50%" />
</regionBase>
25%
25%
rgVideo1
(50% x 50%)
JIM 2010 – Jornada de Informática do Maranhão
33
Regiões
(onde?)
25%
<head>
25%
regiaoFundo
...
<regionBase>
<!-- regiões da tela onde as mídias
regiaoCentro
(50% x 50%)
são apresentadas -->
<region id=“regiaoFundo”>
<region id=“regiaoCentro”
left=“25%” top=“25%” width=“50%”
height=“50%” />
</region>
</regionBase>
...
</head>
JIM 2010 – Jornada de Informática do Maranhão
35
Regiões: Posição e dimensão
• posição (relativa à região-pai):
– left, top
– right, bottom
rgPai
top
• dimensões
– width, height
rgFilho
• unidades
height
– pixel (default), %
left
right
width
bottom
JIM 2010 – Jornada de Informática do Maranhão
36
Regiões: Sobreposição
• zIndex
– quanto maior, mais no topo
– quando não é definido assume o valor default 0 (zero)
zIndex = 1
zIndex = 2
zIndex = 3
JIM 2010 – Jornada de Informática do Maranhão
37
Como definir um documento
hipermídia?
o quê
“tocar”?
nós
quando? elos e conectores
onde? regiões 
como? descritores
JIM 2010 – Jornada de Informática do Maranhão
d1
d2
d3
38
Exemplo 1 – descritor
<descriptorBase>
<descriptor id="dVideo1" region="rgVideo1" />
</descriptorBase>
dVideo1
rgVideo1
JIM 2010 – Jornada de Informática do Maranhão
39
Descritores
(como?)
• Definem:
– como um nó vai ser inicialmente apresentado
• e.g. volume de áudio (soundLevel),
borda de uma mídia de texto (border)
– em que região o nó será apresentado
JIM 2010 – Jornada de Informática do Maranhão
40
Descritores
(como?)
<head>
...
<descriptorBase>
<!--descritores que definem como as mídias são apresentadas->
<descriptor id=“dImagem1” region=“rgImagem1” />
<descriptor id="dVideo1" region="rgVideo1">
<descriptorParam name="soundLevel"
value=“70%" />
</descriptor>
</descriptorBase>
...
</head>
JIM 2010 – Jornada de Informática do Maranhão
41
Descritores: atributos
• id
• region
– onde?
• explicitDur
– formato: 9.9s
• freeze
– true/false
• player
– e.g. sintetizador de voz; texto simples; texto
formatado
JIM 2010 – Jornada de Informática do Maranhão
42
Descritores: parâmetros
• parâmetros que são usados pelo exibidor
da mídia
• definidos pelo elemento descriptorParam
dentro de um descriptor
• formato:
<descriptorParam
name="nome_do_parametro"
value="valor_do_parametro" />
JIM 2010 – Jornada de Informática do Maranhão
43
Descritores: parâmetros
• left, top, width, height, bottom, right
– mesma definição das regiões: esquerda, topo, altura,
largura, margem inferior, margem direita
• location
– par de valores para left e top, separados por vírgula
• valores absolutos: “300,300” (em pixels)
• valores relativos à região pai: “10%,35%”
• size
– par de valores para width e height
• bounds
– quatro valores para left, top, width e height
JIM 2010 – Jornada de Informática do Maranhão
44
Descritores: parâmetros
• background
– cor de fundo (ex.: white, black etc)
• visible
– “true” para visível e “false” para não-visível
• transparency
– valor real entre 0 e 1 ou inteiro entre 0 e 100%, onde:
• 0 é totalmente opaco
• 0.5 é 50% transparente
• 1 é totalmente transparente
• fit
– define opções de preenchimento da região da mídia
JIM 2010 – Jornada de Informática do Maranhão
45
Descritores: parâmetros
• scroll
– “none”, “horizontal”, “vertical”, “both”, “automatic”
• style
– localizador de um stylesheet
• soundLevel: volume de som
– número real no intervalo de 0 a 1 (ou de 0 a 100%)
• 0 para mudo
• 0.5 ou 50% para metade do volume
• 1 ou 100% para volume original
• balanceLevel, trebleLevel e bassLevel
– número real no intervalo de 0 a 1 (ou de 0 a 100%)
JIM 2010 – Jornada de Informática do Maranhão
48
Como definir um documento
body
hipermídia?
o quê? nós
video1
quando? elos e conectores
onde? regiões 
como? descritores 
JIM 2010 – Jornada de Informática do Maranhão
49
Exemplo 1 – nó de mídia
<body>
...
<media id="video1" src="media/video1.mpg”
descriptor="dVideo1“ />
</body>
video1
dVideo1
JIM 2010 – Jornada de Informática do Maranhão
50
O quê?
Nós de mídia (ou conteúdo)
• definem um objeto de
mídia a ser
apresentado
• vídeo, áudio, texto,
imagem, nclet, lua,
settings
<media id="video1"
type="video/mpeg"
src="media/video1.mpg"
descriptor="dVideo1“ />
video1
dVideo1
<media ...>
video1
JIM 2010 – Jornada de Informática do Maranhão
51
•
Nós de mídia – atributos
id
– Identificador único do nó
•
type
– vídeo, áudio, texto, imagem, settings, nclet, lua
•
src
– caminho para o arquivo de mídia
• relativo ao diretório do arquivo NCL
• absoluto, através de URI
•
descriptor
– id do descritor que controla a apresentação deste objeto de mídia
•
refer
– referência a outro nó previamente definido (re-uso)
<media id=“video1” type=“video/mpeg”
src=“http://server.com/media/v1a35aZ97.mpg”
descriptor=“dVideo1” />
<media id=“btVolta” refer=“btAzul” />
JIM 2010 – Jornada de Informática do Maranhão
52
Tipos de nós de mídia
Tipo de mídia
Extensão
Tipo de mídia
Extensão
text/html
htm, html
audio/ac3
text/plain
txt
audio/mp3
mp3
text/css
css
audio/mp2
mp2
text/xml
xml
audio/mpeg
mpeg, mpg
image/bmp
bmp
audio/mpeg4
mp4, mpg4
image/png
png
video/mpeg
mpeg, mpg
image/gif
gif
application/x-ginga-NCLua
lua
image/jpeg
jpg, jpeg
application/x-ginga-NCLet
xlt, xlet, class
image/mpeg
audio/basic
application/x-ginga-settings sem arquivo
wav
application/x-ginga-time
JIM 2010 – Jornada de Informática do Maranhão
sem arquivo
53
Exemplo 1 – contexto body e porta
<body>
<port id="pInicio" component="video1“ />
...
</body>
body
pInicio
video1
JIM 2010 – Jornada de Informática do Maranhão
54
Nós de contexto
<body id=“doc01”>
• estruturam o documento
• compostos de nós de
contexto, mídia e/ou
escolha (switch)
<context...>
<context id=“quizz01”> ... </context>
doc01
quizz01
• a seção body também
representa um contexto
<body...>
JIM 2010 – Jornada de Informática do Maranhão
55
Nós de contexto – atributos
• atributos
– id, refer
• todo nó de contexto precisa definir uma ou mais
portas (port) para acesso externo
• o elemento body de um documento NCL é um nó de
contexto
body
pInicio
video1
JIM 2010 – Jornada de Informática do Maranhão
56
Porta
• define os acessos aos componentes de um
contexto
• formato:
pInicio
– <port id=“id_da_porta”
component=“id_do_componente_mapeado“
interface=“interface_do_componente" />
body
video1
• ponto de interface
– uma porta de um outro contexto ou
– uma âncora de um nó de conteúdo
• exemplos:
– <port id="pInicio1" component="video1" />
– <port id=“pInicio3” component=“video1” interface=“aCena2” />
– <port id=“pInicio2” component=“ctxCapitulo1” interface=“pSecao3 />
JIM 2010 – Jornada de Informática do Maranhão
57
Exemplo 1 – Código NCL
<?xml version="1.0" encoding="ISO-8859-1"?>
<ncl id="exemplo01" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile">
<head>
<regionBase>
<region id="rgTV">
<region id="rgVideo1" left="25%" top="25%" width="50%" height="50%" />
</region>
</regionBase>
<descriptorBase>
<descriptor id="dVideo1" region="rgVideo1" />
</descriptorBase>
</head>
<body>
<port id="pInicio" component="video1“ />
<media id="video1" src="media/video1.mpg" descriptor="dVideo1“ />
</body>
</ncl>
JIM 2010 – Jornada de Informática do Maranhão
58
Exemplo 1 – Dúvidas?
visão temporal
pInicio
pInicio
rgVideo1
video 1
video1
body
visão espacial
rgTV: 0, 0 (100%x100%)
rgVideo1:
25%,25% (50% x 50%)
JIM 2010 – Jornada de Informática do Maranhão
video 1 @ rgVideo1
59
Exemplo 2 – Sincronizando dois
objetos de mídia (vídeo e texto)
• exemplo02.ncl
JIM 2010 – Jornada de Informática do Maranhão
60
Exemplo 2 – Sincronizando dois
objetos de mídia (vídeo e texto)
• Quando o vídeo começar, exibe o título
• Quando o vídeo terminar, esconde o título
JIM 2010 – Jornada de Informática do Maranhão
61
Exemplo 2 – Sincronizando dois
objetos de mídia (vídeo e texto)
lBeginVideo1StartTitulo1
(onBeginStart )
pInicio
video1
body
titulo1
lEndVideo 1StopTitulo1
(onEndStop)
JIM 2010 – Jornada de Informática do Maranhão
62
Exemplo 2 – Sincronizando dois objetos de
mídia (vídeo e texto)
pInicio
rgVideo1
video 1
onBeginStart
onEndStop
rgTitulo1
titulo 1
elos de sincronism o:
conectores
onBeginStart e
onEndStop
titulo 1 @ rgTitulo1
video1 @ rgVideo1
JIM 2010 – Jornada de Informática do Maranhão
63
Exemplo 2 – Mudanças nas regiões
<region id=“regiaoFundo”>
pInicio left=“25%” top=“5%” width=“50%”
<region id=“rgTitulo1”
height=“15%” /> rgTitulo1
titulo1
<region id=“rgVideo1” left=“25%” top=“25%” width=“50%”
height=“50%” />
onBegin1StartN
onEnd1StopN
</region>
rgVideo1
video 1
elos de sincronism o:
conectores
onBegin1StartN e
onEnd1StopN
visão temporal
visão espacial
titulo 1 @ rgTitulo1
video 1 @ rgVideo1
JIM 2010 – Jornada de Informática do Maranhão
64
Exemplo 2 – Mudanças nos
<descriptorBase>
descritores
<descriptor id="dVideo1" region="rgVideo1" />
•<descriptor
acrescentar
descritor
id=“dTitulo1” region=“rgTitulo1” />
• acrescentar mídia do título
</descriptorBase>
dTitulo1
rgTitulo1
JIM 2010 – Jornada de Informática do Maranhão
65
Exemplo 2 – Acrescentando
mídia
<body>
...
<media id="video1" src="media/video1.mpg"
descriptor="dVideo1“ />
<media id=“titulo1” src=“media/titulo1.png” descriptor=“dTitulo1” />
</body>
titulo1
dTitulo1
JIM 2010 – Jornada de Informática do Maranhão
66
Como definir um documento
hipermídia?
o quê
“tocar”?
nós 
quando? elos e conectores
E
onEnd
S
Start
onEnd
E
E
Start
onEnd
Start
onde? regiões 
como? descritores 
JIM 2010 – Jornada de Informática do Maranhão
67
S
S
Relacionamento entre os nós
video1
?
titulo1
JIM 2010 – Jornada de Informática do Maranhão
68
Conector onBeginStart
...inicia também a
exibição do titulo1
video1
titulo1
Quando
iniciar a
exibição do
video1
JIM 2010 – Jornada de Informática do Maranhão
69
Conector onBeginStart
video1
...inicia também a
exibição do objeto
de mídia mapeado
no papel start.
conector
onBegin
bind
C
onBeginStart
start
A
bind
titulo1
Quando iniciar a
exibição do objeto
de mídia mapeado
no papel onBegin...
JIM 2010 – Jornada de Informática do Maranhão
70
Elo lVideo1Titulo1Start: Iniciando um texto
junto com o vídeo
<link
id=“lVideo1Titulo1Start”xconnector=“connectors#onBeginStart”>
<bind component=“video1” role=“onBegin”>
<bind component=“titulo1” role=“start”>
</link>
video1
conector
onBegin
bind
C
onBeginStart
start
A
bind
titulo1
JIM 2010 – Jornada de Informática do Maranhão
71
Relacionamento entre os nós
video1
onBeginStart
?
titulo1
JIM 2010 – Jornada de Informática do Maranhão
72
Elo lVideo1Titulo1Stop: Terminando o texto
junto com o vídeo
<link id=“lVideo1Titulo1Stop” xconnector=“connectors#onEndStop”>
<bind component=“video1” role=“onEnd”>
<bind component=“titulo1” role=“stop”>
</link>
video1
conector
onEnd
bind
C
onEndStop
stop
A
bind
titulo1
JIM 2010 – Jornada de Informática do Maranhão
73
Relacionamento entre os nós
onBeginStart
video1
onEndStop
titulo1
JIM 2010 – Jornada de Informática do Maranhão
74
Bases de Conectores
<connectorBase>
<importBase alias=“connectors”
documentURI=“conectores.conn" />
</connectorBase>
onBegin
C
conector
conector
onBeginStart
onEndStop
start
A
onEnd
C
JIM 2010 – Jornada de Informática do Maranhão
stop
A
75
Elos
na seção head
<connectorBase>
<importBase alias=“alias_base” documentURI="connectorBase.conn" />
</connectorBase>
<link id=“id_elo” xconnector=“alias_base#id_conector”>
na seção body
<bind component=“id_c1” role=“papel_1”/>
...
conector
<bind component=“id_cn” role=“papel_n”/>
id_c1
bind
id_conector
papel_1
C
papel_2
A
...
</link>
A
JIM 2010 – Jornada de Informática
bind
id_c2
• Aplicações em Ginga-NCL paraATV Digital
do• Maranhão
papel_n
76
Elos
<connectorBase>
<importBase alias=“alias_base”
documentURI="connectorBase.ncl" />
</connectorBase>
<link id=“id_elo” xconnector=“alias_base#id_conector”>
<bind component=“id_c1” role=“papel_1”/>
...
<bind component=“id_cn” role=“papel_n”/>
id_c1
bind
id_conector
papel_1
C
papel_2
A
...
</link>
conector
A
JIM 2010 – Jornada de Informática
bind
id_c2
• Aplicações em Ginga-NCL paraATV Digital
do• Maranhão
papel_n
77
xconnector pode ser
•id_conector (mesmo documento)
•alias_base#id_conector (base é importada)
Elos
<connectorBase>
<importBase alias=“alias_base” documentURI=“exemplo02.conn" />
</connectorBase>
<link id=“id_elo” xconnector=“alias_base#id_conector”>
<bind component=“id_c1” role=“papel_1”/>
...
<bind component=“id_cn” role=“papel_n”/>
id_c1
bind
id_conector
papel_1
C
papel_2
A
...
</link>
conector
A
JIM 2010 – Jornada de Informática
bind
id_c2
• Aplicações em Ginga-NCL paraATV Digital
do• Maranhão
papel_n
78
Elos e conectores
(quando?)
• elo (link)
– associa nós através de conectores
Legenda :
N1
M1 (R3)
N3
Ci
M1 (R1)
nó de contexto
porta (ponto de
interface)
Con1
M1(R2)
C1
Ni
nó de mídia ou
conteúdo
âncora ou atributo
mapeamento Mi
(papel Ri)
N2
Coni
conector
papel de cada nó
relacionado
JIM 2010 – Jornada de Informática do Maranhão
79
Que eventos podemos utilizar nos
conectores?
stop |
abort
paused
start |
resume
pause
only
start
prepared
stop (natural end)
occurring
natural e
abort
JIM 2010 – Jornada de Informática do Maranhão
80
Exercício: criar exemplo 2 a partir do exemplo
<?xml version="1.0" encoding="ISO-8859-1"?> 1
<ncl id="exemplo02" xmlns="http://www.ncl.org.br/NCL3.0/EDTVProfile">
<head>
<regionBase>
<region id="rgTV">
<region id="rgVideo1" left="25%" top="25%“ width="50%" height="50%" />
____________________________________________________________
</region>
</regionBase>
<connectorBase>
<importBase alias=“connectors” documentURI=“exemplo02.conn" />
</connectorBase>
<descriptorBase>
<descriptor id="dVideo1" region="rgVideo1" />
____________________________________________________________
</descriptorBase>
</head>
<body>
<port id="pInicio" component="video1“ />
<media id="video1" src="media/video1.mpg" descriptor="dVideo1“ />
____________________________________________________________
____________________________________________________________
</body>
</ncl>
JIM 2010 – Jornada de Informática do Maranhão
81
Exemplo 2 – Dúvidas?
pInicio
rgVideo1
video 1
onBeginStart
onEndStop
rgTitulo1
titulo 1
elos de sincronism o:
conectores
onBeginStart e
onEndStop
titulo1 @ rgTitulo1
video1 @ rgVideo1
JIM 2010 – Jornada de Informática do Maranhão
82
Nó de Mídia NCLua
<media id=“meuCodigoLua”
src=“luaFile.lua
descriptor=“luaDesc”>
<area id=“myId” label=“myLabel”/>
<property name=“myName”/>
</media>
• Como NCL se comunica com Lua e viceversa?
JIM 2010 – Jornada de Informática do Maranhão
www.lua.org
JIM 2010 – Jornada de Informática do Maranhão
NCLua
• Módulos adicionais
• Comunicação NCL <-> Lua
• Modelo de execução
• Exemplos
JIM 2010 – Jornada de Informática do Maranhão
Módulos Adicionais
• e ve n t
– comunicação bidirecional
• c a nv a s
– primitivas gráficas
• s e tt in g s , pe rs is t e n t
– acesso a variáveis persistentes
• n c le dit
– edição do documento NCL
JIM 2010 – Jornada de Informática do Maranhão
Comunicação NCL-Lua
JIM 2010 – Jornada de Informática do Maranhão
Paradigma de Eventos
•
•
•
•
Multiplexador
Apenas um evento é tratado por vez
Processamento deve ser rápido
Lua é bastante apropriada:
– tabelas
– closures
– corotinas
JIM 2010 – Jornada de Informática do Maranhão
Paradigma de Eventos
•
•
•
•
•
•
Loop
M
princial (Main loop)
Fila
)
de eventos (Event queue)
Entregador
)
(Dispatcher)
Tratador
)
(Handler)
Gerador de eventos
Eventos
JIM 2010 – Jornada de Informática do Maranhão
Xlet vs NCLua
public interface Xlet
{
public
p void initXlet(XletContext ctx)
f
throws XletStateChangeException;
public
p void startXlet()
throws XletStateChangeException;
public void pauseXlet();
public
p void destroyXlet(boolean unc)
throws XletStateChangeException;
}
e
-- initialization
...
function hdlr (evt)
-- NCL events
if evt.action == 'start' then
...
end
-- key events
if key.value == '1' then
...
end
end
event.register(hdrl)
• Application Manager
• Formatador NCL
• multi-threaded
• event-driven
JIM 2010 – Jornada de Informática do Maranhão
Módulo de Eventos
• event.register(hdlr)
e
• event.post(dst,
e
evt)
• Eventos são tabelas comuns
• event.unregister(hdlr)
e
• event.timer(time,
e
func)
• event.uptime()
e
JIM 2010 – Jornada de Informática do Maranhão
Classes de Eventos
• Comunicação NCL
– c la s s : 'n c l'
– ty pe : 'pre s e n ta tio n ', 'a ttrib u tio n '
– a c tio n: 's ta rt', 's to p', 's e t', 'pa u s e ',
's e t'
– la b e l: '', 'fi m ', 'fa s e 1 ', ...
{ class='ncl', type='presentation', action='start',
label=‘anchorLabel' }
JIM 2010 – Jornada de Informática do Maranhão
Registrando um tratador
...
function tratador(evt)
...
end
event.register(tratador)
JIM 2010 – Jornada de Informática do Maranhão
Representação de evento em
NCLua
evt = {
class = ‘key’,
type = ‘press’,
key = ‘RED’
}
JIM 2010 – Jornada de Informática do Maranhão
Evento postado por um NCLua para
sinalizar a um documento seu fim natural
event.post {
class = ‘ncl’,
type = ‘presentation’,
action = ‘stop’
}
JIM 2010 – Jornada de Informática do Maranhão
Máquina de Estado de NCL
paused
stop |
abort
pause
start
start |
resume
stop | natural endoccurring
sleeping
prepared
abort
JIM 2010 – Jornada de Informática do Maranhão
Classes de Eventos
• Classe ncl:
– Usada na comunicação entre um NCLua e o
documento NCL que contém o objeto de mídia.
• Classe key:
– Representa o pressionamento de teclas do controle
remoto pelo usuário.
• Classe tcp:
– Permite acesso ao canal de interatividade por meio
do protocolo TCP.
• Classe sms:
– Usada para envio e recebimento de mensagens SMS
em dispositivos móveis.
JIM 2010 – Jornada de Informática do Maranhão
Classes de Eventos
• Classe edit:
– Permite que os comandos de edição ao vivo sejam
disparados a partir de scripts NCLua.
• Classe si:
– Fornece acesso a um conjunto de informações
multiplexadas em um fluxo de transporte e
transmitidas periodicamente por difusão.
• Classe user:
– Através dessa classe, aplicações podem estender
sua funcionalidade criando seus próprios eventos.
JIM 2010 – Jornada de Informática do Maranhão
Classes de Eventos - detalhes
• Teclas do controle
– c la s s : 'ke y '
– ty pe : 'pre s s ' e 're le a s e '
– ke y : 'R E D', 'A ', '1 ', ...
– {c la s s ='ke y ', t y pe ='pre s s ', ke y ='R E D'}
• Eventos internos
– c la s s : 'u s e r'
– any : any
– { c la s s ='u s e r', da t a ={k 1 =v 1 ,k 2 =v 2 } }
JIM 2010 – Jornada de Informática do Maranhão
Recebimento de eventos pelo
NCLua
<link xconnector="onBeginStart">
<bind role="onBegin" component="videoId"/>
<bind role="start"
component="luaId"/>
</link>
Arquivo NCL que contém o objeto NCLua
-- Evento recebido pelo tratador do NCLua no
-disparo do elo:
evt = {
class = 'ncl',
type
= 'presentation',
action = 'start'
}
Arquivo NCLua
JIM 2010 – Jornada de Informática do Maranhão
Envio de eventos pelo NCLua
<link xconnector="onBeginStart">
<bind role="onEnd" component="luaId"/>
<bind role="start" component="imagemId"/>
</link>
Arquivo NCL que contém o objeto NCLua
-- O elo acima será disparado quando o evento a seguir
-- for postado pelo NCLua 'luaId':
event.post {
class = 'ncl',
type
= 'presentation',
action = 'stop'
}
Arquivo NCLua
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 1 - Ciclo de Vida de
Objetos NCLua
• Três nós NCLua são disparados:
– O primeiro NCLua executa indefinidamente.
– O segundo NCLua termina a si próprio assim
que é iniciado.
– O terceiro NCLua termina a si próprio três
segundos após ser iniciado.
• Botões identificam os estados dos nós
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 1 – Visão Temporal e
Espacial
lua1
∞
verde1
∞
lua2
∞
vermelho2
lua3
visão temporal
verde3
vermelho3
∞
3 segundos
visão espacial
verde1
vermelho2
verde3
verde1
vermelho2
JIM 2010 – Jornada de Informática do Maranhão
vermelho3
Exemplo 1 – Visão Estrutural
pInicio
start
onBegin
start
lua1
onBegin
lua3
onBegin
onEnd
onEnd
lua2
start
stop
verde1
start
onBegin
onEnd
start
verm elho1
start
stop
verde3
stop
verde2
start
verm elho2
JIM 2010 – Jornada de Informática do Maranhão
start
verm elho3
Exemplo 1 - Execução
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 2 – Contador de
cliques
• Botão “Clique aqui” em quatro momentos
diferentes durante a execução da
aplicação.
– Se o usuário selecioná-lo com o controle
remoto por pelo menos três vezes é exibida a
mensagem: “Você ganhou”.
– Caso contrário, é exibida a mensagem: “Você
perdeu”.
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 2 – Visão Temporal e
Espacial
cliques
area01
area02
aqui
aqui
∞
temp area03
∞
area04 resultado
aqui
aqui
ganhou ∞
perdeu
visão temporal
visão espacial
aqui
ganhou
OU
perdeu
JIM 2010 – Jornada de Informática do Maranhão
∞
Exemplo 2 – Visão Estrutural
pInicio
resultado
temp
onEnd
area01
onBegin
area02
onBegin
area03 area04
onBegin
onEnd
onEnd
( ... )
start
stop
start
stop
onBegin
and
and
test
contador < 3
stop
test
contador >= 3
aqui
onSelection
contador
inc
start
cliques
stop
stop
onBegin
start
start
start
ganhou
stop
stop
perdeu
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 2 – Integração NCL e
NCLua
<media id="cliques" src="cliques.lua">
<area label="inc"/>
<property name="contador"/>
</media>
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 2 – Integração NCL e
NCLua
local contador = 0
function tratador (evt)
contador = contador + 1
local evtContador = { class = 'ncl‘, type = 'attribution',
name = 'contador‘, value = contador
}
evtContador.action = 'start'
event.post(evtContador)
…
end
event.register(tratador)
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 2 – Em Execução
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 2 - Lições
• Em NCL puro:
– explosão de elos
• Em Lua:
– uma variável e um método
• Uso de uma propriedade para
comunicação NCL e NCLua
• Lua é mais simples e concisa para fazer
operações matemáticas!
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 3 – Gráficos e
Controle Remote
• Jogo com interação pelo controle remoto.
• São apresentadas duas imagens:
– Logo NCL
– Logo LUA
• Objetivo: levar o logo LUA até o Logo
NCL.
• Uso do pacote canvas e event
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 3 – Visão Espacial e
Temporal
∞
lua
visão tem poral
visão espacial
chegou
ganhou
∞
tem po do m ovim ento que o usuário
faz do logotipo NCL
lua
ganhou
JIM 2010 – Jornada de Informática do Maranhão
lua
Exemplo 3 – Visão Estrutural
pInicio
chegou
lua
onBegin
start
ganhou
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 3 – Em Execução
JIM 2010 – Jornada de Informática do Maranhão
Exemplo 4 – Animações
•
•
•
•
Animação de um cavalo correndo
Uso de frames
Eventos da classe 'user‘
Três abordagens:
– Função sleep()
– Temporizadores
– Corrotinas
JIM 2010 – Jornada de Informática do Maranhão
Conclusão
•
•
•
•
•
•
•
API minimalista, primitivas básicas
Especificação é pequena e sucinta
Implementação pequena
Mecanismos x Política
Não define um modelo fixo de uso
Abstrações/Frameworks 100% em Lua
Players e aplicações nativas em Lua
JIM 2010 – Jornada de Informática do Maranhão
www.lua.org
JIM 2010 – Jornada de Informática do Maranhão
Download

JIM 2010 - DEINF/UFMA