Forum Programmation.c++ Création de procédures en texte simple

Posté par  (site web personnel) . Licence CC By‑SA.
2
2
nov.
2020

Bonjour à tous,
je suis en train d'écrire un petit logiciel qui sert à piloter et à configurer des circuits intégrés. Ces circuits intégrés sont ce qu'on appelle des ASICs, c'est à dire qu'ils ont été spécifiquement conçus pour l'expérience pour laquelle je travaille. Ce ne sont donc pas des composants "standards", mais ça n'est pas vraiment important.

Avec ce petit logiciel nous sommes capables, entre autre chose de stocker une valeur dans un registre de configuration, relire cette valeur, injecter un signal sur le circuit, lire la ou les valeurs qui sortent du circuit suite à cette injection et les afficher dans de beaux histogrammes et plein d'autres choses, La liste est longue :)

J'écris ce logiciel en Qt5/C++ pour avoir une interface graphique, c'est franchement plus simple en période de test. J'ai pris soin de séparer la partie graphique et les autres parties, comme par exemple la communication, les calculs…

Le graphique c'est bien mais des fois on voudrait bien automatiser certaines taches ou créer des procédures et surtout que n'importe qui puisse écrire des procédures. L'idée c'est d'avoir une sorte de langage très simple pour écrire des suites d'instructions, éventuellement une instruction if/else, boucle type for. Un petit interpréteur rudimentaire va lire ces suites d'instructions depuis un fichier texte et exécuter ces suite d'instructions. Par exemple :
- écrire_dans_registre, adresse_registre, données_registre;
- attendre, temps attente;
- lire_registre, adresse_registre, afficher_valeur;
- injecter_sur_circuit, adresse_circuit, valeur_injection;
- lire_valeur_codée_par_adc, stocker_dans_vecteur valeur_codée_par_adc
- tracer_vecteur_dans_graph;
- …

J'ai pensé à plusieurs chose comme par exemple du yaml ou peut être du xml mais je ne sais pas si c'est le mieux pour faire ca… Dans tous les cas faut que ca reste simple, à faire et à prendre en main car ni moi, ni les gens qui vont utiliser cette fonctionnalité ne sommes codeurs. On maîtrise tous, à des degrés différents, l'outil informatique mais on est pas des experts de haut vol, juste des gens motivés pour faire le travail au mieux :)

Je me tourne vers vous pour avoir votre avis et savoir comment vous vous y prendriez pour faire une telle chose car je sèche un peu.

Merci d'avance pour votre aide et vos réponse.

Bonne journée

Olivier

  • # Piste(s)

    Posté par  . Évalué à 3.

    Oulala, ça n'a pas l'air simple au niveau humain.
    Bon, est-ce qu'on peut faire la supposition suivante ? Vu que

    J'écris ce logiciel en Qt5/C++ pour avoir une interface graphique

    donc au moins une personne est assez qualifiée pour coder une sorte d’interpréteur et toutes les "actions" découlant de l'interprétation des commandes du fichier ?

    Ça suppose de ne pas pousser le bouchon trop loin, par exemple : pas de vérification de syntaxe ou pas trop poussée.

    Partant de là, il est assez simple de lire un fichier ligne par ligne grâce à Qt. STFW si je peux me permettre : des choses autour de QFile, readLine (de tête).
    Ensuite, pour chaque ligne, un .split(" ") par exemple, pour séparer en "mots".

    Après, oserais-je dire : yapuka ?

    • [^] # Re: Piste(s)

      Posté par  (site web personnel) . Évalué à 1.

      Bonjour et merci pour ta réponse.

      Oulala, ça n'a pas l'air simple au niveau humain.

      Alors c'est pas toujours facile pour tout mais on s'en sort.

      Partant de là, il est assez simple de lire un fichier ligne par ligne grâce à Qt. STFW si je peux me permettre : des choses autour de QFile, readLine (de tête).

      Bin c'est justement parce que je trouvais pas vraiment sur internet que je suis venu demander à des vrais gens :) Et puis surtout, ne pas réinventer la roue. Pour l'instant je pensais effectivement faire simple avec du pseudo-script, sans boucle ni condition… une ligne = (une instruction + ses arguments). Je ne garde que ce qui est utile sur la ligne, si il y en a plus je jette. Lecture séquentielle, pas de vérif ou presque. Ce qui correspond à lire un fichier ligne par ligne, split, interprète, exécute les instructions et recommence jusqu'à la fin du fichier.

      Les logiciels de traitement de texte sont à la rédaction ce que la 2CV est à l'automobile, une vieille voiture dont on se souvient avec nostalgie mais technologiquement dépassée

  • # le boulot est deja fait

    Posté par  . Évalué à 2.

    J'écris ce logiciel en Qt5/C++ pour avoir une interface graphique, c'est franchement plus simple en période de test. J'ai pris soin de séparer la partie graphique et les autres parties, comme par exemple la communication, les calculs…

    tu as donc une partie graphique, qui prend les infos de l'utilisateur
    et une partie "communication" qui envoie ces infos à l'appareil.

    à toi de coder une partie script pour envoyer la bonne serie de commande à partir d'un fichier.

    ca pourrait etre, histoire d'être à la mode :
    - un fichier json, c'est un ensemble de couples paramètre/valeur
    ou
    - du scripting ansile pour ensuite jouer un "playbook" qui va automatiser une sequence de commande

  • # Artillerie lourde

    Posté par  . Évalué à 3.

    C'est surement totalement sur-dimensionné, mais tu peux aussi intégrer l'interpréteur Lua dans ton logiciel.

    Les vrais naviguent en -42

    • [^] # Re: Artillerie lourde

      Posté par  (site web personnel) . Évalué à 1.

      bonjour et merci pour ta réponse.
      C'est séduisant comme proposition mais dans un premier temps probablement trop compliqué. Il faut que je propose un démonstrateur rapidement… Et vu que je ne saurai pas comment m'y prendre, je vais faire simple.

      Les logiciels de traitement de texte sont à la rédaction ce que la 2CV est à l'automobile, une vieille voiture dont on se souvient avec nostalgie mais technologiquement dépassée

  • # if, boucle

    Posté par  . Évalué à 4.

    Salut,

    Tout le début me semble assez jouable.

    Par contre, pour le if, le for (ou tout autre boucle), j'ai peur d'une grosse galère en yaml ou xml, pour toi et tes utilisateurs.

    Sûr, c'est faisable, je pense par exemple à helm, mais quelle galère… rien qu'à l'usage.

    Face au problème et s'il y a des contraintes de temps, j'opterais pour cette voie :
    - se baser sur un langage de script (python ?) afin de bénéficier de sa REPL,
    - développer un module spécifique contenant les fonctions de base,
    - le charger automatiquement lors de l'évaluation.

    Si jamais ça t'inspire…

    Python n'est qu'un exemple ;)

    Matricule 23415

  • # syntaxe ligne de commande

    Posté par  . Évalué à 2. Dernière modification le 03 novembre 2020 à 21:40.

    Tu pourrais inventer une syntaxe simple ressemblant à un script shell, mais très simplifié :

    • chaque ligne est une instruction de type ligne de commande
    • chaque ligne de commande est constituée d'un nom de fonction suivi d'arguments
    • on peut utiliser des variables

    Avantages :
    - ça reste simple
    - tu peux l'adapter à ton besoin

    Inconvénients :
    - tu dois le coder toi-même
    - ça pourrait être trop simple et trop limité

    Exemple :

    ecrire_dans_registre 0x1000 0xFFFFFF
    set X 0
    
    L1:
    
    lire_registre 0x1000
    injecter_sur_circuit 0x80100 0x1020
    lire_valeur_codee_par_adc ...
    attendre_ms 1000
    add X 1
    
    if_inferieur_goto $X 100 L1
    
    tracer_vecteur_dans_graph
    
  • # Python et CPython

    Posté par  . Évalué à 1.

    Pourquoi pas écrire une petite lib en python du genre wrapper avec CPython pour appeler le code métier ?

    Comme ça tes utilisateurs "n'ont plus" qu'à coder en python leur interaction et taches dont ils ont besoin :)

    • [^] # Re: Python et CPython

      Posté par  . Évalué à 1.

      Quoique… je me demande si appeler du C++ a l'aide de CPython ne demande pas quelques prérequis en plus…
      (ABI toussa, toussa)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.