Projet

Général

Profil

Anomalie #309 » communication_herezh_pipe_MR.py

le fichier python - Gérard Rio, 14/11/2021 09:41

 
1
#!/usr/bin/python
2
#-*- coding: utf-8 -*-
3
import subprocess
4
import os #import *
5
import sys
6
import pipes
7
import os.path
8
import re
9
import time
10
import math
11
from math import log,sqrt,cosh,tanh
12
from ctypes import c_int, c_uint, c_float, Union
13
import struct
14
from collections import deque
15
from struct import unpack
16
from struct import pack
17
#Union Tab_car_double_int_1
18
#  {  char    tampon[928];
19
#     double  x[116];
20
#     int     n[232];
21
# byte_buffer -> binary input
22
# var_type -> variable type indicator
23
# Il faut faire l'équivalent de l'union de C de Gérard en python 
24

    
25
# unpack_code = ''
26
#  
27
# if var_type == 'INT':
28
#     unpack_code = 'i'
29
# elif var_type == 'DOUBLE':
30
#     unpack_code = 'd'
31
# elif var_type == 'STR':
32
#     unpack_code = 'b'
33
 
34
# var = unpack(unpack_code, byte_buffer)[0]
35
# 
36
# class MyType(Union):
37
#     _fields_ = [("i", c_int), ("u", c_uint), ("f", c_float)]
38
# 
39
# var = MyType()
40
# 
41
# var.i = unpack("i", byte_buffer)[0]
42

    
43

    
44
#Nommer le fichier .info d'Herezh avec lequel on va communiquer:
45
# filename = input("Veuillez entrer un nom de fichier : ")
46
# try:
47
#  f = open(filename, "r")
48
# except:
49
#  print("Le fichier", filename, "est introuvable")
50

    
51
#Nommer les pipes d'Herezh qui sont toujours les suivants: nom_fonction_nd_envoi_Hz.FIFO et nom_fonction_nd_reception_Hz.FIFO
52
#nom_fonction_nD=raw_input("nom de la fonction nD? ")
53
# ma_fct_nD_W2_reception_Hz.FIFO
54
#nom_fonction_nD=input("nom de la fonction nD? ")
55
nom_fonction_nD='ma_fct_nD_W2'
56
nomPipeOUT=nom_fonction_nD + '_envoi_Hz.FIFO'
57
#print "Le nom du envoi d Herezh est:",'%s'%nomPipeOUT
58
print("Le nom du envoi d Herezh est : ",nomPipeOUT)
59
nomPipeIN=nom_fonction_nD + '_reception_Hz.FIFO'
60
print("Le nom de reception d Herezh est : ",nomPipeIN)
61

    
62
#Est-ce que les pipes sont crées par Herezh ? 
63
if os.path.exists(nomPipeOUT) and os.path.exists(nomPipeIN):
64
	print("Les pipes ont bien été créés par Herezh: on continue")
65
else:
66
	print("ERROR, le pipe ",nomPipeOUT," ou ",nomPipeOUT," n'a pas été crée par Herezh on arrête la")
67
	exit()
68

    
69

    
70
# On définit un tableau de réception et d'envoi  une grandeur qui correspond à notre retour du python
71
tab_reception=[]
72
#tab_envoi=[] !!! non il ne faut pas declarer le tableau ici !!
73
# une grandeur qui correspond à notre retour du python
74
precision=0.001
75

    
76
# Boucle while avec condition égale 1 
77
while True:
78
	# Ouverture du pipe d'envoi d'Herezh en mode lecture : on va lire les infos d'Herezh
79
	##print("ouverture du pipe en mode lecture pour recevoire les infos d Herezh \n")
80
	PipeOUT = os.open(nomPipeOUT,os.O_RDONLY) #os.O_RDONLY
81

    
82

    
83
	# Herezh donne deux entiers (nbr para et nb retour) ce sont des entiers donc 2*4=8bytes
84
	# J'ai 1 variable de passage dans ma fonction nD externe (1 réelle double=8=8 bytes)
85
	# total de 16 bytes qui est ensuite définit dans la commande read du pipe
86
	line = os.read(PipeOUT, 16)
87
    # On vérifie que la taille est bien de 56 bytes (on peut utiliser cela pour générer des erreurs si on ne retrouve pas le nombre de bytes)
88
	##print("NBR d'octets à avoir :",len(line))
89
	#if len(line)=0:
90
		#print "le calcul est terminé "
91
    	#os.close(PipeIN)
92
    	#os.close(PipeOUT)
93
    	#break
94
    # J'utilise mon tab de reception dans lequel je traduis les bytes d'Herezh en indiquant le type des grandeurs :
95
    #i: entier et d: float double 
96
	tab_reception=unpack("@iid",line) 
97
    # je regarde les grandeurs données traduites: 
98
	##print("le nombre d'argument donné par Herezh est :",tab_reception[0])
99
	##print("le nombre de retour demandé par Herezh est :", tab_reception[1])
100
	##for i in range(2,tab_reception[0]):
101
	##	print(" argument ",i); print("  valeur ",tab_reception[i])
102
#	print("Le premier argument est égal à:",tab_reception[2])
103
#	print("Le deuxième argument est égal à:",tab_reception[3])
104
	os.close(PipeOUT)
105
	##print("fermeture du pipe en mode lecture  pour recevoir les infos à Herezh \n")
106
 
107
 # chgt par rapport au prog de Laurent: je garde 1 valeur
108
	fct1= 6 * tab_reception[2]
109
 
110
	#
111
	#
112
	#
113
    # Je dois renvoyer les deux entiers à Herezh: nbr para et nb retour donc:
114
	tab_envoi=[] # il faut le declarer ici, sinon le tableau ne fait que s'agrandir
115
	# et le retour est toujours le meme !!!!!!!
116
	tab_envoi.append(tab_reception[0])
117
	tab_envoi.append(tab_reception[1])
118
    #Je rajoute le retour de mon fichier python (ici les 1 réel ) dans le tab envoi
119
	tab_envoi.append(fct1) # 2
120
    #On traduit en byte pour le pipe
121
	transformation=pack("@iid",tab_envoi[0],tab_envoi[1],tab_envoi[2])
122
    #transformation=pack("@iiddddddddd",tab_envoi[0],tab_envoi[1],fct1,fct2,fct3,fct4,fct5,fct6,fct7,fct8,fct9)
123
    # ici j'indique avec @iiddddddddd exactement le format de retour: 2 entiers et 9 reels
124
    # On écrit
125
	# Ouverture du pipe de reception d'Herezh en mode écriture : on va donner les infos du python
126
	##print("ouverture du pipe en mode écriture pour envoyer les infos à Herezh \n")
127
	PipeIN  = os.open(nomPipeIN,os.O_WRONLY)
128
	ecriture=os.write(PipeIN,transformation)
129
	##print "the number of bytes written: "
130
	##print  ecriture
131

    
132
	os.close(PipeIN)
133
	##print("fermeture du pipe en mode écriture pour envoyer les infos à Herezh \n")
134

    
135
    
136
    
137
	
(10-10/10)
Redmine Appliance - Powered by TurnKey Linux