From 2e59700bfa2c38ddd3309d1d843487db5fc741ed Mon Sep 17 00:00:00 2001 From: wissal bendidi Date: Thu, 27 Jun 2024 11:12:33 +0200 Subject: [PATCH] functionalities --- api_server/__pycache__/app.cpython-312.pyc | Bin 10579 -> 11342 bytes api_server/__pycache__/state.cpython-312.pyc | Bin 2455 -> 2491 bytes api_server/app.py | 15 +++++++++ api_server/state.py | 7 +++- api_worker/__init__.py | 31 +++++++++++++++--- .../__pycache__/__init__.cpython-312.pyc | Bin 9642 -> 10555 bytes cocosim.log | 19 +---------- modele/__pycache__/cocosim.cpython-312.pyc | Bin 2799 -> 2799 bytes modele/__pycache__/composants.cpython-312.pyc | Bin 14395 -> 14907 bytes modele/__pycache__/donnees.cpython-312.pyc | Bin 18209 -> 18209 bytes modele/__pycache__/elements.cpython-312.pyc | Bin 27389 -> 28452 bytes modele/__pycache__/graphe.cpython-312.pyc | Bin 11726 -> 11770 bytes modele/composants.py | 11 ++++++- modele/config.json | 3 +- modele/elements.py | 20 +++++++++++ modele/graphe.py | 3 +- schemas_v1/output-file.ccs | 1 + schemas_v1/output-file11.ccs | 1 + 18 files changed, 84 insertions(+), 27 deletions(-) create mode 100644 schemas_v1/output-file.ccs create mode 100644 schemas_v1/output-file11.ccs diff --git a/api_server/__pycache__/app.cpython-312.pyc b/api_server/__pycache__/app.cpython-312.pyc index 5d83b0ab37a2af9d29ff0986f4781443530f42a0..6a74406ce03b2702b8176311a9529a90e3106683 100644 GIT binary patch delta 648 zcmcZ{bS{GLG%qg~0}y=u|2s8OY$Bfoo|$DvAK{m=lZAs|15Hb4zm)OEUBG6u`16 zMUg1HyB@(HowAR zaf4f~NE|3##j9VGT3nio*MU(`2eLtw7L|iE3L!ZSB96mtf)H6`$JGE0I1G23Fw}7t z8=NmnTU=qWyumF$Ial!^YZFk(>CM4P;>?V7le1Oz7#k+fQq{1k2MQN80tro)TP(m( zDl6&%iS&Vp3LsI;0wffG01`GVxrv#1MN@!cmnZ*GJt?Sii#XaXE~77%0fU@Q^`iUR-wP&jq~ diff --git a/api_server/__pycache__/state.cpython-312.pyc b/api_server/__pycache__/state.cpython-312.pyc index 71d9a07282969f54725a21c176ad194b3daa2524..b4ec3c3b0c189ec3b4d205a70b49b982f76c5f9c 100644 GIT binary patch delta 812 zcmZWn&rcIk5Z>3_ZkM*(wX{-7OWV*=vx1605~ES6l5oJpMD%1NYqc9wN-4g#9O$Jz za3}`?n|F|ZftYyks3(o_;zi-0tp9>0O(PfM!I@o&HSFP=dGqG`X5N>59(xm0KdNd_ zfNy8!x7oGT1@h3Y<$X_yy?r5A39SncB5Pq?wLhFv9C_YcDp#5P<2_OND^epNp79+j z8nAVVMtMpskU?G&vn0wNiE|{*Ux@E+o`7pdT4ar7$6r~kuP};)T|%P}7y-!9LF@@w z4FlVn>OHG$nP>kV6a1xg9kjkncP~Y-Pce+DWm3bSWB)7ABAlBMkA2iM%AfgDK;QJ= zpC5;N-RI7y!;l{nz+yAx3BZgx%Rzyi1ZWFiwb)i`qxD5AeAWv4TJe)oq^|76K3PYq znQQEru8z7vPZt~V{I#5cr4Hm$(Pa~NDP43;p($vmX&fyAZCU@C)BU@UgPGtpm%n9K*!m3SM-#&Hui000srsgAU%xsOP4RY?pX zpPoVJca~pOCPpUvc^Qufr8~ODTgp@`3Aq!xMa^<;rBPkB7>%LKC_)|qSNA-}4d?{I zIfU~7y8?}4j=uqwjsO!j1F$X}s6%^+>3y}-p6$v)JiUFoeY+=1{%kKS`6qi}K0GkC z;7T9~Y|KG$u!3+3>RmsikJ79Na@Z#HOyJ$!HS=KH>R@7unzpV{Vn)9h8? zR~`5f-0YY$!t3jNIH%65VkedsDe{8!i8rK1;-aD+8cC3Ol=TZw zE0UC$)?8wWCG9q`#Y^pN$%5;UF7n1w7+YAbKj91oyM*;a;RK+-QeuZXz<*7z0v^%3 z7fe(czW=BhFyCiqy0~y;C4klB{pM^l7&|6qMJt9TH}nVhig53#@+Fo*!AS#bt|lS_ zc%#mTpuqV5_{$!Myw4La(4QVY{;s5!bN8jGa7YVL-r{`g) zpZa83s)-!R)8zUr2XyA((;7gbfKl9uXPseeVL&jATWZs7YtwqJ?HNNb$a=h*M=OXB zvxPO07?OaiP^HDkxSPg^cn<(r') +def pause_simulation(obj): + if not PROCESS_BASE.known(): + return "Unknown", 401 + + PROCESS_BASE.cmd_q.put({'cmd': "pause", "arg": obj}) + return "Simulation paused" + +@app.route('/resume/') +def resume_simulation(obj): + if not PROCESS_BASE.known(): + return "Unknown", 401 + + PROCESS_BASE.cmd_q.put({'cmd': "resume", "arg": obj}) + return "Simulation resumed" def just_run(): """ diff --git a/api_server/state.py b/api_server/state.py index 9cba09c..74594e6 100644 --- a/api_server/state.py +++ b/api_server/state.py @@ -3,7 +3,11 @@ import json class State(object): IGNORE = frozenset(['Coude', 'Noeud', 'P24', 'P0', 'Pulse']) + # these components do not have any states (value/ true or flase...) + Breakpoints = ['Relais'] + #possibility to add other breakpoints in the future ;) + def __init__(self, cocosim_server): self.cocosim_server = cocosim_server self.conf = self.cocosim_server.conf["ui"] @@ -38,4 +42,5 @@ class State(object): self._exception = e def reset_exception(self): - self._exception = None \ No newline at end of file + self._exception = None + diff --git a/api_worker/__init__.py b/api_worker/__init__.py index 4668ecb..3e99e02 100644 --- a/api_worker/__init__.py +++ b/api_worker/__init__.py @@ -14,6 +14,7 @@ class CocosimInstance(object): conf_fp = open("modele/config.json") conf = json.load(conf_fp) + self.pause_simulation = False #pause flag self.conf = conf self.dt = self.conf['circuit']['DT'] self.cocosim = None @@ -47,15 +48,19 @@ class CocosimInstance(object): if message == "start": logging.log(logging.INFO, "Starting") self.runner = asyncio.create_task(self.run()) + elif message == "stop": logging.log(logging.INFO, "Stopping") await self.stop() + elif message == "state": self.state_q.put(self.state.to_json()) + elif message == "quit": logging.log(logging.INFO, "Quitting") await self.stop() self.quit = True + elif message == "load": logging.log(logging.INFO, "Loading file") try: @@ -63,6 +68,17 @@ class CocosimInstance(object): self.state_q.put("OK") except GraphStructException: self.state_q.put("Error") + + elif message == "pause": + but_name = data['args'] + logging.log(logging.INFO,"Simulation paused {but_name}") + self.pause_simulation = True + + elif message == "resume": + but_name = data['args'] + logging.log(logging.INFO,"Simulation resumed {but_name}") + self.pause_simulation = False + elif message == "push": but_name = data['args'] logging.log(logging.INFO, f"Push button {but_name}") @@ -103,12 +119,17 @@ class CocosimInstance(object): async def run(self): try: - while True: - self.state.reset_exception() - self.cycle() + while not self.quit: + if not self.pause_simulation: + self.state.reset_exception() + self.cycle() + else: + print("Simulation paused. Awaiting resume...") + while self.pause_simulation: + await asyncio.sleep(1) #wait until the simulation is resumed await asyncio.sleep(self.dt) - except: - logging.exception("Exception occured in 'cycle'") + except Exception as e: + logging.exception("Exception occured during simulation run") async def stop(self): if self.runner: diff --git a/api_worker/__pycache__/__init__.cpython-312.pyc b/api_worker/__pycache__/__init__.cpython-312.pyc index 3f974cef150b32f7df4c338a3de7e3da4c284b36..fe05b87329cbe71b921b6cb8ba4d92ba92ada778 100644 GIT binary patch delta 2651 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 azRs2+)t=*o)Sc~q#Nq!#$_u1IUHlIM9s*1N diff --git a/cocosim.log b/cocosim.log index 32f7cbb..118e628 100644 --- a/cocosim.log +++ b/cocosim.log @@ -1,19 +1,2 @@ INFO:root:Creating instance -INFO:root:Loading file -INFO:root:Setting up -INFO:root:Schema is loaded -INFO:root:State is made up with 5 items. -INFO:root:Graph is initialized. -INFO:root:Cocosim is initialized -INFO:root:Starting -INFO:root:Push button b -INFO:root:Release button b -INFO:root:Stopping -ERROR:root:Exception occured in 'cycle' -Traceback (most recent call last): - File "C:\Users\0203209E\Downloads\gittea\cocosim_python\api_worker\__init__.py", line 109, in run - await asyncio.sleep(self.dt) - File "C:\Program Files\Python312\Lib\asyncio\tasks.py", line 655, in sleep - return await future - ^^^^^^^^^^^^ -asyncio.exceptions.CancelledError +INFO:root:Cocosim instance destroyed diff --git a/modele/__pycache__/cocosim.cpython-312.pyc b/modele/__pycache__/cocosim.cpython-312.pyc index eb8bd23d177ff5869d04bdffb2ca21d74b057347..0cbc9bae0ef338817a43dc8849c7ff7b440e049d 100644 GIT binary patch delta 20 acmaDa`d*a#G%qg~0}!+s{@KX=gbM&eVFq9T delta 20 acmaDa`d*a#G%qg~0}#mlyStJ52^RoFyauKK diff --git a/modele/__pycache__/composants.cpython-312.pyc b/modele/__pycache__/composants.cpython-312.pyc index a0ae8614045f39994d1b1e2eba020e6e56505d4d..c25e5fc1d2354e5a116016bbd618cb2743ce8ebe 100644 GIT binary patch delta 2816 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 diff --git a/modele/__pycache__/donnees.cpython-312.pyc b/modele/__pycache__/donnees.cpython-312.pyc index 1e61176de8f6b65b0983a0ceab9096382266cf1e..8bb58234996941446f9f6715970d9c2813ad89d1 100644 GIT binary patch delta 23 dcmZ43$GEVMk>@loFBbz4_)cI-+sGs84ggI#1-bwL delta 23 dcmZ43$GEVMk>@loFBbz4{QY}3bt8|cI{;eI2eAME diff --git a/modele/__pycache__/elements.cpython-312.pyc b/modele/__pycache__/elements.cpython-312.pyc index e85419f10ebcdb2104ce9c305757d9f2bc2a03ff..f73fbccd7b6ef4c1aab98beaee99104d0a6b3636 100644 GIT binary patch delta 3340 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 M_$}eZ`f(&x&QzG delta 2412 zcmaJ?3s98T73OT%A9t5sK^9pS*yT+Yqm{%Ljqb=4}a5D{!rqs4%oI;|}*fd*1O**kkTU%0Wjcvx>a~EwMGu>f6?tkug zzI)HP=iK|^1buRzEMsP~F--pc{mFa2U6n(YSFN-RL&h9TTNB|gHU^So>-2hIk`x@8 zorz(G6+PBiTyj__2iF{~$bZfveZH6@38E2Q8{^^5_62_893grLE9WNR+bPlX1iqWH zE3TJ0+awI!A!hS9WI$l`RM#Akl~D8Y>Re>Cu;Eq(Mv-q~UPZWi1dA7%NQ2i8}-I3OZeRv>RlM!7*35 zaVrZl?8imdV%o}i2)MIxwVolz|)Q5ty zL`>z`={zFyFDE|9#HSdRF_iW0Y2U5LqdvP(>mOti_R)UqD6FOr zFchDKzZQOj9!FczLb`;3qI@SeQNG$V#4CCjhH=zkgTEp}`=R{&C=5?kl+ma>lvPMua7vpgyQu}a zGFi@r4(&JWG=|}5C#*~7pwq24c)hLu)*i3dim6&Vo?Up}HO?eWLQuQ+OY1x}i-mII zdKP?Uw_+K`)0L%^gtL|6e@Vqx-8LFJ(j0@YRAtaRfn8PQx`Zn?*<#1IGY95ZFT17EfGwoVi?V6?1BF?a{T3W5AB2c2kN|{Az0+}`G zR2^7a(?<6H%ZmO*qiJF#Q=+nSFLDgL)k0u!Yg7%Iiz9@|^@h8J1l2`lbCD{k3 z==-ROibs0!I=p`W%i3Y4{0KYOcnsTkXFrzTC@d|piK9F-D4|;?AvrnJT0^K@Mkn6)u$(Lpx-iuKgHz^{k+ zHN)p`36;tla;BF(Ucc=z8tB?+p;XR{%P{j!$Z=3Fe4SgmgAqNVertVeyBNoz+89mU z|8L;6Xgl7nO_XoRRP7tFs=6XrR<)?cqqlJG%a!sB=G3*`?oGRPgr~mHmj>=j-q3kf zxx4Xroh?EfW$tg0yUA%X@NgM3xJBcQsv^Rr@fq}P;s)*Cv_Y5gE)#+b+@#emvrq+U z+9Fzg{+{}t)-8T9ibU_7pKDcH3hTQfLKh_8+QP!X-a-|c8GF4Y6bOuXy=1cRW@a;l zF3N@V2{eM*`g5kgNrx+35#lOJ8*)r$CN1Fa575z2M88CT!)Y21bT+2aJSGQq4b4Ga zOS726%&Q?wle9F+cSCuH7Q@e*O6YXpT2r=eu3A}bZHkrc3>HGl@?@-QPN2)O_5QA1 zWxY?gU8zn?t9m=zV$-I0_L?dqOY3B$QdF%cbxzu15cfb5P0Ri(fbW41lP=2@2K1qu zO&x^dtD8ph-&zub-nJy&4Z{2FaTsj-C}NVgX{VSUHG%qg~0}y<8@GJH7M&43(Mz6`u?6zVlj5Q4LEFc*WsASM&@^jN_CJ)khsN`m!DdiQhbXkH?_zSB)}PvUy_ze0K6#~V4x{#FF}Xwz#;KDl)RyvA0%bLsiugc^ zswQix8!^tG9IO6Kq5&vSCFow1SdfvbmzkGY5}#a|oRhj}bGC*Zqi_>YwwM`6C@3ft z2?Ob(*2#M`B^Z}ZzN-00wGkxC1eS$Jb^zH`yimhR3sMqGQddm=rlrr=JXuY9w?+xN z`Yw=q0jT=q{EXD1)V$=>)ss1OKw2zyjO5FKDvD}AL>-7|01>Sq0%TQD*W@l82Ub>A t?N5A@&+B+G`c0P7m0}E=Y^oc>IC1hMU2VYtCPs^nu&)dtx=0eJ2LL$Ygd6|> delta 429 zcmewreJ+~!G%qg~0}%ZBdpC8#M&43(Mw`ja?6#bh3`HD3VNI6F*Vq*%^Kuw7%1w6U zkZ0=U*__3}FU;sZxk~z;nh8)zkp+mb1`)O(!VXB>V#~`?w*n}u$yCG#QdBuPOx=ia z-sDd8Z;bVm8#Kfi7jB-eVaKS`2$U^m1`-Mi3Pr*or7b|BO4z+9u^=N=uOP9wI5j>w zF(rvarg0;+gzg z$4kZ+D0quMH$NpcCshxKb5rw5ii`L`N<$|n>c%imn7mI{ThO10(V`>lD+7owk_5^E E08+JarT_o{ diff --git a/modele/composants.py b/modele/composants.py index 9382e80..7a41846 100644 --- a/modele/composants.py +++ b/modele/composants.py @@ -1,6 +1,5 @@ from modele.exceptions import NonPolariseException, Dir - class Composant(object): def __init__(self, conf, nom): """ @@ -38,6 +37,10 @@ class Composant(object): def etat(self): raise NotImplementedError + + def pause_simulation(self): + + pass class Contact(Composant): @@ -117,6 +120,8 @@ class Relais(Composant): self._contacts_repos = [] self._contacts_double = [] self.haut = False + self.etat_precedent = False #etat precedent du relais + self.est_point_arret = False #indicateur de point d'arret def add_travail(self, nom): self._contacts_travail.append(nom) @@ -150,12 +155,16 @@ class Relais(Composant): self.graphe[nom].desactive() def update(self): + etat_precedent = self.haut super().update() if self.branche.i() >= self.SEUIL: self.monte() else: self.chute() + if self.est_point_arret and etat_precedent != self.haut: + self.graphe.flag_arret_simulation = True + def etat(self): return self.haut diff --git a/modele/config.json b/modele/config.json index cdc17c8..ac4bbd7 100644 --- a/modele/config.json +++ b/modele/config.json @@ -13,7 +13,8 @@ "RES_RELAIS": 100.0, "SEUIL_RELAIS": 0.05, "SEUIL_TEMPO": 0.05, - "PULSE_PERIODE": 1.0 + "PULSE_PERIODE": 1.0, + "TOLERANCE_COURANT": 1e6 }, "ui": { "DT": 0.13, diff --git a/modele/elements.py b/modele/elements.py index c03400e..3ba55f2 100644 --- a/modele/elements.py +++ b/modele/elements.py @@ -138,6 +138,26 @@ class Noeud(Element): def etat(self): return self.u() >= self.conf['USEUIL'] + + + + def verifier_loi_des_noeuds(self): + + """Dans cette méthode, self._voisins contient les branches connectées au nœud, et polarite indique si le courant est entrant (-1) ou sortant (+1). + La variable courant_total accumule la somme des courants, et self.conf['TOLERANCE_COURANT'] est une petite valeur seuil pour tolérer des imprécisions + numériques (par exemple, 1e-6).""" + + courant_total = 0 + for voisin, polarite, _ in self._voisins: + if polarite == -1: + courant_total -= voisin.i() + else: + courant_total += voisin.i() + + if abs(courant_total) > self.conf['TOLERANCE_COURANT']: + raise Exception(f"La loi des nœuds n'est pas respectée pour le noeud {self.nom}. Total courant: {courant_total}") + + class Branche(Element): diff --git a/modele/graphe.py b/modele/graphe.py index 574c49d..3dcc1b3 100644 --- a/modele/graphe.py +++ b/modele/graphe.py @@ -38,6 +38,7 @@ class Graphe(object): self.elements = None self.composants = None self.vecteur = None + self.flag_arret_simulation = False def load_data_from_schema_reader(self, reader): self.elements = {} @@ -168,4 +169,4 @@ class Graphe(object): [elt.update() for elt in self.elements.values()] def coherence(self): - [x.coherence() for x in self.elements.values()] + [x.coherence() for x in self.elements.values()] \ No newline at end of file diff --git a/schemas_v1/output-file.ccs b/schemas_v1/output-file.ccs new file mode 100644 index 0000000..18f43ea --- /dev/null +++ b/schemas_v1/output-file.ccs @@ -0,0 +1 @@ +{"blocs":{"p24-1":{"type":"P24","valeur":24,"orientation":0,"x":0,"y":500},"p24-2":{"type":"P24","valeur":24,"orientation":0,"x":0,"y":300},"p0-1":{"type":"P0","valeur":0,"orientation":0,"x":1200,"y":500},"p0-2":{"type":"P0","valeur":0,"x":1200,"y":300},"r1":{"type":"Relais","x":400,"y":500},"r2":{"type":"Relais","x":1000,"y":500},"c3":{"type":"Bouton","x":200,"y":500,"orientation":0},"r2.double":{"type":"ContactDouble","relais":"r2","orientation":0,"x":1000,"y":300},"w1":{"type":"Lampe","x":600,"y":500},"w2":{"type":"Lampe","x":600,"y":300},"n1":{"type":"Noeud","x":800,"y":500},"coude1":{"type":"Coude","x":800,"y":310}},"cables":[["p24-1","d","c3","g"],["c3","d","r1","g"],["r1","d","w1","g"],["w1","d","n1","m"],["n1","m","r2","g"],["r2","d","p0-1","g"],["n1","m","coude1","m"],["coude1","m","r2.double","hg"],["r2.double","d","p0-2","g"],["p24-2","d","w2","g"],["w2","d","r2.double","bg"]]} \ No newline at end of file diff --git a/schemas_v1/output-file11.ccs b/schemas_v1/output-file11.ccs new file mode 100644 index 0000000..d7f3670 --- /dev/null +++ b/schemas_v1/output-file11.ccs @@ -0,0 +1 @@ +{"blocs":{"p24-1":{"type":"P24","valeur":24,"orientation":0,"x":0,"y":500},"p24-2":{"type":"P24","valeur":24,"orientation":0,"x":0,"y":300},"p0-1":{"type":"P0","valeur":0,"orientation":0,"x":1200,"y":500},"p0-2":{"type":"P0","valeur":0,"x":1200,"y":300},"r1":{"type":"Relais","x":400,"y":500},"r2":{"type":"Relais","x":1000,"y":500},"c3":{"type":"Bouton","x":200,"y":500,"orientation":0},"r2.double":{"type":"ContactDouble","relais":"r2","orientation":0,"x":1000,"y":300},"w1":{"type":"Lampe","x":600,"y":500},"w2":{"type":"Lampe","x":600,"y":200},"n1":{"type":"Noeud","x":800,"y":500},"coude1":{"type":"Coude","x":800,"y":310}},"cables":[["p24-1","d","c3","g"],["c3","d","r1","g"],["r1","d","w1","g"],["w1","d","n1","m"],["n1","m","r2","g"],["r2","d","p0-1","g"],["n1","m","coude1","m"],["coude1","m","r2.double","hg"],["r2.double","d","p0-2","g"],["p24-2","d","w2","g"],["w2","d","r2.double","bg"]]} \ No newline at end of file