Controlador de Diálogo



next up previous
Next: Modelo da Apresentação Up: Implementação do MIU Previous: Implementação do MIU

Controlador de Diálogo

O Controlador de Diálogo é, basicamente, um animador de Guiões de Interacção e foi desenvolvido sobre um animador de Petri Nets[9] (o formalismo utilizado para implementar os Guiões). É composto, ainda, por um interpretador da linguagem de comandos utilizada nos Guiões, por módulos de tratamento dos modelos de dados (funções finitas, relações, conjuntos, listas e tuplos) e por um módulo responsável pela comunicação com os restantes componentes.

Animador de Petri Nets

Sendo o comportamento dos Guiões de Interacção modelado por Petri Nets, o Controlador de Diálogo foi desenvolvido sobre um animador dessas redes que aqui se apresenta.

Formalmente as redes utilizadas podem ser modeladas da seguinte forma:

  PetriNet :: B : Case
              Ev: Events
              Fi: Flow
              Fo: Flow
              Cb: Case
              Ce: Case;
  Conditions = CId -> Bool;
  Events = Event-set;
  Flow = Event -> Case;
  Case = CId-set;

B é o conjunto de todos os lugares da rede, Ev é o conjunto de todas as transições, Fi e Fo são os fluxos de entrada e saída dessas transições (de que lugares retiram tokens e em que lugares os colocam) e Cb e Ce são as marcações inicial e final, respectivamente. Como a definição da Petri Net será partilhada por todas as instâncias de um Guião ela não inclui a marcação actual, devendo cada instância conservar a sua.

A utilização do animador é feita por meio das seguintes funções:

startpn: PetriNet InstId Conditions
que inicializa a rede cuja descrição lhe é passada como parâmetro, devolvendo a marcação daí resultante - a necessidade de indicar a instância prende-se com a verificação das condições necessárias para que as transições se possam efectuar -;
firepn: PetriNet Conditions Event InstId Conditions
que implementa o disparo de uma transição - neste caso é passada a descrição da rede, a marcação actual, qual o evento e a instância, sendo devolvida a marcação resultante da transição - e
endpn: PetriNet Conditions Bool
que serve para verificar se uma dada marcação é a marcação final da rede referida.

Adicionalmente existe a função:

valideventspn: PetriNet Conditions InstId Event-set
para calcular todos os eventos possíveis para uma dada marcação da rede.

O Interpretador de Instruções

Outra tarefa, bem definida, que o Controlador de Diálogo deve realizar, é a execução das instruções e cálculo das expressões colocadas em INIT e TRANS. Para o efeito foi desenvolvido um interpretador de instruções.

Na sua versão actual estão previstas expressões envolvendo atribuições, invocações de operações (com ou sem resultado), a instrução out, as instruções condicional, if...then...else... e cíclica, while...do.... Foi ainda incluído o tratamento de expressões do tipo inteiro, string e booleano.

A utilização do interpretador é feita através das operações

docode: Code InstId
para executar uma sequência de instruções e
dotypedexp: TypedExp InstId OpcGISym Value
para calcular o valor de uma expressão. O identificador de instância passado às operações é o da instância à qual se referem as expressões a calcular e é necessária para se fazer o acesso às variáveis do Guião.

A Inclusão dos Tipos  

Ao nível da especificação os valores dos argumentos são sempre considerados como tokens léxicos, independentemente do seu tipo. Na implementação, no entanto, torna-se necessário controlar a leitura desses valores. Se os tipos básicos (inteiros, strings, etc.) não apresentam problemas, o mesmo já não se pode dizer dos que são definidos à custa de modelos. A leitura de uma Função Finita ou de um Conjunto não é uma tarefa trivial, existem vários valores a serem lidos e condições que devem ser verificadasgif. Coloca-se, então, o problema de decidir quem/como controlar esse diálogo.

A solução implementada foi colocar esse controlo no Controlador de Diálogo. Para tal, desenvolveu-se uma série de pseudo-Guiões, um para cada modelo. Assim, quando uma variável é de um tipo definido com recurso a modelos estruturados, o seu tipo léxico é substituído pela indicação do GI que deverá controlar a interacção a ela referente. No Controlador de Diálogo, por sua vez, o controlador "desvia" o processamento dos eventos para um módulo de tratamento apropriado. Este processo é transparente uma vez que o protocolo de comunicação continua a ser o mesmo.

Este modo de funcionamento permite ter vários métodos de leitura para cada um dos modelos, bastando para tal definir tipos de Guiões e os respectivos módulos de processamento associados. Actualmente estão definidos tipos de Guiões para a leitura de Funções Finitas (FFSYNTH), Relações (RELSYNTH), Listas (LISTSYNTH), Conjuntos (SETSYNTH) e Tuplos (TUPSYNTH). A definição dos módulos de processamento para cada um destes Guiões baseou-se, em parte, na experiência adquirida em [4].

Os Guiões do tipo FFSYNTH e RELSYNTH geram um diálogo em que os pares domínio/contradomínio (variáveis dom e ran) são apresentados/lidos um a um, sendo disponibilizados, para além de OK e CANCEL, os comandos NEW (inicializar a vazio), UP (par anterior), DOWN (par seguinte) e DEL (apagar o par actual). Internamente, o valor é representado por quatro listas de valores:

Os Guiões do tipo SETSYNTH e LISTSYNTH são semelhantes aos anteriores mas a variável utilizada para apresentar os valores é elem.

Por último, os Guiões TUPSYNTH geram um diálogo correspondente à expressão

input(sel1) input(sel2) ... input(seln)gif
com os comandos OK e CANCEL e em que sel1 a seln são os selectores do tuplo. Importa notar que a representação sintática utilizada para os tuplos é uma função finita de nome do selector para valor correspondente.

Estrutura Geral do Controlador

A informação necessária ao Controlador de Diálogo consiste na definição dos Guiões de Interacção, na descrição das instâncias existentes e nos canais de comunicação com os outros componentes de MIU. Temos então:

  CD :: DEFS:  GISym -> GIdef
        INSTS: InstId -> InstDescr
        OUTSM: CHAN
        INSM:  CHAN
        INLX:  CHAN
        OUTLX: CHAN;
  GIdef = DECISION | SYNTH | VALSYNTH | FFSYNTH | RELSYNTH | 
          SISTSYNTH | SETSYNTH | TUPSYNTH;
  FFSYNTH :: DREF: TypeId;
  InstDescr :: FATHER:  NIL | InstId
               VARS:    VarId -> Value
               EVSEQ:   Conditions
               CMDLINE: NIL | CmdLineDescr;

O seu funcionamento consiste basicamente em:

  
Figure 2: Composição do Controlador de Diálogo

Na fig. 2 são apresentados os ficheiros que compõem o Controlador de Diálogo. Note-se que as setas representam uma relação de inclusão textual, pelo que podem existir (e existem de facto) referências cruzadas entre os ficheiros.

O ficheiro cd.n contém o corpo principal do Controlador. Em cdcom.n estão as funções de comunicação e este por sua vez inclui msgs.n onde são definidos os protocolos de comunicação; petrinet.n é o animador de Petri Nets e mkpn.n um gerador das mesmas a partir das definições dos GI's; si.n é o interpretador de instruções e cdff.n a cdtup.n são os módulos de tratamento dos modelos.

Finalmente, em share.n são feitas definições globais aos três componentes do MIU. Tanto este ficheiro como msgs.n são partilhados pelos três componentes do sistema.



next up previous
Next: Modelo da Apresentação Up: Implementação do MIU Previous: Implementação do MIU



Jose Franscisco Creissac Campos
Wed Feb 7 14:27:41 MET 1996