@bobyAndCo @bilouteman76
Une petite contribution de ma part…elle concerne la MaJ des états d’occupation au lancement de RocRail. Christophe a concu le code de la passerelle CAN/TCP de telle sorte que les messages d’occupation ne soient remontés de la passerelle vers RocRail en TCP que si un changement d’état d’un (ou plusieurs) capteur(s) est signalé par l’un des décodeurs Pico - cf la ligne 247 du code V0.5.7:
if (module[idModule].value != (uint16_t)frameIn.data16[0])
Le “probleme” en l’état actuel, c’est qu’au lancement de RocRail, tous les rails de contacts / blocks sont signalés libres jusqu’a qu’un convoi se déplace et déclanche une nouvelle occupation sur sa route. La, tout se met a jour comme prévu.
Alors, ce que je propose, c’est de la programmation niveau scolaire, et je m’en excuse d’avance, mais cela fonctionne ! En gros, j’ai scindé la tache CanReceive avec une condition liée a la durée depuis la mise sous tension du dispositif décodeurs/passerelle - durée fixée ici a 50s, mais elle peut etre plus courte. Donc, en gros, pendant 50s, l’ESP32 de la passerelle travaille comme un boeuf et mitraille RocRail de messages TCP puis, passé ce délai, c’est une notification TCP vers RocRail par exception comme prévue a l’origine. Je suis certain qu’il y a moyen de faire beaucoup plus efficace & élégant, mais hey il n’y a que le résultat qui compte ! 
void CANReceiveTask(void \*pvParameters)
{
CANMessage frameIn;
Message message;
while (true)
{
if (ACAN_ESP32::can.receive(frameIn))
{
uint16_t idModule = frameIn.id;
if (time_top + 50000 > millis())
{
message.module = idModule;
for (byte i = 0; i < 16; i++)
{
message.sensor = i;
message.value = ((frameIn.data16[0] & (1 << i)) >> i);
xQueueSend(canToTcpQueue, &message, portMAX_DELAY);
}
module[idModule].value = frameIn.data16[0];
}
else
{
if (module[idModule].value != (uint16_t)frameIn.data16[0])
{
Serial.printf("Received from node %d value %d\n", idModule, frameIn.data16[0]);
message.module = idModule;
for (byte i = 0; i < 16; i++)
{
message.sensor = i;
message.value = ((frameIn.data16[0] & (1 << i)) >> i);
xQueueSend(canToTcpQueue, &message, portMAX_DELAY);
}
module[idModule].value = frameIn.data16[0];
}
}
}
vTaskDelay(1 / portTICK_PERIOD_MS);
}
} // end CANReceiveTask
On déclarera donc simplement la variable “time_top” dans le Void Set Up pour l’initialisation de l’horloge:
// Create queues
canToTcpQueue = xQueueCreate(50, sizeof(CANMessage));
tcpToCanQueue = xQueueCreate(50, BUFFER_SIZE * sizeof(byte));
debugQueue = xQueueCreate(50, sizeof(CANMessage)); // Create debug queue
time_top = millis();
// Create tasks
xTaskCreatePinnedToCore(CANReceiveTask, "CANReceiveTask", 4 * 1024, NULL, 3, NULL, 1); // priority 3 on core 0
xTaskCreatePinnedToCore(TCPSendTask, "TCPSendTask", 4 * 1024, NULL, 5, NULL, 0); // priority 5 on core 1
#if defined(ETHERNET)
xTaskCreatePinnedToCore(ethernetMonitorTask, "Ethernet Monitor", 4 * 1024, NULL, 1, NULL, 1); // priority 1 on core 1
#elif defined(WIFI)
xTaskCreatePinnedToCore(wifiMonitorTask, "WiFi Monitor", 4 * 1024, NULL, 1, NULL, 0); // priority 1 on core 1
#endif
} // end setup