4.1. Componentes de la Libreria.
SerialIocpClient consta de los siguientes componentes a utilizar.
-
Inclusión de la librería en el código de Arduino®:
Una vez que tenemos la librería instalada, para incluirla en el código se debe acceder a la siguiente opción en el menú del
Arduino® IDE:
Programa -> Incluir librería -> Serial Iocp Client.
Obteniendo la siguiente línea que nos indica que el código utilizará la librería SerialIocpClient:
-
#define de los Offsets definidos en SerialIocp.
Cuando se definen los Offsets en la aplicación SerialIocp, se pueden copiar estos en formato #define para poder pegarlos en el código. Estos #define se pegarán después del último #include y antes de la función Setup() en el código.
Utilizar #define permite referirnos a los números de Offset por un nombre, los que es mas intuitivo de usar. Por supuesto se pueden añadir #define manualmente y con la nomenclatura deseada.
NOTA: En cualquier momento se puede volver a la configuración de Offsets en SerialIocp y volver a cargar los #define en el portapapeles.
-
Función llamada cuando la librería recibe comandos.
En la inicialización de la librería se vio la función SetOnCommand(&OnIocpCommand), que indica como parámetro la función que será llamada por la librería cuando esta recibe comandos desde la aplicación SerialIocp.
Esta función hay que colocarla detrás de los #define y antes de la función Setup().
Actualmente puede recibir dos comandos en el parametro nCommand:
-
COMMAND_READY
: Este comando se recibe cuando la aplicación
SerialIocp se ha conectado a
IocpServer.
-
COMMAND_QUIT
: Este comando se recibe cuando la aplicación
SerialIocp se ha desconectado de
IocpServer.
Deberia tener un formato similar a este:
void OnIocpCommand(int nCommand)
{
switch(nCommand)
{
case COMMAND_READY:
{
// Código a lanzar cuando SerialIocp se conecte al Simulador.
break;
}
case COMMAND_QUIT:
{
// Código a lanzar cuando SerialIocp se desconecte del Simulador.
break;
}
}
}
-
Función llamada cuando la librería recibe cambios en los Offsets.
En la inicialización de la librería se vio la función SetOnValue(&OnIocpValue), que indica como parámetro la función que será llamada por la librería cuando esta recibe cambios en los valores de los Offsets desde la aplicación SerialIocp.
Los parámetros que recibe esta función son:
-
nId: Indica el ID del Offset que ha sido modificado.
-
nVal
: Indica el nuevo valor que ha tomado el Offset.
Esta función hay que colocarla detrás de los #define y antes de la función Setup().
Debería tener un formato similar a este:
void OnIocpValue(long nId, long nVal)
{
switch(nId)
{
case
nid1
:
{
// Código a lanzar cuando el Offset nId1 cambia de valor.
if (nVal==1) {
.....
}
break;
}
case nid2:
{
// Código a lanzar cuando el Offset nId2 cambia de valor.
break;
}
// ...
}
}
-
Inicialización de SerialIocpClient. Se debe colocar dentro de Setup() en el código.
void setup()
{
// Iocp Initialize
iocp.Open(2000000); // inicializa la velocidad de la Comunicacion Serie, en este caso a 2Mbps.
iocp.SetOnCommand(&OnIocpCommand); // Indica a la libreria la función a llamar cuando se reciben comandos.
iocp.SetOnValue(&OnIocpValue); // Indica a la libreria la funcion a llamar cuando recibe valores de Offsets.
}
-
Función para poner valores en los Offset.
Para fijar valores en los Offset SerialIocpClient dispone de una función.
-
SetOffset(long
nId, long
nVal), donde
nId es el número de Offset a modificar y
Nval es el valor que se desea poner.
Nota: Es aconsejable utilizar el #define correspondiente en lugar del valor.
#define GEAR_HANDLE_POS 329 // con valores 16K = dn, 0 = up.
P. Ej. iocp.SetOffset(GEAR_HANDLE_POS,0); Que como resultado subiria el tren de aterrizaje.
-
Función para lanzar eventos en Prepar3D®.
Los eventos se lanzan en
Prepar3D® para realizar acciones, como por ejemplo Subir o bajar el tren de aterrizaje del avión.
Los hay que requieren un parámetro, por ejemplo: GEAR_SET que con el parámetro 1 Sube el tren y con el parámetro 0 baja el tren.
Los hay que NO requieren parámetro, por ejemplo: GEAR_DOWN que baja el tren y GEAR_UP que lo sube.
A cada evento le corresponde un número de identificador que se puede conocer mediante
OffsetExplorer. Manualmente se pueden añadir #define para los eventos y utilizarlos en la función.
Nota: Es aconsejable definir manualmente los #define correspondientes a los eventos y utilizarlos.
-
iocp.SendKey(long
nId, long
nVal), donde
nId es el numero del evento a lanzar y
nVal es el parametro del evento. Si el evento no requiere parametro, se puede poner 0.
#define GEAR_SET 164 // evento 164 en Prepar3d® -> GEAR_SET
P. Ej. iocp.SendKey(GEAR_SET,1); Que como resultado subirá el tren de aterrizaje.
En muchas ocasiones, para realizar una acción en
Prepar3D®, se podrá utilizar tanto la función
iocp.SetOffset(long
nId, long
nVal) como la función
iocp.SendKey(long
nId, long
nVal). Como ejemplo se pueden citar los casos presentados en las funciones anteriores, que en ambos casos el resultado es subir el tren de aterrizaje.
Cada una tiene unas ventajas y unos inconvenientes, que se presentan a continuación:
iocp.SetOffset(long nId, long nVal)
Ventajas:
-
Solo tenemos que recordar el numero de Offset y su #define para trabajar con ella (para conocer su valor y para fijarlo).
-
Los #define pueden ser copiados desde
SerialIocp.
-
En general son más sencillos de utilizar.
Desventajas:
-
Son más lentas en el tratamiento por parte de
IocpServer.
iocp.SendKey(long nId, long nVal)
Ventajas:
-
Son más rápidas en el tratamiento por parte de
IocpServer.
Desventajas:
-
Solo sirven para fijar valores y lanzar eventos. Para conocer un valor se requiere utilizar también el Offset correspondiente.
-
Los #define hay que hacerlos manualmente.
-
Suelen requerir mayor control de lo que se quiere hacer.