lua workshop 2009 módulo de procedimentos automatizados · antes: lógica e gui em lua, e editor...
TRANSCRIPT
![Page 1: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/1.jpg)
Lua Workshop 2009
Módulo de Procedimentos AutomatizadosUma Plataforma de Automação e Controle de Processos Industriais
Equipe [email protected]
Tecgraf/PUC-Rioe
PETROBRAS
5 de outubro de 2009
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 1 / 100
![Page 2: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/2.jpg)
Agenda
1 IntroduçãoO Projeto MPAMPA e Lua
2 Servidor de ExecuçãoModelo de ExecuçãoMultithreading Cooperativo
3 Interface de DesenvolvimentoO Modelo VixSerialização de DadosUndo & Redo
4 Comentários Finais
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 2 / 100
![Page 3: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/3.jpg)
Automação e Controle de Processos Industriais
MPA- Automação de tarefas rotineiras- Diagnóstico de cenários previstos- Otimização de processos- Auxílio em emergências
Controle Avançado
Supervisão- Atuação de um operador humano capaz de tomar decisões em situações emergenciais.
PLC - Programmable Logic Controller- Intertravamento de segurança- Funções básicas de operação
Equipamentos- Atuação e sensoriamento do processo- Operações básicas de segurança
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 3 / 100
![Page 4: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/4.jpg)
Histórico
OrigensDesenvolvido pelo CENPES na plataforma Gensym G2.Módulo de Partida Assistida de uma plataforma de extração depetróleo.
Tecgraf/PUC-RioGeneralização para ser adaptado para diferentes plataformas deextração de petróleo e ser programável através de umalinguagem visual.Independência da plataforma Gensym G2.
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 4 / 100
![Page 5: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/5.jpg)
Visão Geral
A
Aplicação Clientedo MPA
a
Arquivo dePré-Configuração
(Lua)
Supervisório
PLC
Servidor deExecuçãodo MPA
CORBA
PréConfiguração Configuração Execução Supervisão
OPC / VXL
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 5 / 100
![Page 6: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/6.jpg)
Configuração da Planta
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 6 / 100
![Page 7: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/7.jpg)
Configuração de Fluxos
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 7 / 100
![Page 8: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/8.jpg)
Motivação para uso de Lua
PortabilidadeAs plataformas em operação usam versões antigas de VMS.Algumas refinarias utilizam sistemas Microsoft Windows.
ExtensibilidadeO desenvolvedor deve ser capaz de incorporar novasfuncionalidades de acordo com as diferentes necessidades dosambientes de automação.
Manipulação de DadosO MPA deve manipular diferentes descrições do processo.
Equipamentos que compõem o ambiente de automação.Procedimentos de automação.
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 8 / 100
![Page 9: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/9.jpg)
Agenda
1 IntroduçãoO Projeto MPAMPA e Lua
2 Servidor de ExecuçãoModelo de ExecuçãoMultithreading Cooperativo
3 Interface de DesenvolvimentoO Modelo VixSerialização de DadosUndo & Redo
4 Comentários Finais
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 9 / 100
![Page 10: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/10.jpg)
Recursão de Cauda e Máquinas de Estados
function Command: run ( )s e l f . ac t i on ( )i f s e l f . next then
return s e l f . next : run ( )end
endfunction Choice : run ( )
i f s e l f . ac t i on ( ) theni f s e l f . yes then
return s e l f . yes : run ( )end
elsei f s e l f . no then
return s e l f . no : run ( )end
endend
I n i t = Command{ ac t i on = function ( ) c = 0 end }I n c r = Command{ ac t i on = function ( ) c = c + 1 end }Test = Choice { ac t i on = function ( ) return c < 10^5 end }I n i t . next = I n c r ; I n c r . next = Test ; Test . yes = I n c rI n i t : run ( )
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 11 / 100
![Page 11: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/11.jpg)
Escalonador de Co-Rotinas
Cada co-rotinarepresenta umathread.O escalonador éresponsável porrestaurar aexecução decada co-rotina.
? ?
Pronto paraexecução
Espera portempo
Espera por outroseventos (e.g. E/S)
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 13 / 100
![Page 12: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/12.jpg)
Escalonador de Co-Rotinas
Cada co-rotina nafila de prontas temsua execuçãorestaurada uma vez,em sequência até ofinal da fila.
? ?
Pronto paraexecução
Espera portempo
Espera por outroseventos (e.g. E/S)
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 15 / 100
![Page 13: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/13.jpg)
Escalonador de Co-Rotinas
Durante suaexecução, aco-rotina poderegistrar outrasco-rotinas paraexecução.
? ?
Pronto paraexecução
Espera portempo
Espera por outroseventos (e.g. E/S)
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 17 / 100
![Page 14: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/14.jpg)
Escalonador de Co-Rotinas
As co-rotinas podemsuspender suaexecução por umdado tempo.
? ?
Pronto paraexecução
Espera portempo
Espera por outroseventos (e.g. E/S)
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 19 / 100
![Page 15: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/15.jpg)
Escalonador de Co-Rotinas
Ou ainda esperarpor um evento comoa disponibilidade deum dado solicitado.
? ?
Pronto paraexecução
Espera portempo
Espera por outroseventos (e.g. E/S)
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 21 / 100
![Page 16: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/16.jpg)
Escalonador de Co-Rotinas
Após a execuçãodas co-rotinasprontas, oescalonador movepara o início da filade pronta todas asco-rotinas cujaespera por tempotenha estourado.
? ?
Pronto paraexecução
Espera portempo
Espera por outroseventos (e.g. E/S)
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 23 / 100
![Page 17: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/17.jpg)
Escalonador de Co-Rotinas
Antes de iniciar maisum ciclo deexecução, oescalonador verificase algum eventoocorreu e move asco-rotinas em esperapara o início da filade prontas.
? ?
Pronto paraexecução
Espera portempo
Espera por outroseventos (e.g. E/S)
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 25 / 100
![Page 18: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/18.jpg)
Escalonadores Aninhados
Permite priorizar aexecução dasco-rotinas dos fluxos.Facilita asuspensão/restauraçãoda execução dos fluxospara implementarpontos de quebra(break points). ? ?
? ?
Escalonador aninhado de fluxos MPA
Co-rotinas do servidoraguardando eventos dos clientes
Envio de mensagens de monitoramento
Tratador de requisição de
um cliente
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 27 / 100
![Page 19: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/19.jpg)
Agenda
1 IntroduçãoO Projeto MPAMPA e Lua
2 Servidor de ExecuçãoModelo de ExecuçãoMultithreading Cooperativo
3 Interface de DesenvolvimentoO Modelo VixSerialização de DadosUndo & Redo
4 Comentários Finais
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 28 / 100
![Page 20: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/20.jpg)
Implementação da Interface de Desenvolvimento
Antes: lógica e GUI em Lua, e editor de fluxo em C++.Agora: 100% Lua:
Evitar complexidades do alto acoplamento de partes em Lua eC++.Usar reflexão computacional de Lua na implementação do Vix.Usar coleta de lixo de Lua para minimizar vazamento de memória.
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 29 / 100
![Page 21: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/21.jpg)
O Modelo Vix e Chamadas Dinâmicas
/ / Processamento de uma mensagemstruct MoveCommitMsg : public VixMessage {
V i x C o l l e c t i o n ∗ objs ;i n t x , y ;s t a t i c const char∗ const MsgId ( ) {
return "MoveCommitMsg" ;}const char∗ const GetMessageId ( ) {
return MoveCommitMsg : : MsgId ( ) ;}MoveCommitMsg ( V i x C o l l e c t i o n ∗oc , i n t dx , i n t dy ) {
ob js = oc ; x = dx ; y = dy ;}
} ;short i n t Box : : MsgHandlerVO ( VixMessage ∗msg) {
i f (msg−>GetId ( ) == MoveCommitMsg : : MsgId ( ) )return MoveCommit ( ( MoveCommitMsg∗)msg ) ;
else i f (msg−>GetId ( ) == MoveFeedbackMsg : : MsgId ( ) ). . .
return MSG_NOT_PROCESSED;}short i n t Box : : MoveCommit (MoveCommitMsg ∗m) {
. . .return MSG_PROCESSED;
}
/ / Envio de uma mensagemMoveCommitMsg move( ob jec ts , dx , dy ) ;move .SendVO( dest ) ;
−− Processamento de uma mensagemfunction Box : MoveCommit ( objs , dx , dy )
. . .return true
end
−− Envio de uma mensagemdest : inMoveCommit ( objs , dx , dy )
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 31 / 100
![Page 22: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/22.jpg)
O Modelo Vix e Chamadas Dinâmicas
/ / Processamento de uma mensagemstruct MoveCommitMsg : public VixMessage {
V i x C o l l e c t i o n ∗ objs ;i n t x , y ;s t a t i c const char∗ const MsgId ( ) {
return "MoveCommitMsg" ;}const char∗ const GetMessageId ( ) {
return MoveCommitMsg : : MsgId ( ) ;}MoveCommitMsg ( V i x C o l l e c t i o n ∗oc , i n t dx , i n t dy ) {
ob js = oc ; x = dx ; y = dy ;}
} ;short i n t Box : : MsgHandlerVO ( VixMessage ∗msg) {
i f (msg−>GetId ( ) == MoveCommitMsg : : MsgId ( ) )return MoveCommit ( ( MoveCommitMsg∗)msg ) ;
else i f (msg−>GetId ( ) == MoveFeedbackMsg : : MsgId ( ) ). . .
return MSG_NOT_PROCESSED;}short i n t Box : : MoveCommit (MoveCommitMsg ∗m) {
. . .return MSG_PROCESSED;
}
/ / Envio de uma mensagemMoveCommitMsg move( ob jec ts , dx , dy ) ;move .SendVO( dest ) ;
−− Processamento de uma mensagemfunction Box : MoveCommit ( objs , dx , dy )
. . .return true
end
−− Envio de uma mensagemdest : inMoveCommit ( objs , dx , dy )
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 33 / 100
![Page 23: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/23.jpg)
Persistência dos Projetos
−− DadosCommand = {
xmin = 5242 ,ymin = 5254 ,xmax = 5989 ,ymax = 5326 ,ac t i on = {
_swi tch = "FUNCTIONCALL" ,expressions = { " a " , " b+c " , " 123 " } ,v a r i a b l e = { " res " } ,f u n c t i o n i d = " calcMean " ,
} ,e r r o r l i s t = {
" unknown func t i on , got ’ calcMean ’ " ,}
}
−− OperaçõesCommandMethods = {
Repaint = function ( s e l f ). . .
end ,Move = function ( s e l f , dx , dy )
. . .end ,Reshape = function ( s e l f , po in t , dx , dy )
. . .end ,
}
−− Campos Pers i s ten tesCommandFields = {
{ i d = " au to_desc r i p t i on " , type = "BOOLEAN" } ,{ i d = " xmin " , type = "REAL" } ,{ i d = " ymin " , type = "REAL" } ,{ i d = "xmax" , type = "REAL" } ,{ i d = "ymax" , type = "REAL" } ,{ i d = " ac t i on " , sw i tch = " _swi tch " ,
{ i d = " _swi tch " , type = "STRING" } ,{ i d = " expressions " , type = "STRING" , l i s t = true } ,{ i d = " v a r i a b l e s " , type = "STRING" , l i s t = true } ,FUNCTIONCALL = {
{ i d = " f u n c t i o n i d " , type = "STRING" } ,} ,FLOWCALL = {
{ i d = " f l o w i d " , type = "STRING" } ,{ i d = " opera t ion " , type = "STRING" } ,
} ,OBJECTCALL = {
{ i d = " c l a s s i d " , type = "STRING" } ,{ i d = " objname " , type = "STRING" } ,{ i d = "member" , type = "STRING" } ,{ i d = " opera t ion " , type = "STRING" } ,
} ,} ,
}
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 35 / 100
![Page 24: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/24.jpg)
Undo & Redo
function Movement : Complete ( device )local x1 , y1 , x2 , y2 = s e l f : GetTwoPoints ( )local dx = x2−x1local dy = y2−y1dx = math .max( s e l f . xmin , math . min ( dx , s e l f . xmax ) )dy = math .max( s e l f . ymin , math . min ( dy , s e l f . ymax ) )
s e l f . t o o l : inMoveCommit ( s e l f . ob jec ts , device , dx , dy , s e l f . box )end
function Annotat ion : Move( device , dx , dy , ve r tex )i f ver tex == true then
return P o l y l i n e . Move( s e l f , device , dx , dy , ve r tex )else −− movimentação de uma aresta
local x , y = s e l f . x , s e l f . ylocal next = ver tex % #x + 1
x [ ver tex ] = x [ ve r tex ]+ dxy [ ver tex ] = y [ ve r tex ]+ dyx [ next ] = x [ next ]+ dxy [ next ] = y [ next ]+ dy
s e l f : ResetVertexes ( device )end
end
.e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 37 / 100
![Page 25: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/25.jpg)
Undo & Redo
function Movement : Complete ( device )local x1 , y1 , x2 , y2 = s e l f : GetTwoPoints ( )local dx = x2−x1local dy = y2−y1dx = math .max( s e l f . xmin , math . min ( dx , s e l f . xmax ) )dy = math .max( s e l f . ymin , math . min ( dy , s e l f . ymax ) )UserAct ions : begin ( " Movimentar seleção " )s e l f . t o o l : inMoveCommit ( s e l f . ob jec ts , device , dx , dy , s e l f . box )UserAct ions : commit ( )
end
function Annotat ion : Move( device , dx , dy , ve r tex )i f ver tex == true then
return P o l y l i n e . Move( s e l f , device , dx , dy , ve r tex )else −− movimentação de uma aresta
local x , y = s e l f . x , s e l f . ylocal next = ver tex % #x + 1UserAct ions : d o i t {
redo = function ( s e l f )x [ ve r tex ] = x [ ve r tex ]+ dxy [ ver tex ] = y [ ve r tex ]+ dyx [ next ] = x [ next ]+ dxy [ next ] = y [ next ]+ dy
end ,undo = function ( s e l f )
x [ ve r tex ] = x [ ve r tex ]−dxy [ ver tex ] = y [ ve r tex ]−dyx [ next ] = x [ next]−dxy [ next ] = y [ next]−dy
end ,}s e l f : ResetVertexes ( device )
endende-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 39 / 100
![Page 26: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/26.jpg)
Agenda
1 IntroduçãoO Projeto MPAMPA e Lua
2 Servidor de ExecuçãoModelo de ExecuçãoMultithreading Cooperativo
3 Interface de DesenvolvimentoO Modelo VixSerialização de DadosUndo & Redo
4 Comentários Finais
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 40 / 100
![Page 27: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/27.jpg)
Onde Lua Ajudou?
Recursão de CaudaImplementação dos fluxos como máquinas de estado.
Co-RotinasImplementação de multithreading cooperativo.
Reflexão ComputacionalImplementação do modelo Vix.Implementação da serialização de projetos.
Fechos de FunçãoImplementação do recurso de Undo&Redo.
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 41 / 100
![Page 28: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/28.jpg)
Fim
Obrigado!
Equipe [email protected]
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 42 / 100
![Page 29: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/29.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 44 / 100
![Page 30: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/30.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 46 / 100
![Page 31: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/31.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
startinicia nova thread
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 48 / 100
![Page 32: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/32.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
startinicia nova thread controle da sala 1
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 50 / 100
![Page 33: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/33.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
startinicia nova thread controle da sala 1
read lê 'room.presence'
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 52 / 100
![Page 34: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/34.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
startinicia nova thread controle da sala 1
read lê 'room.presence'
startinicia nova thread
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 54 / 100
![Page 35: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/35.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
startinicia nova thread controle da sala 1
read lê 'room.presence'
startinicia nova thread controle da sala 2
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 56 / 100
![Page 36: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/36.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
startinicia nova thread controle da sala 1
read lê 'room.presence'
startinicia nova thread controle da sala 2
read lê 'room.presence'
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 58 / 100
![Page 37: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/37.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
startinicia nova thread controle da sala 1
read lê 'room.presence'
startinicia nova thread controle da sala 2
read lê 'room.presence'
endtermina
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 60 / 100
![Page 38: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/38.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
startinicia nova thread controle da sala 1
read lê 'room.presence'
startinicia nova thread controle da sala 2
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 62 / 100
![Page 39: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/39.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
startinicia nova thread controle da sala 1
read lê 'room.presence'
startinicia nova thread controle da sala 2
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 3 segundos
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 64 / 100
![Page 40: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/40.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
startinicia nova thread controle da sala 1
read lê 'room.presence'
startinicia nova thread controle da sala 2
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 3 segundos
suspend suspende por 1 segundo
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 66 / 100
![Page 41: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/41.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
thread principal
startinicia nova thread controle da sala 1
read lê 'room.presence'
startinicia nova thread controle da sala 2
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 3 segundos
suspend suspende por 1 segundo
após 1 segundo
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 68 / 100
![Page 42: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/42.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 70 / 100
![Page 43: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/43.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 72 / 100
![Page 44: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/44.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 74 / 100
![Page 45: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/45.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 76 / 100
![Page 46: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/46.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 78 / 100
![Page 47: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/47.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
faz a leitura do ponto 'presence'
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 80 / 100
![Page 48: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/48.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
faz a leitura do ponto 'presence'
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
suspende por 1 segundosuspend
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 82 / 100
![Page 49: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/49.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
faz a leitura do ponto 'presence'
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
suspende por 1 segundosuspend
após 1 segundo
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 84 / 100
![Page 50: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/50.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
faz a leitura do ponto 'presence'
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
suspende por 1 segundosuspend
após 1 segundo
read lê 'room.presence'
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 86 / 100
![Page 51: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/51.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
read lê 'room.presence'
faz a leitura do ponto 'presence'
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
suspende por 1 segundosuspend
após 1 segundo
read lê 'room.presence'
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 88 / 100
![Page 52: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/52.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
read lê 'room.presence'
faz a leitura do ponto 'presence'
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
suspende por 1 segundosuspend
após 1 segundo
read lê 'room.presence'
faz a leitura dos pontos 'presence'
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 90 / 100
![Page 53: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/53.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
read lê 'room.presence'
faz a leitura do ponto 'presence'
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
suspende por 1 segundosuspend
após 1 segundo
read lê 'room.presence'
faz a leitura dos pontos 'presence'
suspend suspende por 3 segundos
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 92 / 100
![Page 54: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/54.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
read lê 'room.presence'
faz a leitura do ponto 'presence'
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
suspende por 1 segundosuspend
após 1 segundo
read lê 'room.presence'
faz a leitura dos pontos 'presence'
write escreve 'false' em 'room.light'
suspend suspende por 3 segundos
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 94 / 100
![Page 55: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/55.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
read lê 'room.presence'
faz a leitura do ponto 'presence'
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
suspende por 1 segundosuspend
após 1 segundo
read lê 'room.presence'
faz a leitura dos pontos 'presence'
write escreve 'false' em 'room.light'
suspend suspende por 3 segundos
faz a escrita do ponto 'light'
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 96 / 100
![Page 56: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/56.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
read lê 'room.presence'
faz a leitura do ponto 'presence'
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
suspende por 1 segundosuspend
após 1 segundo
read lê 'room.presence'
faz a leitura dos pontos 'presence'
write escreve 'false' em 'room.light'
suspend suspende por 3 segundos
faz a escrita do ponto 'light'
suspende por 10 segundossuspend
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 98 / 100
![Page 57: Lua Workshop 2009 Módulo de Procedimentos Automatizados · Antes: lógica e GUI em Lua, e editor de fluxo em C++. Agora: 100% Lua: Evitar complexidades do alto acoplamento de partes](https://reader036.vdocuments.net/reader036/viewer/2022071022/5fd6a81a4684832eb93fb5b9/html5/thumbnails/57.jpg)
Co-Rotinas e Multithreading Cooperativo
function c o n t r o l ( room )local c = 0
while true doi f not br idge : read ( room . presence ) then
c = c + 1i f c > 3 then
c = 0br idge : w r i t e ( room . l i g h t , fa lse )scheduler : suspend (10)
elsescheduler : suspend ( 1 )
endelse
c = 0scheduler : suspend ( 3 )
endend
end
scheduler : r e g i s t e r ( co rou t ine . c reate ( function ( )for _ , room in i p a i r s ( rooms ) do
scheduler : s t a r t ( con t ro l , room )end
end ) )
scheduler : run ( )
read lê 'room.presence'
faz a leitura do ponto 'presence'
controle da sala 2
controle da sala 1
lê 'room.presence'read
thread principal
startinicia nova thread
read lê 'room.presence'
startinicia nova thread
read lê 'room.presence'
endtermina
faz a leitura dos pontos 'presence'
suspend suspende por 1 segundo
após 1 segundo
suspend suspende por 3 segundos
faz a leitura do ponto 'presence'
suspende por 1 segundosuspend
após 1 segundo
lê 'room.presence'read
suspende por 1 segundosuspend
após 1 segundo
read lê 'room.presence'
faz a leitura dos pontos 'presence'
write escreve 'false' em 'room.light'
suspend suspende por 3 segundos
faz a escrita do ponto 'light'
suspende por 10 segundossuspend
e-mail ([email protected]) MPA — Lua Workshop 2009 5 de outubro de 2009 100 / 100