Bonjour à tous
Nouvelle version 0.2 de LaBox livrée sur Github.
Les Throttles sont apparues. Une Throttle est basique-ment un moyen de recevoir des ordres texte DCC++. Il y a quatre variantes de Throttle disponibles, dont 3 sont utilisables sur un ESP32. J'ai volontairement bloqué ThrottleEthernet aux seuls AVR pour l'instant.
Un throttle reçoit des ordres de l'extérieur, qu'elle pousse dans la MessageStack générale introduite dans la version précédente. Dans le message est intégré à son début un numéro sur trois digits qui correspond à l'identifiant de la Throttle, et qui va servir à demander à cette même Throttle de renvoyer la réponse lorsque le message sera traité. Toute cette partie continue bien sûr d'être exécutée sur le second core de l'ESP32 .
Toutes les Throttles déclarées sont dans une liste chaînée gérée par la classe Throttles. Le constructeur de base de Throttle pousse 'this' dans la liste... Il suffit de déclarer un nouveau Throttle pour le voir apparaître dans la liste visualisable sur la console avec Throttles::printThrottles(). Il peut y avoir plusieurs Throttle de chaque type, chacune ayant son identifiant et son nom. L'identifiant est fixé automatiquement.
Aujourd'hui, il n'y a pas de moyen de remplir la liste des Throttles dynamiquement en fonction de ce qui apparait ou pas, mais chacune peut être connectée ou non. Il suffit dans le .ino de prévoir une plage suffisamment large de tout ce qui peut être connecté, et lorsqu'une Throttle doit se connecter, redémarrer l'ESP suffit... On va voir qu'il y a malgré tout une possibilité plus souple.
- ThrottleSerial.
C'est le Throttle de base, celui qui permet de recevoir des commandes depuis la console de l'IDE. Contrairement à ce qui se faisait jusque là dans DCCpp (et DCC++), toutes les interfaces séries sont exploitables, y compris les versions émulées comme avec SoftwareSerial ou AltSoftwareSerial. Il suffit de déclarer un SERIAL_INTERFACE avec un type et un nom.
Par exemple SERIAL_INTERFACE(Serial3, MaBoxAMoi) va créer un canal de communication sur le port Serial3 qu'un ThrottleSerial pourra exploiter sous le nom SerialInterfaceMaBoxAMoi. L'exemple LaBox.ino permet de mieux comprendre le fonctionnement. A noter que c'est un mécanisme que j'ai déjà employé dans Commanders depuis longtemps...
- ThrottleWifi
C'est exactement ce que Christophe avait codé dans la version précédente de LaBox. Par contre je ne l'ai pas testé.
- ThrottleWifiAPClient
Il s'agit de la déclaration par l'ESP32 d'un point d'accès Wifi suivi de la création d'un certain nombre de clients. Le nombre de client est fixé dès le démarrage pour éviter les allocations/désalocations qui fragmentent la mémoire pendant le fonctionnement. Dans l'exemple LaBox par exemple, j'en ai déclaré quatre. Ces clients se connectent et se déconnectent au fur et à mesure des besoins. Sans doute faudra t-il mieux tester cette partie, je n'ai pu qu'en connecter deux différents à la fois... C'est le seul moyen aujourd'hui d'avoir une centrale dynamique sur qui se connectent plusieurs intervenants, qui peuvent ensuite laisser leur place à d'autres.
/*************************************************************
project: <LaBox>
author: <Thierry PARIS>
description: <LaBox Wifi Controller sample>
*************************************************************/
#include "LaBox.h"
#if !defined(USE_TEXTCOMMAND) || !defined(USE_WIFI)
#error To be able to compile this sample,the lines #define USE_TEXTCOMMAND and #define USE_WIFI must be uncommented in DCCpp.h
#endif
// WIFI
const char* ssid = "ssid";
const char* password = "password";
// the media access control (ethernet hardware) address for the shield:
uint8_t wifiMac[] = { 0xBE, 0xEF, 0xBE, 0xEF, 0xBE, 0x80 };
//the IP address for the shield:
uint8_t wifiIp[] = { 192, 168, 1, 100 };
// SERIAL
SERIAL_INTERFACE(Serial, Normal);
ThrottleSerial throttleSerial("Serial", new SerialInterfaceNormal());
ThrottleWifi throttleWifi("Wifi", wifiMac, wifiIp, 2560, TCP);
void setup()
{
Serial.begin(115200);
Serial.println("LaBox 0.2");
// Add 4 Wifi clients
ThrottleWifiAPClient::connectWifi(ssid, password, 23, 4);
Throttles::printThrottles();
DCCpp::begin();
/* Configuration for ESP32, can be adapted...
DIR -> GPIO_32
PWM -> EN
MAX471 -> GPIO_36 (A0)
*/
DCCpp::beginMain(UNDEFINED_PIN, 32, 34, A0);
}
void loop()
{
DCCpp::loop();
}