DCCpp - Cargar desvíos al inicio

Dependiendo del sistema que estemos usando, muchas veces necesitaremos tener definidos los desvíos que tenemos la maqueta.
Dependiendo de su número esto puede ser una tarea bastante tediosa tener que configurar y almacenar todos los desvíos uno a uno.
Dccpp, en cualquiera de sus versiones, nos permite definir estos desvíos desde el void Setup() en el archivo .ino según nos indica la documentación en el archivo Turnout.h
Crear desvíos o accesorios desde el programa principal
1-.Funciones de la clase Turnout.h:
2-.Crear desvío:
3-.Iniciar desvío:
4-.Usar desvíos con comando serial:
5-.Usar desvíos desde el archivo .ino:
Funciones de la clase Turnout.h
- void begin(int id, int add, int subAdd);
Inicializa un desvío creado por una instacia regular de C++.
- Parámetro: id El ID numérico (0-32767) del desvío a controlar.
- Parámetro: add La dirección principal del decodificador que controla este desvío (0-511).
- Parámetro: subAdd La subdirección del decodificador que controla este desvío (0-3).
Nota: No se puede usar en el modo linea de comando.. - void set(int id, int add, int subAdd);
Fuerza la creación de un desvío por linea de comando.
- Parámetro: El ID numérico (0-32767) del desvío a controlar.
- Parámetro: add La dirección principal del decodificador que controla este desvío (0-511).
- Parámetro: subAdd La subdirección del decodificador que controla este desvío (0-3). - void activate(int s = 1);
Cambia el estado de activacion del desvío.
- Parámetro: s nuevo estado : 0 para off, 1 para on. Por defecto 1. - void inactivate() { activate(0); }
Desactiva el desvío. - bool isActivated() { return this->data.tStatus > 0; }
Comprueba si la salida está activada o no.
Devuelve: True si la salida está activada. De lo contrario falso (por supuesto...). - static Turnout* get(int id);
Obtiene un desvío.
- Parámetro: id El ID numérico (0-32767) del desvío a controlar.
Devuelve: ID del desvío o NULL si no encuentra ninguno.
Nota: Solo disponible cuando USE_EEPROM o USE_TEXTCOMMAND esta definido. - static void remove(int id);
Elimina un desvío.
- Parámetro: id El ID numérico (0-32767) del desvío a controlar.
Nota: Solo disponible cuando USE_EEPROM o USE_TEXTCOMMAND esta definido. - static int count();
Obtiene el múmero total de desvíos.
Devuelve: El número de desvíos.
Nota: Solo disponible cuando USE_EEPROM o USE_TEXTCOMMAND esta definido. - static void show();
Muestra el contenido de todos los desvíos.
Nota: Solo disponible cuando DCCPP_PRINT_DCCPP esta definido. - static void load();
Carga el contenido de todos los desvíos desde la EEPROM.
Nota: Solo disponible cuando USE_EEPROM esta definido. - static void store();
Almacena el contenido de todos los desvíos en la memoria EEPROM.
Nota: Solo disponible cuando USE_EEPROM esta definido.
void begin(int id, int add, int subAdd);
/** Fuerza la creación de un desvío por linea de comando.
id: El ID numérico (0-32767) del desvío a controlar.
add: La dirección principal del decodificador que controla este desvío (0-511).
subAdd: La subdirección del decodificador que controla este desvío (0-3).
*/Creando un desvío
Primero tenemos que definir el objeto Turnout (Desvío) antes del void Setup() de la siguiente manera:
Turnout T1;Una vez que sabemos como inicializar un desvió, haremos lo mismo pero para un número x de desvíos.
He probado diferentes manera de iniciar el objeto con un bucle for, pero no he podido o, más probablemente, no se como hacerlo. Así que nos queda la manera manual. Pongamos que tenemos 10 desvíos en nuestra maqueta.
Primero vamos a crear 10 objetos Turnout:
Turnout T1, T2, T3, T4, T5, T5, T6, T7, T8, T9, T10;Iniciar desvíos
Ya tenemos un desvío, ahora tenemos que inicializar el objeto T1 con la función begin(). Esta función tiene 3 atributos, ID, Dirección y Subdirección. Ahora nos situamos dentro del void Setup() y después de DCCpp::begin(); escribimos la linea:
T1.begin(1, 15, 2);Y con esto se nos iniciará un desvío con la ID: 1, Dirección: 15 y Subdirección: 2.
En este punto podemos tomar dos opciones la primera es repetir todo el proceso TurnoutX.begin(); con cada uno de las direcciones o crear un array con los datos de los desvíos que queremos tener definidos, con los 3 datos necesarios, ID, dirección, subdirección.
En este paso podríamos añadir también un cuarto dato como el estado del desvío, pero para este caso solo vamos a usar los imprescindibles.
Este es un ejemplo para 10 desvíos:
int storedata[N_DESVIOS + 1][3]{
{0, 0, 0},
{1, 1, 1},
{2, 1, 2},
{3, 1, 3},
{4, 1, 4},
{5, 2, 1},
{6, 2, 2},
{7, 2, 3},
{8, 2, 4},
{9, 3, 1},
{10, 3, 2}
};Igual que con un solo desvío, los iniciamos de la siguiente manera:
T1.begin(storedata[1][0], storedata[1][1], storedata[1][2]); // ID - Dirección - Subdirección
T2.begin(storedata[2][0], storedata[2][1], storedata[2][2]);
T3.begin(storedata[3][0], storedata[3][1], storedata[3][2]);
T4.begin(storedata[4][0], storedata[4][1], storedata[4][2]);
T5.begin(storedata[5][0], storedata[5][1], storedata[5][2]);
T6.begin(storedata[6][0], storedata[6][1], storedata[6][2]);
......Usar desvíos con comando serial
Con esta acción ya podemos utilizar el comando serial:
<T1 1> con respuesta <H1 1>
o
<T1 0> con respuesta <H1 0>Una vez inicie el sistema podemos comprobar en el monitor serial que los desvíos están iniciados con el comando ‘T’:

Listado comando 'T' en DCCpp
Usar desvíos desde el archivo .ino
Una vez definido el desvío lo podemos cambiar su estado con el siguiente comando:
// Cambiar estado de un desvío definido
T1.activate(1);
// o
T1.activate(o);También podemos consultar su estado con:
// Consultar estado de un desvío definido
T1.isActivated();
// ejemplo:
if (T1.isActivated() == 0)
{
// Acción
}// Cambiar estado de un desvío definido
T1.activate(1);
// o
T1.activate(o);Conclusión:
Como estamos trabajando sobre una placa MEGA en un principio no hay diferencia, con el array gastamos algo de memoria.
A cambio lo tendremos todo mucho mejor organizado y en placas como la Arduino MEGA este gasto de memoria es ínfima y en ningun caso será un problema.
Este método no almacena los desvíos en la memoria, solo los carga al iniciar el sistema pero a efectos prácticos de uso es lo mismo.
Este metodo para crear desvíos es extremadamente útil si quieres crear animaciones con la central DCCpp LMD
En el siguiente enlace tienes toda la información sobre la clase Turnout.h en Github
Saludos a todos y todas!!!
