Les buzzers addendas

Je n’ai absolument pas le courage de réenregistrer cette vidéo, le présent document corrige les qques ratés.

7’25
Comment passer de la boucle qui affiche un nombre sur plusieurs octets, octet par octet, à un nombre en correct en mémoire.

// Soit la boucle qui affiche en premier les octets de poids forts.
// Ici on commence par la fin du tableau puisque c'est little endian
// (d'abord les poids faibles) ; pour big endian, buffer[i] fait le job.

for (int i = 0; i < READ_LEN; ++i) {
  printf("%.2x", buffer[READ_LEN - i - 1]);
}
unsigned long long n = 0; // La valeur initiale est primordiale
unsigned long long m = 0; // Soit un deuxieme pour l'exemple

for (int i = 0; i < READ_LEN; ++i) {
  printf("%.2x", buffer[READ_LEN - i - 1]);

  n = n << 8; // On décale n de bits vers la gauche.
              // par conséquent les 8 bits de poids faibles sont à zéro
  n = n | buffer[READ_LEN - i - 1]; // on ajoute les 8 bits

  m = m*256; // on multiplie par la base (1octet = 256)
  m = m + buffer[READ_LEN - i - 1];
}
23’32
Bien entendu ça se lit pas si bien que ça. Lorsque l’on conçoit un programme utilisant les buzzer, on ne s’intéresse que peu à savoir qu’il y a un offset à gérer etc. Il manque encore un peu d’abstraction. BS_EXTRACT va bel et bien dans bit.h par contre, il nous faut une nouvelle fonction (ici macro) qui cache ces détails à l’utilisateur. La macro PLAYER de buzzer.h était la pour ça.
#define PLAYER(_s, _p) BS_EXTRACT(_s, PLAYER_OFFSET + i*BUTTON_COUNT, BUTTON_COUNT)

// Ce qui permet de s'en servir comme

int pstatus = PLAYER(status, 2); // État des boutons pour le joueur 3
25’19
Au moment ou je cherche mes mots, j’étais surpris de ne pas trouver le nom de cette macro dans bits.h. C’est un oubli plus que malencontreux. Elle devrait se nommer, pour rester cohérent BS_ISSET (un bit est-il présent dans un bitset)