2.3 Maintaining the Authenticity of Records in Digital Systems
2.3.2 Characteristics of authentic records
Como ya se ha indicado, para dotar de funcionalidad a los objetos del entorno virtual desarrollado ha sido necesaria la codificación de sus scripts. Estos programas poseen una estructura basada en estados, eventos y funciones. Cada script está compuesto de uno o varios estados, que reflejan la situación del objeto, y entre los cuales se va evolucionando en función de la interacción que se lleve a cabo. En cada estado se pueden controlar diferentes eventos (tocar, escuchar, temporización finalizada, etc.) que una vez producidos provocan la ejecución de funciones (cambiar de color, girar, enviar un mensaje, etc.). En la Figura 4.3-37 se muestra la estructura básica de un script en LSL. El código incluido indica que en el estado “default” el objeto está a la espera de que se produzca el evento “touch”. Cuando un avatar toque el objeto que contiene este script se activará el evento provocando que en el chat
público (canal 0) del visor 3D aparezca la frase: “Este es un ejemplo de script” (Masedo 2012) .
Figura 4.3-37. Estructura de un script en LSL
Existen algunos aspectos claves del funcionamiento de eLab3D que han condicionado enormemente la elaboración de los scripts LSL, aumentando considerablemente la complejidad de los mismos:
• En el mundo virtual hay disponibles varios puestos de laboratorio independientes, pero físicamente hay que tener en cuenta que sólo existe un equipamiento real que controlar remotamente, es decir, un multímetro, un generador de funciones, una fuente de alimentación, etc.
• Una orden efectiva dirigida hacia el eLab3D-Labserver- para configurar un instrumento o un circuito puede estar originada por un conjunto de acciones más sencillas efectuadas sobre diversos objetos del puesto. Por ejemplo, para conectar un cable es preciso seleccionar los terminales del mismo y los puntos de conexión del circuito y del instrumento en los que se desea colocar, solamente al final de este proceso se enviará la orden al eLab3D-Labserver-
para que efectúe las conexiones correspondientes.
• Todos los objetos del puesto de laboratorio deben reflejar un estado consistente en función de las acciones realizadas por el usuario que se encuentre trabajando en dicho puesto. Por ejemplo, si se modifica la amplitud de la excitación de entrada en un circuito, las medidas que se estuvieran realizando sobre el mismo con el multímetro o el osciloscopio se deben actualizar automáticamente.
La forma de programar la funcionalidad del mundo virtual, como ya se ha indicado, está determinada fundamentalmente por los eventos que se ejecutan en los scripts
asociados a cada uno de los objetos que lo constituyen. Este hecho ha obligado a establecer una estrategia de diseño de dichos scripts basada en los siguientes elementos claves:
• Definición de tablas con la descripción de la funcionalidad de cada objeto incluyendo sus interacciones con el avatar y otros objetos y con la aplicación externa Controlador LabView, incluida en el eLab3D-Labserver-.
Estos elementos han sido esenciales para permitir el desarrollo en paralelo de los
scripts y su posterior depuración. Estructura genérica de los scripts
Para conseguir implementar en el mundo virtual la funcionalidad requerida ha sido necesario establecer un mecanismo de comunicación entre objetos. Esto no resulta fácil de conseguir si se tiene en cuenta que LSL es un lenguaje poco sofisticado y no permite, por ejemplo, enviar parámetros de unos scripts a otros. Para que los objetos se comuniquen se ha elaborado un sistema de mensajería entre los
scripts, haciendo uso de los canales de comunicación privados soportados en Opensim.
La función clave utilizada para que los scripts de diferentes objetos se puedan comunicar es la función llSay (). Por ejemplo si un objeto tiene que enviar un mensaje a otro objeto través del canal 20 en su script se incluiría la siguiente línea de código:
llSay (20, “Mensaje a enviar”);
Para que el otro objeto reciba correctamente el mensaje debe utilizar en su correspondiente script la función llListen () y el evento listen (). En la Figura 4.3-38 se presenta un ejemplo en el que se muestra el código utilizado para poder recibir mensajes por un determinado canal.
integer canal_comunicacion = 20;
// canal por el que se reciben mensajes
default
// estado por defecto
{
state_entry ()
// evento inicial del script
{
llListen (canal_comunicacion, “ “, “ “, “ “);
// se abre canal para recepción de mensajes
}
listen (integer canal, string nombre, key id, string mensaje)
// evento que se activa al recibir un mensaje por el canal 20
{
llSay(0, “El objeto ” + nombre + “ha enviado ” + mensaje + “por el canal “ + canal);
// se ejecutan acciones tras la recepción del mensaje
} }
Además de la comunicación entre objetos en el mundo virtual es necesaria la comunicación con el eLab3D-Labserver- para efectuar las acciones sobre el sistema hardware y poder recibir las correspondientes respuestas. Es decir, se requiere que los scripts de los objetos del mundo virtual puedan comunicarse con una aplicación externa, en este caso con la aplicación Controlador LabView a través del Servicio Web. Para conseguir dicha comunicación se ha empleado la función llHTTPRequest () y el evento http_response (). En la Figura 4.3-39 se muestra el código ejemplo de un
script en el que se refleja cómo se produce una comunicación HTTP con una aplicación externa cuando se toca un determinado objeto.
key http_request_id;
// identificador de petición http
default
// estado por defecto
{
touch_start (integer x)
// evento que se ejecuta al tocar el objeto que contiene el script
{
http_request_id = llHTTPRequest (“url_destino/parametros”, [HTTP_METHOD, “GET”] , “ “);
// se realiza petición http a aplicación externa
}
http_response (key request_id , integer status, list metadata, string body)
// evento que se ejecuta al recibir respuesta a la petición http
{
If ( request_id == http_request_id ) {
llSay(0, “Body recibido: “ + body);
//si identificador coincide con la petición realizada // se muestra en chat público mensaje recibido
} } }
Se ha realizado la descripción de las funciones y eventos claves que han sido utilizadas en el desarrollo de los scripts de los objetos que forman parte del mundo virtual. Por tanto, ya es posible presentar la estructura genérica del script de un objeto, la cual se muestra en la Figura 4.3-40. Se puede observar una primera zona recuadrada donde se incluye la parte del código que se encarga de la gestión de los mensajes entre los objetos de un mismo puesto de laboratorio. Los objetos del puesto escuchan por un mismo canal y cada objeto sólo atiende a los mensajes que van dirigidos a él. En la segunda zona recuadrada se incluye el código que se encarga de la gestión del evento asociado a la interacción física con el objeto, que en ocasiones puede requerir de una comunicación con la aplicación externa Controlador LabView. En la tercera zona recuadrada se incluye el código de atención a la respuesta del
Controlador LabView, que puede incorporar las funciones de comunicación a los objetos osciloscopio y multímetro para que actualicen sus medidas. Dependiendo de la
funcionalidad de cada objeto en el mundo virtual los scripts contienen todas o sólo algunas de las partes indicadas en la estructura genérica.
//=============== VARIABLES ================== //=============== FUNCIONES ================== //=============== ESTADOS ================== default{ state_entry() {
// asignación del canal de escucha
llListen(canal_puesto , "", "", "");
// habilitación del canal de escucha
.
//configuración inicial del objeto y acciones iniciales
}
listen(integer canal, string nom_Obj_que_envia, key id_Obj_que_envia, string mensaje)
// evento que se ejecuta al escuchar un mensaje en el canal_puesto
{
list mensajeSeparado = llParseString2List( mensaje,["|"], [] ); string primeraPalabraMensaje = llList2String(mensajeSeparado,0);
// se procesa mensaje para obtener primera palabra del mensaje
if ( primeraPalabraMensaje == nombre_Objeto )
// se comprueba si el mensaje es para este objeto
{
// se procesa el mensaje y se realizan acciones (puede incluirse una petición http // a aplicación “Controlador LabView” a través de “Servicio Web”)
} }
touch_start(integer a)
// evento que se ejecuta al tocar el objeto
{
if ( avatarQueToca == avatarDelPuesto )
// se comprueba si el avatar que ha tocado el objeto es el que tiene asignado el puesto
{
// Se ejecuta la acción propia de este objeto
.
http_request_id = llHTTPRequest(“url_destino/parametros”, [HTTP_METHOD, “GET”] , “ “); // se realiza petición http a aplicación “Controlador LabView” a través del “Servicio Web” }
else
//Se avisa al usuario que ha tocado que no puede interactuar con este objeto
}
http_response (key request_id , integer status, list metadata, string body)
// evento que se ejecuta al recibir la respuesta de la aplicación “Controlador LabView” a través // del “Servicio Web”
{
// tratamiento de la respuesta
.
llSay( puesto_canal, “Actualizar gráfica" ); llSay( puesto_canal, medida_ch1 ); llSay( puesto_canal, medida_ch2 ); llSay( puesto_canal, medida_mult);
//Se envía mensaje al osciloscopio y multímetro del puesto para que se actualicen medidas
} }
Tablas con funcionalidad de Figura 4.3-40. Estructura genérica del script de un objeto
1
2
Por último, hay que tener en cuenta que para que en el mundo virtual un avatar pueda operar en un puesto de laboratorio es necesario que cada puesto haya sido convenientemente inicializado. En el proceso de inicialización una tarea clave es la asignación del canal por el que se comunicarán los objetos de cada puesto. Como a cada puesto se le asigna un canal diferente se garantiza que no existan interferencias en la comunicación de mensajes entre los objetos de diferentes puestos. De esta forma se consigue que, aunque haya varios usuarios trabajando de forma simultánea en los puestos de laboratorio, cada usuario en su puesto de laboratorio realice la actividad práctica de forma independiente.
Una de las características clave de la plataforma eLab3D, comentada en el apartado 4.3.2, es la de conseguir una elevada sensación de realismo gracias a la forma de interaccionar del usuario con los objetos que forman parte del mundo virtual. Esta premisa ha provocado que el diseño de la funcionalidad del mundo virtual se base en dotar de libertad de acción a los usuarios tal y como ocurre en un laboratorio presencial. Por tanto, el orden en que realizan sus acciones los usuarios en el mundo virtual no está impuesto, lo cual conlleva que no exista una secuenciación de acciones determinada. Teniendo en cuenta esta característica para poder programar los scripts
asociados a todos los objetos ha sido necesario elaborar un conjunto de tablas que especifican la funcionalidad e interacciones de cada objeto. El formato de dichas tablas se muestra en la Tabla 4.3-XI.
Tabla 4.3-XI. Formato de las tablas que definen funcionalidad e interacciones de cada objeto Nombre del Objeto
Funcionalidad Se describe la función del objeto
Comunicación con
objetos Se relacionan los objetos con los que debe comunicarse Comunicación con
Controlador LabView Se indica si es necesaria la comunicación con la aplicación externa
En el apéndice A se muestran las tablas de funcionalidad generadas para los objetos clave el mundo virtual, en concreto los vinculados a un puesto de laboratorio, representado anteriormente en la Figura 4.3-36.