Bulk Reads¶
Les « Bulk reads » sont une LynxCommand qui lit toutes les valeurs des capteurs (sauf I2C) sur un hub en une seule fois. Cela prend le même temps d’exécution que n’importe quelle autre LynxCommand, et peut donc sauver beaucoup de temps dans la boucle d’exécution ; avec une lecture en bloc, la lecture de dix capteurs prend autant de temps que la lecture d’un seul capteur (s’ils ne sont pas I2C et se trouvent sur le même hub).
Cela est devenu beaucoup plus simple à faire avec les versions 5.4 et supérieures du SDK, avec un moyen intégré d’y accéder facilement. Voici l’exemple officiel <https://github.com/first-tech-challenge/FtcRobotController/blob/master/FtcRobotController/src/main/java/org/firstinspires/ftc/robotcontroller/external/samples/ConceptMotorBulkRead.java>`_ sur la façon d’utiliser les Bulk reads.
Off Mode¶
C’est la valeur par défaut, et la plus ennuyeuse ; elle signifie que les Bulk reads ne sont pas utilisées par le SDK lors de l’appel des méthodes normales d’accès au matériel.
Note
Les Bulk reads sont toujours accessibles en appelant la méthode LynxModule.getBulkInputData(), cependant si l’on souhaite utiliser les Bulk reads (ce que nous recommandons fortement) il est plus simple d’utiliser les modes AUTO ou MANUAL.
Pour activer manuellement le mode OFF, vous devez lancer : :
List<LynxModule> allHubs = hardwareMap.getAll(LynxModule.class);
for (LynxModule hub : allHubs) {
hub.setBulkCachingMode(LynxModule.BulkCachingMode.OFF);
}
Mode Auto¶
C’est le mode le plus simple à utiliser pour les Bulk reads ; une nouvelle Bulk reads est effectuée lorsqu’une lecture matérielle est répétée. En voici un exemple : :
List<LynxModule> allHubs = hardwareMap.getAll(LynxModule.class);
for (LynxModule hub : allHubs) {
hub.setBulkCachingMode(LynxModule.BulkCachingMode.AUTO);
}
while (opModeIsActive()) {
// Will run one bulk read per cycle; however, if e.g.
// frontLeftMotor.getCurrentPosition() was called again,
// a new bulk read would be issued
int frontLeftEncoderPos = frontLeftMotor.getCurrentPosition();
int frontRightEncoderPos = frontRightMotor.getCurrentPosition();
int backLeftEncoderPos = backLeftMotor.getCurrentPosition();
int backRightEncoderPos = backRightMotor.getCurrentPosition();
}
Cependant, cela peut être problématique si la même lecture matérielle est appelée plus d’une fois dans une boucle donnée ; un exemple de ceci : :
List<LynxModule> allHubs = hardwareMap.getAll(LynxModule.class);
for (LynxModule hub : allHubs) {
hub.setBulkCachingMode(LynxModule.BulkCachingMode.AUTO);
}
while (opModeIsActive()) {
// Will run two bulk read per cycles,
// as frontLeftMotor.getCurrentPosition() is called twice
int frontLeftEncoderPos = frontLeftMotor.getCurrentPosition();
int frontLeftEncoderPos2 = frontLeftMotor.getCurrentPosition();
}
En général, cette méthode est recommandée, car il est très peu probable qu’elle provoque des problèmes et qu’elle permette d’améliorer considérablement les performances pour un effort minime. Du côté de l’utilisateur, il n’est pas nécessaire de vider manuellement le cache de Bulk reads ; cependant, cela signifie que vous perdez un certain contrôle.
Mode manuel¶
En mode manuel, le cache des Bulk reads n’est réinitialisé que lorsqu’on le fait manuellement. Cela peut être utile, car c’est la méthode la plus efficace pour minimiser les lectures superflues. Toutefois, si le cache n’est pas réinitialisé, des valeurs obsolètes seront renvoyées. Ceci étant dit, voici une implémentation correcte du mode MANUEL : :
List<LynxModule> allHubs = hardwareMap.getAll(LynxModule.class);
for (LynxModule hub : allHubs) {
hub.setBulkCachingMode(LynxModule.BulkCachingMode.MANUAL);
}
while (opModeIsActive()) {
// Will run one bulk read per cycle,
// even as frontLeftMotor.getCurrentPosition() is called twice
// because the caches are being handled manually and cleared
// once a loop
for (LynxModule hub : allHubs) {
hub.clearBulkCache();
}
int frontLeftEncoderPos = frontLeftMotor.getCurrentPosition();
int frontLeftEncoderPos2 = frontLeftMotor.getCurrentPosition();
}
Avertissement
En mode MANUEL'', si le cache n'est pas vidé de façon appropriée, des Valeurs obsolètes seront retournées. Pour cette raison, si vous n'êtes pas tout à fait sûr de ce que vous faites, nous recommandons le mode ``AUTO ; bien que le mode MANUEL puisse améliorer les performances si le mode AUTO n’est pas utilisé de manière optimale, il y a moins de place pour des erreurs catastrophiques.
Astuce
Les Bulk reads sont effectuées par hub, vous n’avez donc pas nécessairement besoin de lire en bloc les deux hub en même temps ou à chaque boucle.