Commit bc06e813 authored by Bernardo Quaresma Dias's avatar Bernardo Quaresma Dias
Browse files

Inclusão de lógicas para tratamento de estado paralelo

INSTMPA-1284
parent 57ad6f0d
include 'lib-access-1_0.mpam'
include 'lib-utils-1_1.mpam'
class{ id = "state_base", name = "Estado Básico", group = "Gerenciamento de Estado",
bases = {},
......@@ -16,6 +17,14 @@ class{ id = "state_base", name = "Estado B
end
end
end
function _CLASS:getlabelmap()
local labelmap = self._label_map --[[ASSERT]] assert(labelmap, string.format("%s: Sem rótulos definidos.", tostring(self)) )
local mode = self.cfg_label_mode or 'seq'
local bitwise = (mode == 'par')
return labelmap, bitwise
end
]===],
attributes = {
{ id = "ind_state", name = "Estado", type = "INTEGER_POINT", access = "rw",
......@@ -25,12 +34,21 @@ class{ id = "state_base", name = "Estado B
description = [[
Valor inicial para estado.
Se não for configurado, será usado o valor -1.
Se não for configurado, será usado o valor -1 exceto para o modo 'par' de rótulos.
]],
},
{ id = "l_labels", name = "Rótulos de Estado", type = "STRING[]", access = "",
description = [[Lista de rótulos de estados.]],
},
{ id = "cfg_label_mode", name = "Modo de Rótulos de Estado", type = "STRING", access = "",
description = [[
Configuração de Modo de rótulos de estado.
Essa configuração pode ser:
'seq' - os estados são sequenciais e só podem ser alcançados individualmente; (padrão)
'par' - os estados são paralelos e só podem ser alcançados ao mesmo tempo.
]],
},
},
methods = {
{ id = "get", name = "Obter",
......@@ -75,22 +93,94 @@ class{ id = "state_base", name = "Estado B
results = {
},
code = [===[ function(self)
local init_val = self.cfg_init_val or -1
self:set(init_val)
local reset_val = self.cfg_init_val
if not reset_val then
if self.cfg_label_mode == 'par' then
reset_val = 0
else
reset_val = -1
end
end
self:set(reset_val)
end ]===],
},
{ id = "set_label", name = "Definir Rótulo",
description = [[Ajusta o estado correspondente ao valor do rótulo.]],
parameters = {
{ name = "Rótulo", type = "STRING"}
{ name = "Rótulo", type = "STRING"},
},
results = {
},
code = [===[ function(self, label)
local label_map = self._label_map --[[ASSERT]] assert(label_map, "%s: Sem rótulos definidos.", tostring(self))
local label_map, bitwise = self:getlabelmap()
local idx = label_map[label]
self:set(idx)
local newstate
if bitwise then
local state = self:get()
newstate = setbit(state, bit(idx, 1))
else
newstate = idx
end
self:set(newstate)
end ]===],
},
{ id = "reset_label", name = "Apagar Rótulo",
description = [[
Apaga o valor do estado para o valor inicial.
Se um rótulo for informado, apaga de acrodo com a configuração
de modo de rótulos da seguinte forma:
- se o modo for 'seq', apaga apenas se o rótulo indicado for correspondento ao estado atual,
- se o modo for 'par', apaga o apenas o rótulo indicado.
]],
parameters = {
{ name = "Rótulo", type = "STRING"},
},
results = {
},
code = [===[ function(self, label)
if label then
local label_map, bitwise = self:getlabelmap()
local idx = label_map[label]
local state = self:get()
if bitwise then
local reset_val = clearbit(state, bit(idx, 1))
self:set(reset_val)
elseif state == idx then
self:reset()
end
end
end ]===],
},
{ id = "check_label", name = "Avaliar Rótulo",
description = [[Avaliar s eo estado correspondente ao rótulo está ativo.]],
parameters = {
{ name = "Rótulo", type = "STRING"},
},
results = {
{ name = "Ativo", type = "BOOLEAN"},
},
code = [===[ function(self, label)
local label_map, bitwise = self:getlabelmap()
local idx = label_map[label]
local ret
local state = self:get()
if bitwise then
ret = hasbit(state, bit(idx, 1))
else
ret = state == idx
end
return ret
end ]===],
},
},
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment