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
|
|