Bulk Reads#

Bulk reads sunt o comandă Lynx care citește toate valorile senzorilor (cu excepția I2C) de pe un hub dintr-o dată. Aceasta necesită același timp de execuție ca orice altă comandă Lynx și, prin urmare, poate economisi mult timp în ciclul de execuție; cu un bulk read, citirea a zece senzori durează la fel de mult ca și citirea unui singur senzor (dacă nu sunt de tipul I2C și se află pe același hub).

Acest lucru a devenit mult mai simplu de realizat cu versiunile SDK 5.4 și superioare, cu o modalitate integrată de accesare ușoară a acesteia. Iată exemplul oficial despre cum se utilizează citirile bulk.

Modul Off#

Aceasta este opțiunea implicită, cea mai plictisitoare; înseamnă că citirile bulk nu sunt utilizate de SDK atunci când se apelează metodele normale de acces la hardware.

Notă

Citirile bulk pot fi în continuare accesate prin apelarea metodei LynxModule.getBulkInputData(), însă dacă se dorește utilizarea citirilor bulk (lucru pe care îl recomandăm cu tărie), este mai simplu să utilizeze modurile AUTO sau MANUAL.

Pentru a seta manual modul OFF, trebuie să rulați

List<LynxModule> allHubs = hardwareMap.getAll(LynxModule.class);

for (LynxModule hub : allHubs) {
   hub.setBulkCachingMode(LynxModule.BulkCachingMode.OFF);
}

Modul Auto#

Acesta este cel mai simplu mod de utilizare care utilizează bulk reads; o nouă citire bulk este efectuată atunci când se repetă o citire hardware. Un exemplu în acest sens este

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();
}

Totuși, pot fi întâmpinate probleme dacă aceeași citire hardware este apelată de mai multe ori într-un anumit ciclu; un exemplu în acest sens :

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();
}

Luând tot în considerare, acest lucru este recomandat, deoarece este foarte puțin probabil să dea greș și poate aduce îmbunătățiri semnificative ale performanței cu un efort minim. În ceea ce privește utilizatorul, nu este necesar să se golească manual memoria cache de citire bulk; cu toate acestea, acest lucru înseamnă că pierdeți o parte din control.

Modul Manual#

În modul manual, memoria cache pentru citirile bulk este resetată numai după o resetare manuală. Acest lucru poate fi util, deoarece este modalitatea de a minimiza în mod absolut citirile străine, însă dacă memoria cache nu este resetată, vor fi returnate valori vechi. Acestea fiind spuse, iată o implementare corectă a modului MANUAL

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();
}

Atenționare

În modul MANUAL, în cazul în care memoria cache nu este golită corespunzător, vor fi returnate valori vechi. Din acest motiv, dacă nu sunteți foarte sigur de ceea ce faceți, vă recomandăm modul AUTO; deși modul MANUAL poate avea unele îmbunătățiri de performanță, dacă modul AUTO nu este utilizat în mod optim, acesta are mai puține șanse să realizeze erori catastrofale.

Sfat

Citirile bulk sunt emise pentru fiecare hub, astfel încât nu trebuie neapărat să citiți bulk ambele hub-uri în același timp sau la fiecare ciclu.