tenez, ça pourrait ressembler à cela (tapé ici, absolument pas testé)
#include <PS2X_lib.h> //for v1.6
// PS2 pins
const byte PS2_SEL = 16;
const byte PS2_DAT = 14;
const byte PS2_CMD = 15;
const byte PS2_CLK = 17;
PS2X ps2x;
struct __attribute__ ((packed)) t_donneesManette {
byte LX;
byte LY;
byte RX;
byte RY;
bool V_PSB_L1;
bool V_PSB_L2;
bool V_PSB_R1;
bool V_PSB_R2;
bool V_PSB_SQUARE;
bool V_PSB_CROSS;
};
t_donneesManette valeursPrecedentes = {127, 128, 127, 128, false, false, false, false, false, false};
t_donneesManette valeursMaintenant;
void setup() {
Serial.begin(115200);
delay(300); //added delay to give wireless ps2 module some time to startup, before configuring it
int error = ps2x.config_gamepad(PS2_CLK, PS2_CMD, PS2_SEL, PS2_DAT, true, true);
switch (error) {
case 0: Serial.println(F("Found Controller, configured successful ")); break;
case 1: Serial.println(F("No controller found, check wiring, see readme.txt to enable debug. visit www.billporter.info for troubleshooting tips")); break;
case 2: Serial.println(F("Controller found but not accepting commands. see readme.txt to enable debug. Visit www.billporter.info for troubleshooting tips")); break;
case 3: Serial.println(F("Controller refusing to enter Pressures mode, may not support it.")); break;
default: Serial.println(F("Unknown Error")); break;
}
byte type = ps2x.readType();
switch (type) {
case 0: Serial.print(F("Unknown Controller type found ")); break;
case 1: Serial.print(F("DualShock Controller found ")); break;
case 2: Serial.print(F("GuitarHero Controller found ")); break;
case 3: Serial.print(F("Wireless Sony DualShock Controller found ")); break;
default: Serial.println(F("Unknown Type")); break;
}
}
void loop() {
ps2x.read_gamepad(); //read controller
valeursMaintenant.LY = ps2x.Analog(PSS_LY);
valeursMaintenant.LX = ps2x.Analog(PSS_LX);
valeursMaintenant.RY = ps2x.Analog(PSS_RY);
valeursMaintenant.RX = ps2x.Analog(PSS_RX);
valeursMaintenant.V_PSB_L1 = ps2x.Button(PSB_L1);
valeursMaintenant.V_PSB_L2 = ps2x.Button(PSB_L2);
valeursMaintenant.V_PSB_R1 = ps2x.Button(PSB_R1);
valeursMaintenant.V_PSB_R2 = ps2x.Button(PSB_R2);
valeursMaintenant.V_PSB_SQUARE = ps2x.Button(PSB_SQUARE);
valeursMaintenant.V_PSB_CROSS = ps2x.ButtonPressed(PSB_CROSS);
if (memcmp(&valeursMaintenant, &valeursPrecedentes, sizeof(t_donneesManette)) == 0) { // https://www.cplusplus.com/reference/cstring/memcmp/ (on a compacté la structure et ce ne sont que des octets donc ça doit être OK)
// pas de changement
// éventuellement envoi d'un "battement de coeur" pour dire que tout va bien mais rien de nouveau
} else {
// quelque chose a changé, envoyer la structure par radio
// on mémorise la nouvelle configuration
valeursPrecedentes = valeursMaintenant;
}
delay(50) ;
}
ce code lit l'état des joysticks et des boutons pertinents, les stocke dans la structure et compare avec l'état précédent. S'il y a une changement c'est là qu'il faudra émettre, s'il n'y a pas de changement alors on n'émet rien.
Par raison de sécurité on peut décider d'émettre quand même un message particulier s'il n'y a pas de changements de façon à ce que le module distant sache qu'il est toujours sous contrôle. On utilise cela comme un "battement de coeur" ➜ si le module distant ne reçoit aucun message pendant x secondes alors c'est que la connexion avec la base est rompue et le robot se met en position de sécurité (arrêt moteurs etc par exemple).
(on pourrait utiliser des champs de bits pour les boutons pour rendre la structure plus compacte - mais à conserver les optimisations pour plus tard
)