Projet

Général

Profil

Anomalie #374 » main.py

Frank Petitjean, 01/10/2024 10:21

 
1
#!/usr/bin/python
2
#-*- coding: utf-8 -*-
3
import os
4
import sys
5
import time
6
from struct import unpack
7
from struct import pack
8
from pathlib import Path
9
import threading
10
import numpy as np
11
import pickle
12
import time
13

    
14
#---------------------------------------------------------
15
#     Chemin d'accès Herezh à mettre à jour
16
#---------------------------------------------------------
17
path_Herezh = '/home/frank/squashfs-root/AppRun'
18

    
19
# Nom fonction nD
20
nom_fonction_nD = 'fext_pressCFD'
21

    
22
# Nombre de noeuds du maillage
23
nombre_elements = 50
24

    
25
# Description du PipeOUT :
26
nb_variable_out = 3  # Nombre de variables sortie fct externe
27
nb_variable_in  = 1  # Nombre de variables entrée fct externe (nb_double_ret_)
28

    
29
def executionHerezh():
30

    
31
    # Lancement Herezh
32
    print('Execution Herezh')
33
    os.system('time ' + path_Herezh + ' -f modele.info > modele.log')
34

    
35
    # Supression des fichers pipes
36
    os.system('rm -f *.FIFO')
37

    
38
 
39
def fonction_externe(nomPipeOUT, nomPipeIN, nb_variable_out, nb_variable_in, pid):
40

    
41
    pid.append(threading.get_native_id())
42
    print('Démarrage fonction externe (pid ' + str(pid[0])+')')
43
    
44
    compteur_elements = 1
45
    
46
    while True:     
47
    
48
        # Lecture PipeOut
49
        PipeOUT = os.open(nomPipeOUT,os.O_RDONLY)
50
        line = os.read(PipeOUT, nb_byte_out)
51
        os.close(PipeOUT)                
52
        
53
        # Décodage du PipeOut (i si entier,  d si float double) 
54
        variable_out = unpack('@ii'+nb_variable_out*'d', line) 
55
        
56
        # Grandeurs transmises par défaut
57
        nbre_arg_out, nbre_arg_in = variable_out[:2] 
58
        
59
        # Grandeurs transmises par la fonction nD
60
        compteur_increment = int(variable_out[2])
61
        temps_courant = variable_out[3]            
62
        stat_vect_position_1 = variable_out[4]            
63
        # stat_vect_position_2 = variable_out[5]            
64
        
65
        # Variable de sortie
66
        v_sortie = 0
67
        
68
        # Encodage du PipeIN et écriture
69
        line = pack('@ii'+nb_variable_in*'d', nbre_arg_out, nbre_arg_in, v_sortie)        
70
        PipeIN  = os.open(nomPipeIN,os.O_WRONLY)
71
        os.write(PipeIN, line)
72
        os.close(PipeIN)                                   
73
        
74
        # Traitement après passage sur tous les éléments
75
        if compteur_elements == nombre_elements:                                         
76
            
77
            print('--Increment {:4d}, Temps {:.4f}, stat_pos_1 {:5.3e}'\
78
                   .format(compteur_increment, temps_courant,
79
                            stat_vect_position_1))
80
                
81
            compteur_elements = 1
82
        else:
83
            compteur_elements += 1
84

    
85

    
86
if __name__ == '__main__':
87

    
88
    nomPipeOUT=nom_fonction_nD + '_envoi_Hz.FIFO'
89
    nomPipeIN=nom_fonction_nD + '_reception_Hz.FIFO'
90
    
91
    # Description du PipeOUT :
92
    nb_byte_out = 2*4 + nb_variable_out*8  # Nombre total de byte
93

    
94
    # initialisation liste contenant le pid du thread2
95
    pid = []
96

    
97
    # Création des threads
98
    thread1 = threading.Thread(target=executionHerezh)
99
    thread2 = threading.Thread(target=fonction_externe,\
100
                args=(nomPipeOUT, nomPipeIN, nb_variable_out, nb_variable_in, pid))
101

    
102
    # Test existance des pipes 
103
    if not os.path.exists(nomPipeOUT) or not os.path.exists(nomPipeIN):
104
        print('Création des pipes')
105
        os.mkfifo(nomPipeOUT)
106
        os.mkfifo(nomPipeIN)
107

    
108
    # Exécution des threads
109
    thread1.start()
110
    thread2.start()
111

    
112
    # On attend la fin thread1 (Herezh)
113
    thread1.join()  
114
 
115
    # Interruption du thread2 (fonction externe)
116
    print('Arrêt fonction externe (kill process)') 
117
    os.system('kill '+ str(pid[0]))
(1-1/5)
Redmine Appliance - Powered by TurnKey Linux