[LINUX] Essayez de développer quelque chose de proche de l'intégration avec TDD ~ Problème ~

introduction

C'est une continuation de ce qui suit.

Essayez de développer quelque chose de proche de intégré avec TDD ~ Préparation ~

Nous réfléchissons au contenu en temps réel, donc si vous avez des opinions ou des demandes, n'hésitez pas à nous contacter. Le code est disponible sur github

Changements et décisions de la dernière fois

Outil de création

Modification de l'outil de construction d'Autotools en CMake. CMake version 2.8 ou ultérieure est un environnement requis.

Code produit

Le code produit doit être en langage C. Je n'ai pas l'intention d'écrire du code très compliqué, donc je prévois de continuer en langage C brut. Si votre code se complique, envisagez d'utiliser glib.

Quoi faire

** Appuyez sur le bouton «A» du clavier pour allumer et éteindre le voyant de verrouillage des majuscules. ** **

Pour le moment, nous partirons d'ici et élargirons les spécifications avec les sentiments, les idées et les retours sur place. Sauf pour le code affiché cette fois, nous le ferons avec TDD. Au final, j'aimerais dire que j'ai pu le porter correctement en utilisant du matériel autre que le clavier avec un autre matériel tel que Razzpie, félicitations! Je n'ai sélectionné aucun matériel vraiment spécifique pour le moment. Vous voyez, cela ressemble plus à du développement réel, n'est-ce pas?

Présentation du problème

Maintenant, lorsque vous revenez à ce que vous faites et que vous appuyez sur le bouton "A" du clavier, le voyant de verrouillage des majuscules s'allume et s'éteint **, quel type d'implémentation aurez-vous lorsque vous créez un programme?

Si vous le faites honnêtement, ce sera un pseudo code comme celui-ci.

static void mainloop() {
  do {
Obtenez l'événement clé
    if (Un bouton a été enfoncé) {
      write(Basculer la LED);
    }
  } while (Jusqu'à ce qu'une condition soit remplie);
}

int main() {
  mainloop();
  return 0;
}

Lorsque j'ai créé le pseudo code ci-dessus, il est devenu le code suivant. Vous avez confirmé le fonctionnement de libevdev dans le test précédent pour comprendre la bibliothèque.

#define KEYBOARD_DEVICE "/dev/input/event2"
#define LED_DEVICE      "/sys/class/leds/input2::capslock/brightness"

#define KEY_RELEASED 0
#define KEY_PRESSED 1

static void mainloop() {
  struct libevdev *dev = NULL;
  int key_fd = open(KEYBOARD_DEVICE, O_RDONLY|O_NONBLOCK);
  int rc = libevdev_new_from_fd(key_fd, &dev);

  if (rc < 0) {
    fprintf(stderr, "Failed to init libevdev (%s)\n", strerror(-rc));
    exit(1);
  }

  int led_fd = open(LED_DEVICE, O_WRONLY|O_NONBLOCK);
  if (led_fd < 0) {
    fprintf(stderr, "Failed to init LED device.\n");
    exit(1);
  }

  bool led_on = false;
  do {
    struct input_event ev;
    rc = libevdev_next_event(dev, LIBEVDEV_READ_FLAG_NORMAL, &ev);
    if (rc == 0) {
      if (ev.type == EV_KEY && ev.code == KEY_A && ev.value == KEY_PRESSED) {
        led_on = !led_on;
        char buf[2];
        snprintf(buf, 2, "%d", led_on ? 1 : 0);
        write(led_fd, buf, 2);
      }
    }
  } while (rc == 1 || rc == 0 || rc == -EAGAIN);

  libevdev_free(dev);
  close(key_fd);
  close(led_fd);
}

int main() {
  mainloop();
  return 0;
}

Si vous avez un environnement Linux, vous pouvez l'exécuter. Veuillez vous référer à l'article précédent, vérifier le périphérique clavier et le périphérique LED, et corriger les chemins des deux macros (* KEYBOARD_DEVICE, LED_DEVICE *). Lorsque je construis et exécute ** build / bad_example / bad_example **, la LED s'allume et s'éteint à chaque fois que j'appuie sur la touche "A" (l'autorité racine est requise selon l'environnement).

Maintenant, ce code a l'air bien à première vue, mais il a beaucoup de problèmes.

Pour ces raisons, à mesure que l'expansion des fonctions se répète, il devient de plus en plus difficile d'ajouter des fonctions, et il devient difficile d'ajouter des fonctions sans provoquer de dégraissage.

À partir de la prochaine fois, j'essaierai réellement ce qui se passe lorsque je développerai ce code avec TDD, et j'ajouterai des fonctions dans l'ordre.

Suivant: Essayez de développer quelque chose de proche de celui intégré avec TDD ~ file open ~

Recommended Posts

Essayez de développer quelque chose de proche de l'intégration avec TDD ~ Problème ~
Développons quelque chose qui se rapproche du TDD
Développons quelque chose de proche de intégré avec TDD ~ Revue intermédiaire ~
Développons quelque chose de proche de celui intégré avec TDD ~ Design pattern ~
Développons quelque chose de proche de celui intégré avec TDD ~ édition ouverte de fichier ~
Développons quelque chose de proche de celui intégré avec TDD ~ Version de détection d'entrée de clé ~
Développons quelque chose de proche de l'implémentation avec TDD ~ traitement d'initialisation / de terminaison de libevdev ~
Étapes pour développer Django avec VSCode
[Introduction à WordCloud] Jouez avec le scraping ♬
[Introduction à Python] Utilisons foreach avec Python
Comment lire les données de problème avec Paiza
Développons un algorithme d'investissement avec Python 1