09 janvier 2024

Uncrustify & Universal Indent GUI


 

Comment utiliser le très performant, mais mal documenté, indenteur uncrustify avec le très vieux, mais toujours opérationnel, Universal Indent GUI ?

  • Uncrustify est un outil en ligne de commande pour formater des fichiers sources (C, C++, C#, Objective-C, D, Java ...). C’est un outil très flexible (plus de 800 options de formatage !) mais mal documenté. C’est sur ce dernier point qu’intervient Universal Indent GUI car, pour comprendre l’effet de chaque option, rien ne vaut un test grandeur nature sur de vrais fichiers source.
     
  • UniversalIndentGUI, UIGUI pour les intimes, est une interface graphique (écrite avec le framework Qt4) pour tester la configuration de pratiquement n’importe quel indenteur (d’où le nom Universal), ce qui inclut uncrustify. La dernière version date de janvier 2012 mais il fonctionne toujours sur Windows et Linux.

Nous ne parlerons ici que de l’utilisation du couple Uncrustify + UniversalIndentGUI sous Windows, mais le principe reste le même pour les autres OS et les autres indenteurs.

Comme ces deux outils n’ont pas de programme d’installation, et pour éviter les configurations compliquées, nous allons installer uncrustify dans l’arborescente de UniversalIndentGUI (UniversalIndentGUI est conçu pour cela). 

  • UniversalIndentGUI
  1. Télécharger le fichier UniversalIndentGUI_1.2.0_win32.zip depuis SourceForge et l’installer ou vous voulez.
  2. Le répertoire UniversalIndentGUI_win32/indenters ne contient que des vieilleries, renommez le et créez en un nouveau vide 
  • uncrustify
  1. Télécharger la derniere version de uncrustify depuis GitHub (début 2024 c’était uncrustify-0.78.1_f-win64.zip)
  2. Extraire seulement le fichier bin/uncrustify.exe dans le répertoire vide UniversalIndentGUI_win32/indenters
  3. Ouvrir une ligne de commande dans ce répertoire et exécuter :
    .\uncrustify.exe --universalindent > uigui_uncrustify.ini
    Ce fichier .ini (son nom est imposé) contient la description de toutes les options de mise en forme supportées par uncrustify. Ceci signifie que si on met à jour uncrustify il faut régénérer le fichier uigui_uncrustify.ini. Chaque [section] de ce fichier définit une option.

On peut maintenant exécuter UniversalIndentGUI.exe

Il va se plaindre de ne pas pouvoir vérifier si une mise à jour existe. Comme il n’y en en aura plus jamais on va dans Préférences > Préférences > Network et on décoche l’option « Rechercher si une nouvelle version est disponible ». 


Les options dans le panneau de gauche sont les options par défaut de uncrustify. Passer le curseur dessus pour obtenir une aide sommaire sur chaque option. 


Si vous avez déjà un fichier de configuration pour uncrustify vous pouvez le charger via le menu
  Indenteur > Charger un fichier de configuration d’indenteur.
Des exemples de configuration sont aussi dans le fichier zip de uncrustify :
  \share\doc\uncrustify\examples\*.cfg

CONSEILS :

  • UniversalIndentGUI.exe n’est plus maintenu et n’a pas de remplaçant. On n’est pas à l’abri d’un plantage avec perte de la configuration en cours. En conséquence, gardez la trace de vos modifications du fichier de configuration avec git ou en nommant chaque version de manière unique.
  • Habituellement on stocke le fichier uncrustify.cfg dans la racine de chaque projet, plutôt que dans un endroit commun à tous les projets mais inclus dans aucun projet.

 UPDATES:

- Beaucoup de plantages de  UniversalIndentGUI.exe


- Michele Calgaro a entrepris en 2022 de relancer UniversalIndentGUI avec son projet universal-indent-gui-tqt en utilisant TQt v3.x et non Qt5 ou Qt6 ! Michel (Michele en italien) participe aux tests et developpement de uncrustify et est un developpeur du projet Trinity Desktop Environment (TDE).

 

05 janvier 2024

Ajouter un CSE a Firefox


Pour ajouter à Firefox un CSE (Custom Search Engine) ou PSE (Programmable Search Engine) comme ceux proposés sur ce blog pour Perl et C++, il faut procéder en deux étapes  (testé avec Firefox 119 pour Windows):

La première étape n’est à faire qu’une seule fois, elle consiste à activer l’option browser.urlbar.update2.engineAliasRefresh dans la configuration de Firefox.

  • Taper about:config dans la barre d’adresse.
  • Puis taper browser.urlbar.update2.engineAliasRefresh dans le champ de recherche

On obtient ceci si la variable n'existe pas :

Note: Il semble que maintenant cette option soit activée par défaut.
Donc rien à faire si ce n'est vérifier qu'elle soit bien à true.
 

Cliquer sur le « + » à droite, et on obtient ceci, qui prouve que l’option a été ajoutée et initialisée à ‘true’.


La deuxième étape est à effectuer pour chaque nouveau CSE que vous ajouterez.

Aller dans la configuration de Firefox: Settings → Search.
Ou tapez about:preferences#search dans la bare d’adresse.

 


Cliquer sur le bouton « Add » (en bas a droite), et la fenêtre ci-dessous s'ouvre:

 

Compléter les 3 champs sans oublier le %s dans l’url afin d’indiquer à Firefox où insérer les termes de la recherche. Bien sur l’url du CSE dépend de comment est implémenté ce CSE. L’exemple ci-dessus montre comment utiliser le CSE dédié à C++ proposé par ce blog.

CSE / PSE disponibles via ce blog: 

  • C++    https://nohup.yne.fr/2022/01/cpp-cse.html#gsc.tab=0&gsc.q=%s
  • Perl   https://nohup.yne.fr/2023/01/perl-cse.html#gsc.tab=0&gsc.q=%s
  • Qt     https://nohup.yne.fr/2025/08/qt-cse.html#gsc.tab=0&gsc.q=%s 

 

Note: Depuis ~2021 Custom Search Engine (CSE) est devenu Programmable Search Engine (PSE)

17 juillet 2023

Detecteur de Foudre

Voici un petit bricolage autour d'un Arduino UNO pour détecter la foudre (et autres parasites électromagnétique). D'autres cartes du même type feraient l'affaire du moment qu'il y a un convertisseur Analogique/Digital. L'idée est de relier une antenne directement à l'entrée analogique et de voir ce que ça donne. C'est le tout premier pas vers ce que l'on appelle la Radio logicielle ou encore SDR: Sofware Define Radio. 

Rappels: 

  • Le convertisseur A/D du UNO permet de mesurer sur 10 bits  une tension comprise entre 0 et 5 volts.  Donc 0 Volts = 0 ... 2.5 Volts = 512 ... 5 Volts = 1023.

  • Une éclair émet un rayonnement électromagnétique dans le bande de fréquence 1 Hz - 300 Mhz et aussi dans la bande de fréquence du visible.  Si l’éclair atteint le sol, on parle de foudre, et une impulsion supplémentaire dan la bande VLF est émise au environ de 10 kHz. C'est elle que l'on cherche à détecter.

  • Afin d'analyser l'onde captée avec le plus de fidélité possible il faut échantillonner le plus souvent possible. Si la fréquence d'échantillonnage est Fech la fréquence maximum mesurable sera Fech/2 (théorème de Nyquist-Shannon). Donc moins on passera de temps entre deux mesures successives plus la fréquence maximale mesurable sera élevée. 

La première chose que l'on constate est la nécessité de créer un offset de tension sur l'entrée A/D afin de pouvoir mesurer des variations de tension positives et négatives. C'est le rôle du potentiomètre POT1 de 20 Ko. Le but est de régler POT1 pour que la valeur mesurée 'au repos' soit proche de 512. Ainsi une variation positive de tension donnera une valeur entre 512 et 1024 et une variation négative donnera une valeur entre 512 et 0. Le potentiomètre POT2 de 3 Mo permet de régler l’atténuation du signal capté (il ne faut pas saturer l'entré du convertisseur).


Le buzzer sert à faire savoir quand le logiciel qui s’exécute sur le UNO détecte un événement. On peut réaliser de nombreuses expériences au niveaux du logiciel pour essayer de trouver la meilleure solution pour détecter les anomalies. Plus les calculs sont complexes moins on échantillonne souvent et plus basse est la fréquence maximale mesurable. On constate rapidement que la proximité d'appareils électronique induit une onde de 50 Hertz. Si nécessaire, on peut alimenter le UNO avec une batterie et se mettre à l’écart des sources de perturbation, mais on perd alors la liaison USB avec le PC ce qui réduit fortement la capacité d'analyse.

En absence d'orage il est possible de simuler les éclairs en utilisant un allume gaz piézoélectrique à proximité de l’antenne. L'antenne à elle seule est une vaste zone d'exploration. Un simple fils de cuivre de quelque mètres, un fil en forme de boucle, un dipôle ect...
 
Le code DetectionFoudre.ino a les caractéristiques suivantes:
  • Au démarrage, pendant 20 secondes, il mesure la valeur moyenne que la broche du convertisseur A/D et l'envoi sur le port USB. De plus si la valeur est < 512 il éteint la led du UNO et si la valeur est > 512 il allume la led. Ces 20 secondes sont l’occasion d'ajuster POT1 pour recevoir sur le port USB une valeur proche de 512 et avoir la led du UNO qui frétille. L’idéal est d'avoir l'antenne débranché pendant cette étape. Voir fonction calibrate().

  • En envoyant beaucoup de données pendant la boucle principale loop() j'ai eu des problèmes de perte de données. Avant Serial.print() j'utilise donc systématiquement la fonction ws() pour m'assurer qu'il y a suffisamment de place dans le buffer de transmission.

  • Les valeurs lues sur le convertisseur A/D sont stockées dans une file circulaire de N éléments. Les nouvelles valeurs remplaçant les plus anciennes. Quand une événement est détecté (valeur dépassant la moyenne de plus ou moins 30%) on garde les N/3 échantillons précédant cet événement et on capture les 2N/3 échantillons suivants puis on envoi les N échantillons via le port USB et on fait sonner le buzzer. Ainsi on n’envoie sur le port USB une série de N valeurs contenant à coup sur un événement.

  • Pour maximiser la vitesse d'échantillonnage le boucle principale n'utilise pas analogRead() car cette fonction est bloquante. Pour gagner quelques cycles le démarrage et la détection de fin de conversion sont gérés à la main. Ce code permet de faire environ 7400 échantillonnages par secondes : 7.4 kHz soit 135µs entre deux conversions.

 Exemples :

Les valeurs envoyées sur le port USB du UNO sont 

  • capturées avec PuTTY (qui a la possibilité de sauver une session),
  • nettoyées du superflus et sauvées avec l’extension .csv
  • importées dans un tableur pour générer un graphe.

Note:  L'IDE Arduino est capable de faire des graphiques à partir des valeurs reçues sur le port usb mais on ne peut pas sauver ces valeurs ni faire varier l’échelle du temps ni revenir en arrière dans la visualisation. D’où l'utilisation d'un tableur.


Remarques:

  • La ligne rouge (660) est le seuil de détection des événements (foudre).
  • A,B,C,E,F sont des événements réels capturés, en D le doigt était posé sur l'antenne.
  • Comme rien n'est transmis quand il n'y a pas de pics au dessus de 660 il peut s’être écoulé plusieurs minutes en les événements A,B,C,E,F présentés ici.
  • Dans la zone 'F' la 'porteuse' de 50 Hz était mieux captée et dépassait systématiquement la valeur 660 sans que pour autant il y ai de véritables événements. Il faudrait perfectionner le code pour détecter les pics non pas par leur valeurs mais par leur fréquence (vitesse de variation du signal).

Autre exemple avec dépassements supérieurs et inférieurs :


Réseaux de détection de foudre

Ces réseaux utilisent bien sur un système de détection bien plus sophistiqué que celui présenté ici.

Autre technique

Les fréquences radio que l'on cherche à échantillonner pour détecter la foudre sont très faibles. Au point que des cartes prévues pour échantillonner des signaux sonores peuvent être utilisées; Les cartes d'acquisition son échantillonnent à 44 kHz ou 48 kHz et fournissent un flux numérique en USB. Il faut utiliser un adaptateur entre l'antenne et l'entrée micro et un logiciel pour analyser le flux numérique : SAQrx. est l’outil parfait pour cela. Voir ce cas pratique par F6ACU.