From 896b46a1b100f098b9b733d549ae0487d7422014 Mon Sep 17 00:00:00 2001 From: jinchao <383321154@qq.com> Date: Tue, 27 May 2025 15:16:11 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=BAXNSim=E6=B7=BB=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E4=BB=8E=E6=95=B0=E6=8D=AE=E5=BA=93=E7=9B=B4?= =?UTF-8?q?=E6=8E=A5=E8=AF=BB=E5=8F=96=E6=95=B0=E6=8D=AE=E8=BF=9B=E8=A1=8C?= =?UTF-8?q?=E4=BB=BF=E7=9C=9F=E7=9A=84=E8=83=BD=E5=8A=9B=E3=80=82=E7=8E=B0?= =?UTF-8?q?=E5=9C=A8=E5=90=8C=E6=97=B6=E6=94=AF=E6=8C=81=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E5=92=8C=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E4=B8=A4?= =?UTF-8?q?=E7=A7=8D=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...cfg => XNATA04DataProcessor_V1.0.0.0.mcfg} | 0 ...mics.mcfg => XNAerodynamics_V1.0.0.0.mcfg} | 0 ...ng.mcfg => XNGroundHandling_V1.0.0.0.mcfg} | 0 ...nce.mcfg => XNWeightBalance_V1.0.0.0.mcfg} | 0 .../Models/libXNATA04DataProcessor.so.1.0.0.0 | Bin 0 -> 75800 bytes Release/Models/libXNAerodynamics.so.1.0.0.0 | Bin 0 -> 37104 bytes Release/Models/libXNGroundHandling.so.1.0.0.0 | Bin 0 -> 41416 bytes Release/Models/libXNWeightBalance.so.1.0.0.0 | Bin 0 -> 36384 bytes Release/Scenario/OnlyFlightModel.xml | 12 +- Release/Services/XNUDPService_V1.0.0.0.mcfg | 17 ++ Release/Services/libXNUDPService.so.1.0.0.0 | Bin 0 -> 104496 bytes Release/XNEngine | Bin 189864 -> 196192 bytes Release/database/XNSim.db | Bin 1224704 -> 1224704 bytes Release/include/XNCore/XNCore_global.h | 45 ++- Release/include/XNCore/XNFramework_p.h | 5 + Release/include/XNCore/XNModelManager.h | 8 +- Release/include/XNCore/XNModelObject.h | 4 + Release/include/XNCore/XNScenarioManager.h | 17 ++ Release/include/XNCore/XNServiceManager.h | 2 +- Release/include/XNCore/XNServiceObject.h | 4 + Release/include/XNCore/XNServiceObject_p.h | 1 + XNCore/CMakeLists.txt | 3 + XNCore/XNCore_Function.cpp | 50 +++- XNCore/XNCore_global.h | 45 ++- XNCore/XNFramework_p.h | 5 + XNCore/XNModelManager.cpp | 21 +- XNCore/XNModelManager.h | 8 +- XNCore/XNModelObject.cpp | 280 ++++++++++++------ XNCore/XNModelObject.h | 4 + XNCore/XNScenarioManager.cpp | 262 +++++++++++++--- XNCore/XNScenarioManager.h | 17 ++ XNCore/XNServiceManager.cpp | 21 +- XNCore/XNServiceManager.h | 2 +- XNCore/XNServiceObject.cpp | 185 +++++++++--- XNCore/XNServiceObject.h | 4 + XNCore/XNServiceObject_p.h | 1 + XNEngine/XNEngine.cpp | 125 ++------ XNEngine/XNEngine.h | 11 +- XNEngine/main.cpp | 4 +- XNModels/XNATA04DataProcessor/CMakeLists.txt | 15 +- XNModels/XNAerodynamics/CMakeLists.txt | 15 +- XNModels/XNGroundHandling/CMakeLists.txt | 15 +- XNModels/XNWeightBalance/CMakeLists.txt | 15 +- XNServices/XNUDPService/.vscode/settings.json | 77 +++++ XNServices/XNUDPService/CMakeLists.txt | 15 +- XNServices/XNUDPService/XNUDPService.cpp | 93 +++--- 46 files changed, 1060 insertions(+), 348 deletions(-) rename Release/Models/{XNATA04DataProcessor.mcfg => XNATA04DataProcessor_V1.0.0.0.mcfg} (100%) rename Release/Models/{XNAerodynamics.mcfg => XNAerodynamics_V1.0.0.0.mcfg} (100%) rename Release/Models/{XNGroundHandling.mcfg => XNGroundHandling_V1.0.0.0.mcfg} (100%) rename Release/Models/{XNWeightBalance.mcfg => XNWeightBalance_V1.0.0.0.mcfg} (100%) create mode 100644 Release/Models/libXNATA04DataProcessor.so.1.0.0.0 create mode 100644 Release/Models/libXNAerodynamics.so.1.0.0.0 create mode 100644 Release/Models/libXNGroundHandling.so.1.0.0.0 create mode 100644 Release/Models/libXNWeightBalance.so.1.0.0.0 create mode 100644 Release/Services/XNUDPService_V1.0.0.0.mcfg create mode 100644 Release/Services/libXNUDPService.so.1.0.0.0 create mode 100644 XNServices/XNUDPService/.vscode/settings.json diff --git a/Release/Models/XNATA04DataProcessor.mcfg b/Release/Models/XNATA04DataProcessor_V1.0.0.0.mcfg similarity index 100% rename from Release/Models/XNATA04DataProcessor.mcfg rename to Release/Models/XNATA04DataProcessor_V1.0.0.0.mcfg diff --git a/Release/Models/XNAerodynamics.mcfg b/Release/Models/XNAerodynamics_V1.0.0.0.mcfg similarity index 100% rename from Release/Models/XNAerodynamics.mcfg rename to Release/Models/XNAerodynamics_V1.0.0.0.mcfg diff --git a/Release/Models/XNGroundHandling.mcfg b/Release/Models/XNGroundHandling_V1.0.0.0.mcfg similarity index 100% rename from Release/Models/XNGroundHandling.mcfg rename to Release/Models/XNGroundHandling_V1.0.0.0.mcfg diff --git a/Release/Models/XNWeightBalance.mcfg b/Release/Models/XNWeightBalance_V1.0.0.0.mcfg similarity index 100% rename from Release/Models/XNWeightBalance.mcfg rename to Release/Models/XNWeightBalance_V1.0.0.0.mcfg diff --git a/Release/Models/libXNATA04DataProcessor.so.1.0.0.0 b/Release/Models/libXNATA04DataProcessor.so.1.0.0.0 new file mode 100644 index 0000000000000000000000000000000000000000..b867af2b35fac33851772cd78b3d7eb4a9c815eb GIT binary patch literal 75800 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

!j)O>id~!ugERcz4y312ATrILIZpCIu! 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 Pe~Uasr2v`+G%f=G__3V^ literal 0 HcmV?d00001 diff --git a/Release/Models/libXNAerodynamics.so.1.0.0.0 b/Release/Models/libXNAerodynamics.so.1.0.0.0 new file mode 100644 index 0000000000000000000000000000000000000000..6fd7fb0dd117d636ad1020cfa87cb72a4f946e76 GIT binary patch literal 37104 zcmeHw3w%`7wfD&jMv2MbtFb;9F=(_k%!G#l)J{kS&S(e&2^dA349SEaXn)>^8qa@AUts!=r1H)^lt)3&BQXQWl?1MyLF|7$;H_MABPPN7a(q}R67cP zPt#6ivf0U~w5y?WI3%fN=RD<+Lzhm@8|jZv=D4J4I+mYLq%+WUM{!(IHQgjc*)Het zww6@7l@&(Q>_>B4rpp9N>FQQ8PBC8bmW_%SC=xb~z|KLsDut3Y72h_)zrXsufz~zVQcN`T5rC zZ$8QSlUts9(|y2p%}zvVGw_**57~v9<`0>gyRQ4hvW%mS?Y>UeCS_~3ZjbGHH{8kH zKfT?Z-L0KI^&8Ndnb~bGv}I)4`n83&V{Jtl-L@IF>CC*OkHP{@*xw8Aw+x?hfq6g| z;iKbo5k5=ssltccWf?wX-Wq%;ti-35U1{2-f|8q1lluivqz<0|KK1xC;1k5B5uZEH znpFPY-*yd7YU=BM?Xu%8d3Di>@sFQg+g>znQu(s2*ZlbLdv5v0EL-LbM{m{tdFipA zd4JZE_5KxFQ}Hja>g(-#e*2d1zf{`)+#f$a`<(wi@aWoi`ubnG_?^%x&z%3888`mp zo)=!<{q*mfDsH>!jjR`6+1J-!MPiepV;KbT^Uzljzylb;EPF~irvX{9f!*<56iFSY4(RZv{d zM*lU_|8lN5{#?E}zQCeh51^c8`nO=bFvEu|>eXQ(|D|Kh_52k0RFnGlS=9Fw7}Lx? zYb^5p=4A7HueH#Bg@qj^BVUI}IlqohZ)TsdJo9?})uP>}V;nWpv&y3UH(1p7W{Z5k zVA1aHTa>@hB44|OpO;(Y`;0|7ueI>o$1wn#*}-Me?!^}E^*f95PqOI0i!ACjY*Efp zi}s?vZssQ!Sme9F!Vjw~>~@z$d%u_tSKCvL3j`_$ zg{x8D(=me)4F|}pDFM!K>xAOKP1}4A@DnyKLDo% z2tpIuiNa)I=dp6mdpXgr6YZso^2qW(E6U>#{iU$7v&UoST6K; zh;nWd<@|!c2QB=^hH-%Gvs;wMA>^MCb{G?Om@V)(gq@wDeeV_c-JoQDqo4m%omYm7?8^ets9^sXSW^<=G_sdB|Y5JG(n#H#Cbl~ze>ojvhbff5P!Osr)?86-u17 zRZBv!*wQsu2J0ifaPx*hBq$ocW~F&FmCZG$w#qC`m3fj1(drhlyy8_xPc1L;_)1)< z-Ybg8$}lUX@J!mYJ`k>1X;jWM7`jHeYvK$I;;z}=w&qAP>xC78NPyY2?J8nA>I)1v5saep6r0G)Jk&LzqYH(-yRHiglGteZ1it%n&l>~o~B#a`-qPk z+`*bV+Cv>d+0D=Mvk}JSDp?cgXs*Z57jAA_>#auzbJe2@`Xk{$bELyt@4>)S@9~tE zc&lgmJs#i1_2|K~{M6%Gf^Ag4>d4_Ln+J!l4+r7Xp5?8rT5GVizI`K9vEJ>EG=)P~ z`CCG3QLJD%910`PPnS=*%TQ=mTGw24Oh)yC-ib$DX1_4^5NW^C=1_;9(lTd*hl+7I z73WRO<^@!?t2sjTC=IrULmkbnf%6&z9g&8Hj#>E3t!Zuz`Xf-(e5I+->~N$#P3rJX zZ{>XGrc?tAF4jF8gG+UD>+JG*&UtgnYRa6mOG?!ljHb5Eh~JB;F5HMIP8uaW*}Rlw zq0Y#mrJGfflCCL;*?JAU=wHuLS|z=x6V{L?ThVq^b6bOdd9b6il}-D`j?D}q#-!9? zlUe+T_jmFii)NJLS6W3s*|yR~R+{BpV(vc`7L$p~nH;QnA2JNB27!i_j*T>iFJ6g` zR9jUUTDvwFE^ThZ(ygr?qnjsj4WUC2Nh+Cz5yw+i?JtGS%HW1z3zjOMVr=tZF-hyd zwVi=*gFjHezOy;ZydqIr-Y*m(F|<&#C4{)O6`{bIP?!xLM(=W+=L-khv1nQp3VXVO z^_>`1`P`K{M_I}tPrhbwxfTZ_E83dZcLu!;T*t-6)+m9dbeDe#e6Wknj-N2I zQW7sMISwz$$|_9B=o?*uHO(7bE?R!H1UfqWiQ5WvLSB}`o$6(QK25sRQjw85n#~Jl z^aqx!IhfjqS+&ep>rBT4QE9gZT$lN1&6Qcl;XdpL-`TPpKMSo@h7qi!WVyJluc)Z@ zVFl4#-`pN(i%>tr4SExnr49ad!Hr^ps!6Do`E+Mn3+~7bAcI<(*VI;(hr+?)j*te1 zR!RPquH@Q8;0-OfC@vupEdJ`h^d(~F61%n@%W&dc#MLM8)FlHGD0b36ZE>Y{VY$Dg zxTJWFwz$09KTE+}v$gWt+OmaSzpHpw@jNbDTML=l#V(f;ml9LrQd!!a!B$WrWU+5D ziOpu;OXuKQ-yBF_TL@utA~utKlgU8#CzF4Rjrc5~4;w=)9K|&8{Ux4L26lfx%YT$D z>2Jp75AFXr@agh zHv;4OvJ`zeT13P_T-*56JV4xiBZNaZ+@!8tPf{&bi z6L$16wPVDFolWe2$^BVP>>t|=xKC_Q78vl6xl}4m8(z<;)FXMhFHGBXlqHJ6LXprz z_{9PvBKO$|FT_X6>x#UJ%l$i}yxf;J;&Ok}h?gq*>HBIK+zRfMAgE8luTbz>1)rwi zO$xqN!P^!5iwfSY;9@J7#r7+Bqawe}0^g$Gau1u54J)|VT4&m}E4bKVW%!7KU&;{v zXODtksNj1QTz*$T(PIi8P~`V3_)-NwsNf9>u8Hq;s2!^n+@|1e1-C1By@D4g_!0$o zD7f6irf8>v(=!Y*lqz_w1VP;j{uKq+6zDL2E6nw9O z(|3Y0j4Aj`34+EHTz>aL(fbvAjv{|h!NrirVz-KMkNoh zk%Fu9rc=TBT*(uaDmcFSNCdZn%bAiQbp^jHA&qfN!O4eYs8w(|rc+#Y z1eFNw3Vuui)wC`J$5$?i(5>M42~^Yi72K}iLkg~bZ@)#sk5lA_75sPw->TpzDEKx7 zFIVvG3Vx!3k0`kO?uepyE4ciQm+(CbE*{AvSlg@Mr!a*78B_2Y1&=BCsS3Vd!PW8e zpn^LTc}@5;`R(ZnZd35-3T{{MGZef)!DlGAL&4W5c#(piso+ipKTE+&6}(8n-3orT zg6j%?j)MCX{7VX6tKjD@zu7H>hsIbE%3PoKDWT<7Wk|!p!fXErVr%&8Eb#NcO;TIzDMtQ!nQM!?f9G* z5j8&JW&F*b=EfEAY-JlC8%LP&9PzY-jPGIm)5OyfF+RfhUlC7B!}vDFKTbR?3FE_z ze~5Tm3dV;Re=qU0)QfjB{!Zd)x{tRr{x;%i$rrC<{4K=OQZMdf{7uBuEm7Rf_^%UB zOTM_1@z)biw-#{+F@PCsh_@3z#`w#KpGy25 z#xEzHmU{6K#$QA{E%D;p7{8EsTH3{j89$$RTGGXb7+*p>E!pDTj6a8XTB^m{89$wP zx&?~YG5(9h(~>RjWBjqi)2({k&G@5%>nZe*ZtI{x1^mAbyPT&k;{cvG^XwKTSL>!Qvx~{}u7H^onm|{NuzI5W`*J9H-7&`~0(g(g;XxHbx5XsXADheG;SRY2z?xAW%NZ9{Vnt^pk;)9gc|4r=X$UQfVx$|7a(vJV#q|(n29LKA9#{C z5Fh&`C5gTX@o8LqFQIQI)IZ2&ZzJ?O3E8({LMYly=&pq97B0Jz(Dez~U0l{p=&cFa zb}oA~p`L{7tz7mUkXR@oTghb~A@n4Y?Rlbrmw6qa)hNghK+7(VpN}NT)^8kwT`on8 zKA5wd$h?D*6EMAOz|*KSy&N?@mOrhVT6U+PkUyKr&zVl-?2q;6e*LjGzM?;NFiX!E z)t~w}ay%4xgaX_6SY!S)++fJ`-50z+AL=@1!rv~qo9-m^=qr(2ec*z}fyY*(?6D>| z*J#dD;4@asbdtueL1eN5L)Cip!`Kb)Q={e#L!I6;V%MWtt9B0Yd{+T&^@HWC35bfQn;42k;n}T0RxPyRb?{)=0Q;{E0@I1nsxcqLASSwj3+C%d_ ztrJ$QhFy}@%b%uI>jVA*eP9Q(K<{||rh`aUIdB8jehEAvzcRWj_9JFrCW9z4Kq6{$ zN)*{35w$)gYFLe0nG!{oNTgbj5=F*HL^)ET$R3HPoRp{$HR^TPL{t!kC#z7ZnN+Xe zC!;XcsfFvTQ|J4ZJk^;iELCz+3IHpF`rox2eqr zBZW5C)B3K8LL2Q8!be>r&{R42LzJw^H;pR=Mrq^V1fdJ2Hng6g1MpiTN9 zch4yI>Ot;I!UqR?V@!1~RT1@Bk9|sB7Y}|ez-nAmXlu+5<%F=TfhV#Fa`2~nkr^fw zJ^C#w%R_!_o99o}NbVBI?Q%OKo#9~qRJWa=8bFOv-)!&>ngg+j{TAtI%zqOV>fM6N z(d1b5jDW}&5* zW9QtAEm$!U!0qj;R+n8~wz}+!oqBX>S$9)F7*U_pxzxJBGvY{rQhA&fWJjZ}f?HC(NYu@FC${J%1~ujviaW?6cz_>PKZk z&%cjaA@)O7(;hdjY22R*tCe!A?d0Pqtp@Dy#KFt4d?9zF6&Q0*tYP%%<%RZG8R-}h zt`fltS$_}@lY81C;f;E<0_&fFb6>^Qlpd`qbO=Yef~1fHcGVrb+(o`nbK9u<%MtP# z?j=ZAK#r0BfJfUj5^+}!oO>OVU}ArS?pbI-6KBTf3#|N23t^AsBI|32i_Zik`x`n> zY%7caJ@cRkb-kZ-yz(|ufqsYRzy*t_oP#IKL^D@L--u0ymVKMayt7b8qGy1j54*K8 z-ha`{X`(@)VdQ=)Q1nf2^yS!UvN!Yw8GQq`D#J8$76cxIskMse>y^=0^}!v~mty<32k}@@EL3qSQA~QR*D|y|Z(VsC4!PPE+%ji8jsNZV&o36!ed*#54 zcHI4l6-wpcUES~ox(Tq8pPvi)-jV#?I!L0u@;BXtl-)b_lgC7kc`M)E6T{_O`BObW z@rZ;(>E}&^+PZhxlc)`sgxb4zIFe|AKnuEeIFo3RKpovX+)1=lphev~d`VOnsIz+q z6;zb0R-mQbJKB>dZB%0`2PF(NFs)5j)wp8XwMjA zGmuNqUR)4n8|~RIv6#T@qdnR&Lhhiz3PyYE60_lg(mF<#z%+KZ2S$q&1U^fh-J)0qv5$)+0vIVr7 zhCH7m<2OT+&y$3Ui4zOVD}YmvUV|3!f`&koV;7AFJ5?6ldCv<=1oX9D$OWvSD(gIkk%=e68m4KxI&)?&EnX}@4jqORqHzdl( z`Njl~RZ4*6Cs(joiB8rB*v%4FjcjE&Zx`DOVb`=5Qbe^Hcz7$ahX@rz7b5JML~^)D zKNs1eh_GuCdGT+gnSz^Q%M zH`05b?_5?!OG-9rVEutvBa*)gt%DU)d;lfEeU5h^yAZQ4#(9#TNAi4W@MJO!0y@v!!=ZZsw?z3ufA?HT|u;-B6-@@G$btSeB zP*52?OUHU@(`ItW=!bgrJw5tvjMCEz)rKyr_Z-Z>YCisEbQb16utMvvMqcH%veE2p zTDcS?7sZ>PgRD0a`OChuU=+cNJ2u>lxTqPTSy(QLrEEE-;MXdnuj^P+-cEUv(^d|g zvF|(BRXM|kW!i;6lVzvzf!s=LVVt@JyQqBE392y>UyU0 zSrMrZxY_u%3YL=Vlf|}u_a@gTSij`%`wj6lJ|J7+-`DM8VpyC53|MW+pL1@#uS6ZFil5dkYLv|0*uAT204Gl<}rqoy<|<+yjYQ0j68R< z6cdg-16*XHp3}rc%z920k1^>vvk{~AoLnk2+G1&1&pAepJX2u-tZ&tE$CWnjJe?3I z*f(nIC)*mu`Vs3*j92@9$Htqdu=#G?9t&PgwuhgpBif^$Rc*rd@KI9^83y^o{=t)~ zEbXUDY9y{LewLJwviM19BL2w#E-0be^um8x$$8af<<;ft?~U1>D(#gv+z2`X`UlV&Jn>nN>KQl2ZB#e73(ZK8_W8BG_?t zIX+I@;X@q@q^}*HFVo#WA>KUu=FIk^^K6T!=y^8wTa+Qdmm{7YfT2KoZpWuq!M+Th z?yPHovG+(ZJ!N?XeOY>*qbECa_tAL;6?yiBc{UxJz3jR17-$3R#opgzl-~n+V35C< z9mM72AmtB@u)RR+@=gwSsbY4+eo&z<71T1yY6b;`7Xl|r!f&YD#(lXr@!WLJ+ zr~qJ!#Zy`m*9&1_vSAm}{l{O%$KN5lK;!02o!YM=&zbdG*zn>!yO-60e5(*LG1!pa zp_To6B!v8pRK~%qg?Wz6RK~uXvOH(cq{=*Z)-ssa2?&LS2rq2e6v~r=V&~SA6L!vX z_e|=`*_=I?btBZ1Pdo8>2fj~!noV2A2!w4z8U6-aKY{D)c3zgvnO-V8GKBAagI5(6 zqN=jC15xvR_lwDVk)khav&fVD`j^O)9;V7Zo##o|?PxX{1K2ynlD@l?^2<6I)fLXZ z2pN+6A0Qt?o3M918RgF)dG739$e$1SO~{JIDtgyb_J83Ij3#^lbxQa^-FkxyEJk|r zO$v%#Pf+St*OSwiy*X5B zli-M1XPLC`!YQQxWh5Pieh=v^;`)8KZh-#17;EXBaM{$c&FkmPx;_gvL^n=2`NdNz z40SFuuk+~`Cq$n`ISqC0LYe4+uIvZ!M+6!b#pm?nF~)x{Bj=4wZEI#uUzYas%$$!i zwVjzc2QszaWg-%S*%h1~l?ys2=NBw>ww;6aynv>?n341AOzn=$oM$pwf-`vBwBvAR zesRv8Z0))XJjHiMM$TBa_9wc$E;DCuHWNJ--^(J86Z77Jh3?DFxp%U*Z&J=fleM2t z=1Q{dXw%Qb=N94+uI5Pv)@v1wB*Hxq{M@I}}z5 z+9>D-LHh)~S?zoL0C6Yt42 zzE8PO;Bp^ zuR%`^3QGCzG2k-=J|b|b-!JfO27Ex^!v_2zfp-hsA9f2;i?9Hy%PBJbXZ$&A-~B2|25N-{vP~dIEI;hRxv#N{q>uGe;@tD z_&)j{0jG9!8rty%f!7)E519V+id_m9G%L?-z{#G*_nSX#A^#k3vv$E!z*PS<3;ZJB zA$)}$K@l6Xo_X9Vx+pmNkjgzrtr2gV);YO9dS_Ry!UVRq$ zw;7(kUb+XknVol9=y}ZoKR@5RJRKHzA8@mLAF_~t5jfe|c#c8_48r`=$L%vy_}*;b zByT)l;c6zIem=yvfScL#0U;j~_IC^Yzh?63(Rsk-wPH4{+CtBj7Wl&!_@6BBHy92- z6#Jv{+?wOD05&Vn8NjLCjpy0SvyiVA^2Yn1b-<}#)Ggz+mHu#pkk{NCr|)Da{FveV zTK)T53p{Rt<7K63ry|gswTtm4&_D|w1POF#{>7C`7nW7xC9s`q{9eD|C7$)|bXY}o zq_WiSZ^knP6TBI|(lxu@Pj83!w&84%X1p<&vQK-7JbOQUWr?%izqqrx0k4E^Z0_=} zXj|77x~grW6r`O}Oe{;UsIPQEIThqG99v?pl8eof&rm`n2Fx=QQ)%WHhqhgv-< ztdzGdh0uLoQr6oxK~Y$tXU)MYwDDSNyu03y*Yo2P2b|wPXF1RbFnF^#-sj!iU|y98 z(kEXp%ic{qLHd$;CiypX_%~1yLKZE^b3V@`WqoHj9Bjj>E1#f2m}+i^-|O2jyR4xB z53qEUwQV#nX^Qk*gS7D>AUaW?xIWaVELRT{z=Lg{ z^m_RtUbQ1}#DeL0If)|_Qr`(K^E39p)P7_-XVCazICzA;!Tqow1~ln$^7IeG>$fo~ z;PJVX6M_+`C&6D5VAZn@3TMhr*x&Cw_`BEMDHL^Us+fk+@PEm zkvR0iZ~z8-x&EhU%^I&&8<|-B$R79b>5jBfN37x!7Y$m~R#h+_s^Lz)C*8D{uvss) zn*Djs&)7WnxxNUB@>@9a>$Tbh`xJB}DthjKXX6i8Y8FWrL*c|y@|B2_0rVV`XGs|-=Q%`}R z178fL!Qg5*hLU{Edha!|Q5SGoF zjt&j`ajmV`D^vI6|CMWcUKd~Sn$J(Zt6vit(p8U!xW4?B2_r1H6A znZHag>)$5QFXYJ*&o|2FndNiOl%Ae-Hm2_aMmE7?CpZ)jUb{u?+oy?m}xQdwS+EKz=m-(W~DpEHxRN*YQikoih|gNF3-IZa80`$=)u zh6x52-xTR(`z4;|^l>RY5y5!}CyBqe;)?1o#q{MoO44@{lKjGG{~rTZ)63^WCGEoV zO=^&Klh}Q@P}9rjNF}9sHIS?to&cKgb~$nB&(g^JC4CAq_$ohmgz_rh1c;R-8yjP&@gISsf>f0h9!SqdtZzRzR$-@O4&OGO1v0qem> r)?0RK>YuXgJO%%24|D3pi&51e^OYDLpD;~-X+M{s-<_+$z-s>kD_r*> literal 0 HcmV?d00001 diff --git a/Release/Models/libXNGroundHandling.so.1.0.0.0 b/Release/Models/libXNGroundHandling.so.1.0.0.0 new file mode 100644 index 0000000000000000000000000000000000000000..26cf2bd1bd6e38358ab692e97ddb03b63538d402 GIT binary patch literal 41416 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 - + - - - - + + + + - + diff --git a/Release/Services/XNUDPService_V1.0.0.0.mcfg b/Release/Services/XNUDPService_V1.0.0.0.mcfg new file mode 100644 index 0000000..8fa1279 --- /dev/null +++ b/Release/Services/XNUDPService_V1.0.0.0.mcfg @@ -0,0 +1,17 @@ + + + XNUDPService + UDP通信服务 + Jin + 1.0.0 + 2025-02-04 10:00:00 + 2025-02-04 10:00:00 + + + + + 12345 + 127.0.0.1 + 54321 + + diff --git a/Release/Services/libXNUDPService.so.1.0.0.0 b/Release/Services/libXNUDPService.so.1.0.0.0 new file mode 100644 index 0000000000000000000000000000000000000000..c126e077f5d58e66cb50870dfc1f9e038e73af01 GIT binary patch literal 104496 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 diff --git a/Release/database/XNSim.db b/Release/database/XNSim.db index 9440b07c92edab49c7d88cf7d39c7322715b1cf5..f160d209e3cebf8d3c9c03e62e923e0d4e79570a 100644 GIT binary patch delta 605 zcmX}pUuaTM90%}wZr*!$|DEYJTe5=d9V;ze{v|RZVg|8B3b_$PDIeZSB@A>hAb55~2S!_;LMocO} zpi=}v1i=xoU3GXVl^DNLeHpJ6I1wU*8w76bTBXl;0QnZ3NF1|{TpTQTz1pB=);B^Z zaCSNv-Yc%RK5TYstL?j+zu&EN%9Ymp2atE}zv!$!|GB=@E?4)8TI)@zQ+m=_dkt&5 z{8;}QLdOd?^72(BrOHx3k|Sz1H<60V4oMEG*;pnqmrJDY931uX2_>042=+G%H}mpT zI;JGU=}b-zNN$hU=ZDIOl9^R=m($r^D7!sp#$7Poy(a&U_UroslHcd`xEFRRhB=#w z2oSi1-{M(uO;m+X!iq4>8QE{_7CVnpM8FUsD|D2OzH%TNW8nUf$9Ano3t69Mk%kQL zUNP9;LZsiWmjq<17X+k@ZiSKYDQd9Ny$V&QqUi6VQTic)sTrdGBYuYScoJLqCcnWC zale=tbAs+tGxRnzI!$4k{;?R;XlB^yL`&!N^E?_utRCahm!mSg)Kmg)$3`w)k2pA1 z4&`pEnXr;kQhHM)PnzwV9sZC9y>UTf=;3Ql{X2`Sx`js;G_>5MNpPs%r42bdbr`D5 g%W;jf&c&j delta 347 zcmXBPze@sP90u_B`+E0Y_rtq0Efonp%2HAjjuw{?np`btG&7bpdq-ef1tk6@L3*s;Cbp!q3#qq5nq`QSR{n3q7b_3rcAy}GKa0( z%Aj@)ucCfg0)EVQe)bc7k|XM;`l#-BFTC5zvvQ`a%ck@#>EgRM605LBa@-p2+@~NR zaD>pAv7v{lT@|4LY-NcBi)rga1jBk`G%Qb_L^DD#orcq@waL>sOj%8yzF0?$&e7$h z)m9*3*A!^X{_lu+7}qCSe{95Bn!F2Q+=%4;#58+OJJ&0o&yTX8Ka>E5QGB8>muOGw zje4vW)UfQxLpdOQ30uMfb8*%kgN<%J)N~m|9@}NyL6Q$(QEXPS9O4l}0-8X7xrAh- RATLsphIHh!E7{3G?H77=TwwqJ diff --git a/Release/include/XNCore/XNCore_global.h b/Release/include/XNCore/XNCore_global.h index b4ce4bb..e2cae8a 100644 --- a/Release/include/XNCore/XNCore_global.h +++ b/Release/include/XNCore/XNCore_global.h @@ -40,6 +40,8 @@ # include # include # include +# include +# include #endif #include @@ -53,6 +55,8 @@ #include #define FAST_DDS_MACRO eprosima::fastdds::dds +using XN_JSON = nlohmann::json; + /** * @brief 默认基频定义,单位 Hz */ @@ -91,13 +95,6 @@ struct PERIOD_INFO { */ using XNTimePoint = std::chrono::system_clock::time_point; -/** - * @brief 将ISO格式的时间字符串转换为系统时间点 - * @param timeStr ISO格式的时间字符串 (YYYY-MM-DDTHH:mm:ss) - * @return 系统时间点 - */ -extern "C" XNTimePoint XNCORE_EXPORT parseISOTime(const std::string &timeStr); - /** * @brief 系统运行状态枚举类 */ @@ -258,3 +255,37 @@ public: public: \ using ThisType = cls; \ using SuperType = sup; + +#define XN_UNUSED(x) (void)x + +namespace XNSim +{ +template +constexpr typename std::underlying_type::type enumValue(T e) +{ + return static_cast::type>(e); +} + +/** + * @brief 将ISO格式的时间字符串转换为系统时间点 + * @param timeStr ISO格式的时间字符串 (YYYY-MM-DDTHH:mm:ss) + * @return 系统时间点 + */ +extern "C" XNTimePoint XNCORE_EXPORT parseISOTime(const std::string &timeStr); + +extern "C" std::vector XNCORE_EXPORT split(const std::string &str, + const std::string &delim); + +extern "C" std::string XNCORE_EXPORT getFileNameWithoutExt(const std::string &path); + +extern "C" int XNCORE_EXPORT safe_stoi(const std::string &str, int defaultValue = 0); + +inline std::string getStringFromSqlite3(sqlite3_stmt *stmt, int column) +{ + const char *text = reinterpret_cast(sqlite3_column_text(stmt, column)); + if (text == nullptr) { + return ""; + } + return std::string(text); +} +} // namespace XNSim diff --git a/Release/include/XNCore/XNFramework_p.h b/Release/include/XNCore/XNFramework_p.h index cb27a74..2d648c4 100644 --- a/Release/include/XNCore/XNFramework_p.h +++ b/Release/include/XNCore/XNFramework_p.h @@ -77,4 +77,9 @@ struct XNFrameworkPrivate : public XNObjectPrivate { * @brief 场景XML */ std::string scenarioXml; + + /** + * @brief 构型ID + */ + uint32_t configId; }; diff --git a/Release/include/XNCore/XNModelManager.h b/Release/include/XNCore/XNModelManager.h index 4c030b6..b1c6a67 100644 --- a/Release/include/XNCore/XNModelManager.h +++ b/Release/include/XNCore/XNModelManager.h @@ -61,10 +61,14 @@ public: * @brief 加载模型 * @param modelPath: QString类型,模型动态链接库路径 * @param className: QString类型,模型类名 + * @param modelVersion: QString类型,模型版本号 + * @param initialType: UINT32类型,初始化类型 + * @param threadID: UINT32类型,线程ID * @details 加载模型 */ - void LoadModel(const std::string &modelPath, const std::string &className, uint32_t initialType, - uint32_t threadID); + void LoadModel(const std::string &modelPath, const std::string &className, + const std::string &modelVersion, const std::string &planeName, + uint32_t initialType, uint32_t threadID); /** * @brief 注册模型信息 diff --git a/Release/include/XNCore/XNModelObject.h b/Release/include/XNCore/XNModelObject.h index 540781a..2f7153f 100644 --- a/Release/include/XNCore/XNModelObject.h +++ b/Release/include/XNCore/XNModelObject.h @@ -238,6 +238,10 @@ public: public: virtual void RegisterDDSParticipant(); + +private: + void ParseXml(); + void ParseConfig(); }; #define XN_MODEL_INITIALIZE(ClassName) \ diff --git a/Release/include/XNCore/XNScenarioManager.h b/Release/include/XNCore/XNScenarioManager.h index 89a293b..b659e78 100644 --- a/Release/include/XNCore/XNScenarioManager.h +++ b/Release/include/XNCore/XNScenarioManager.h @@ -76,4 +76,21 @@ public: * @return false: 解析失败 */ virtual bool AnalysisScenarioXml(const std::string &XmlPath, uint32_t initialType); + +private: + /** + * @brief 解析运行环境配置文件 + * @param XmlPath: std::string类型,运行环境配置文件解析路径 + * @return true: 解析成功 + * @return false: 解析失败 + */ + bool ParseScenarioXml(const std::string &XmlPath); + + /** + * @brief 解析构型配置文件 + * @param ConfigID: std::string类型,构型配置文件在数据库中的ID + * @return true: 解析成功 + * @return false: 解析失败 + */ + bool ParseConfig(const std::string &ConfigID); }; diff --git a/Release/include/XNCore/XNServiceManager.h b/Release/include/XNCore/XNServiceManager.h index eb0a5bb..a736a7f 100644 --- a/Release/include/XNCore/XNServiceManager.h +++ b/Release/include/XNCore/XNServiceManager.h @@ -29,7 +29,7 @@ public: virtual bool Initialize() override; virtual bool PrepareForExecute() override; void LoadService(const std::string &servicePath, const std::string &serviceName, - uint32_t initialType); + const std::string &serviceVersion, uint32_t initialType); public: XNServiceObjectPtr GetService(uint32_t serviceID); diff --git a/Release/include/XNCore/XNServiceObject.h b/Release/include/XNCore/XNServiceObject.h index 163be32..c01ff25 100644 --- a/Release/include/XNCore/XNServiceObject.h +++ b/Release/include/XNCore/XNServiceObject.h @@ -54,6 +54,10 @@ public: protected: XNFrameworkPtr GetFramework() const; + +private: + void ParseXml(); + void ParseConfig(); }; XNCLASS_PTR_DECLARE(XNServiceObject) diff --git a/Release/include/XNCore/XNServiceObject_p.h b/Release/include/XNCore/XNServiceObject_p.h index a9c4bb4..426dd33 100644 --- a/Release/include/XNCore/XNServiceObject_p.h +++ b/Release/include/XNCore/XNServiceObject_p.h @@ -11,4 +11,5 @@ struct XNServiceObjectPrivate : public XNObjectPrivate { std::unordered_map _dataWriters; XNFrameworkPtr pFramework; uint32_t _initialType; + XN_JSON _otherParams; }; diff --git a/XNCore/CMakeLists.txt b/XNCore/CMakeLists.txt index c0089d9..9d0efd4 100755 --- a/XNCore/CMakeLists.txt +++ b/XNCore/CMakeLists.txt @@ -16,8 +16,10 @@ endif() file(GLOB DDS_XNIDL_SOURCES_CXX "XNIDL/*.cxx") +find_package(nlohmann_json REQUIRED) find_package(Threads REQUIRED) find_package(OpenSSL REQUIRED) +find_package(SQLite3 REQUIRED) add_library(XNCore SHARED XNCore_global.h @@ -76,6 +78,7 @@ target_link_libraries(XNCore PRIVATE pthread OpenSSL::SSL OpenSSL::Crypto + nlohmann_json dl ) diff --git a/XNCore/XNCore_Function.cpp b/XNCore/XNCore_Function.cpp index 0106209..77b3be8 100644 --- a/XNCore/XNCore_Function.cpp +++ b/XNCore/XNCore_Function.cpp @@ -1,5 +1,7 @@ #include "XNCore_global.h" +namespace XNSim +{ XNTimePoint parseISOTime(const std::string &timeStr) { std::tm tm = {}; @@ -7,4 +9,50 @@ XNTimePoint parseISOTime(const std::string &timeStr) ss >> std::get_time(&tm, "%Y-%m-%dT%H:%M:%S"); auto tp = std::chrono::system_clock::from_time_t(std::mktime(&tm)); return tp; -} \ No newline at end of file +} + +// 辅助函数:分割字符串 +std::vector split(const std::string &str, const std::string &delim) +{ + std::vector tokens; + size_t prev = 0, pos = 0; + do { + pos = str.find(delim, prev); + if (pos == std::string::npos) + pos = str.length(); + std::string token = str.substr(prev, pos - prev); + if (!token.empty()) + tokens.push_back(token); + prev = pos + delim.length(); + } while (pos < str.length() && prev < str.length()); + return tokens; +} + +// 辅助函数:获取文件名(不含扩展名) +std::string getFileNameWithoutExt(const std::string &path) +{ + size_t lastDot = path.find_last_of('.'); + if (lastDot != std::string::npos) { + return path.substr(0, lastDot); + } + return path; +} + +/** + * @brief 安全地将字符串转换为整数 + * @param str 要转换的字符串 + * @param defaultValue 转换失败时的默认值 + * @return 转换后的整数值 + */ +int safe_stoi(const std::string &str, int defaultValue) +{ + if (str.empty()) { + return defaultValue; + } + try { + return std::stoi(str); + } catch (const std::exception &) { + return defaultValue; + } +} +} // namespace XNSim \ No newline at end of file diff --git a/XNCore/XNCore_global.h b/XNCore/XNCore_global.h index b4ce4bb..e2cae8a 100755 --- a/XNCore/XNCore_global.h +++ b/XNCore/XNCore_global.h @@ -40,6 +40,8 @@ # include # include # include +# include +# include #endif #include @@ -53,6 +55,8 @@ #include #define FAST_DDS_MACRO eprosima::fastdds::dds +using XN_JSON = nlohmann::json; + /** * @brief 默认基频定义,单位 Hz */ @@ -91,13 +95,6 @@ struct PERIOD_INFO { */ using XNTimePoint = std::chrono::system_clock::time_point; -/** - * @brief 将ISO格式的时间字符串转换为系统时间点 - * @param timeStr ISO格式的时间字符串 (YYYY-MM-DDTHH:mm:ss) - * @return 系统时间点 - */ -extern "C" XNTimePoint XNCORE_EXPORT parseISOTime(const std::string &timeStr); - /** * @brief 系统运行状态枚举类 */ @@ -258,3 +255,37 @@ public: public: \ using ThisType = cls; \ using SuperType = sup; + +#define XN_UNUSED(x) (void)x + +namespace XNSim +{ +template +constexpr typename std::underlying_type::type enumValue(T e) +{ + return static_cast::type>(e); +} + +/** + * @brief 将ISO格式的时间字符串转换为系统时间点 + * @param timeStr ISO格式的时间字符串 (YYYY-MM-DDTHH:mm:ss) + * @return 系统时间点 + */ +extern "C" XNTimePoint XNCORE_EXPORT parseISOTime(const std::string &timeStr); + +extern "C" std::vector XNCORE_EXPORT split(const std::string &str, + const std::string &delim); + +extern "C" std::string XNCORE_EXPORT getFileNameWithoutExt(const std::string &path); + +extern "C" int XNCORE_EXPORT safe_stoi(const std::string &str, int defaultValue = 0); + +inline std::string getStringFromSqlite3(sqlite3_stmt *stmt, int column) +{ + const char *text = reinterpret_cast(sqlite3_column_text(stmt, column)); + if (text == nullptr) { + return ""; + } + return std::string(text); +} +} // namespace XNSim diff --git a/XNCore/XNFramework_p.h b/XNCore/XNFramework_p.h index cb27a74..2d648c4 100755 --- a/XNCore/XNFramework_p.h +++ b/XNCore/XNFramework_p.h @@ -77,4 +77,9 @@ struct XNFrameworkPrivate : public XNObjectPrivate { * @brief 场景XML */ std::string scenarioXml; + + /** + * @brief 构型ID + */ + uint32_t configId; }; diff --git a/XNCore/XNModelManager.cpp b/XNCore/XNModelManager.cpp index 5d3c2ff..b4008fd 100755 --- a/XNCore/XNModelManager.cpp +++ b/XNCore/XNModelManager.cpp @@ -55,6 +55,7 @@ bool XNModelManager::Initialize() } void XNModelManager::LoadModel(const std::string &modelPath, const std::string &className, + const std::string &modelVersion, const std::string &planeName, uint32_t initialType, uint32_t threadID) { T_D(); @@ -77,10 +78,15 @@ void XNModelManager::LoadModel(const std::string &modelPath, const std::string & model->SetFramework(GetFramework()); model->SetInitializeType(initialType); model->SetThreadID(threadID); - // 使用std::filesystem处理路径 - std::filesystem::path configPath = - std::filesystem::path(modelPath).parent_path() / (className + ".mcfg"); - model->SetXmlPath(configPath.string()); + if (initialType == 0) { + // 使用std::filesystem处理路径 + std::filesystem::path configPath = + std::filesystem::path(modelPath).parent_path() + / (className + "_V" + modelVersion + ".mcfg"); + model->SetXmlPath(configPath.string()); + } else if (initialType == 1) { + model->SetXmlPath(planeName + "," + className + "," + modelVersion); + } // 注册模型到管理器 d->ModelMap[modelID] = model; @@ -92,9 +98,10 @@ void XNModelManager::LoadModel(const std::string &modelPath, const std::string & if (threadID != 0) { auto framework = GetFramework(); if (framework) { - framework->GetThreadManager()->RegisterFunction( - modelID, std::bind(&XNModelObject::StepUpdate, model.get()), threadID, - model->GetRunFreq(), model->GetRunNode(), model->GetRunPriority()); + // 注册到线程管理器 (重复注册了,暂删除) + // framework->GetThreadManager()->RegisterFunction( + // modelID, std::bind(&XNModelObject::StepUpdate, model.get()), threadID, + // model->GetRunFreq(), model->GetRunNode(), model->GetRunPriority()); // 设置模型设置频率 double threadFreq = framework->GetThreadManager()->GetThreadFreqByID(threadID); diff --git a/XNCore/XNModelManager.h b/XNCore/XNModelManager.h index 4c030b6..b1c6a67 100755 --- a/XNCore/XNModelManager.h +++ b/XNCore/XNModelManager.h @@ -61,10 +61,14 @@ public: * @brief 加载模型 * @param modelPath: QString类型,模型动态链接库路径 * @param className: QString类型,模型类名 + * @param modelVersion: QString类型,模型版本号 + * @param initialType: UINT32类型,初始化类型 + * @param threadID: UINT32类型,线程ID * @details 加载模型 */ - void LoadModel(const std::string &modelPath, const std::string &className, uint32_t initialType, - uint32_t threadID); + void LoadModel(const std::string &modelPath, const std::string &className, + const std::string &modelVersion, const std::string &planeName, + uint32_t initialType, uint32_t threadID); /** * @brief 注册模型信息 diff --git a/XNCore/XNModelObject.cpp b/XNCore/XNModelObject.cpp index ccc2409..e697210 100755 --- a/XNCore/XNModelObject.cpp +++ b/XNCore/XNModelObject.cpp @@ -195,102 +195,210 @@ void XNModelObject::SetSetFreq(double setFreq) // 初始化函数 void XNModelObject::Initialize() { - // 先尝试调取动态库 T_D(); if (d->_initialType == 0) { - // 读取配置文件,设置循环执行函数 - std::ifstream file(GetXmlPath()); - if (!file.is_open()) { - LOG_WARNING("0x2161 Failed to open the model configuration file: %1!", GetXmlPath()); - return; - } - tinyxml2::XMLDocument doc; - doc.LoadFile(GetXmlPath().c_str()); - tinyxml2::XMLElement *rootNode = doc.FirstChildElement("Model"); - if (!rootNode) { - LOG_WARNING("0x2161 Failed to parse model configuration file: %1!", GetXmlPath()); - return; - } - // 读取配置文件的模型参数 - const char *modelName = rootNode->FirstChildElement("Name")->GetText(); - if (!modelName || std::string(modelName) != GetObjectName()) { - LOG_WARNING( - "0x2162 The model name in the configuration file of model %1 is not consistent " - "with the model name in the configuration file of model %2!", - GetObjectName(), modelName ? modelName : "null"); - return; - } - d->_sDescription = rootNode->FirstChildElement("Description")->GetText(); - d->_sAuthor = rootNode->FirstChildElement("Author")->GetText(); - d->_sVersion = rootNode->FirstChildElement("Version")->GetText(); + ParseXml(); + } else { + ParseConfig(); + } +} - // 使用标准C++时间处理 - std::string createTimeStr = rootNode->FirstChildElement("CreateTime")->GetText(); - std::string changeTimeStr = rootNode->FirstChildElement("ChangeTime")->GetText(); - d->_cCreatTime = parseISOTime(createTimeStr); - d->_cChangeTime = parseISOTime(changeTimeStr); +void XNModelObject::ParseXml() +{ + T_D(); + // 读取配置文件,设置循环执行函数 + std::ifstream file(GetXmlPath()); + if (!file.is_open()) { + LOG_WARNING("0x2161 Failed to open the model configuration file: %1!", GetXmlPath()); + return; + } + tinyxml2::XMLDocument doc; + doc.LoadFile(GetXmlPath().c_str()); + tinyxml2::XMLElement *rootNode = doc.FirstChildElement("Model"); + if (!rootNode) { + LOG_WARNING("0x2161 Failed to parse model configuration file: %1!", GetXmlPath()); + return; + } + // 读取配置文件的模型参数 + const char *modelName = rootNode->FirstChildElement("Name")->GetText(); + if (!modelName || std::string(modelName) != GetObjectName()) { + LOG_WARNING("0x2162 The model name in the configuration file of model %1 is not consistent " + "with the model name in the configuration file of model %2!", + GetObjectName(), modelName ? modelName : "null"); + return; + } + d->_sDescription = rootNode->FirstChildElement("Description")->GetText(); + d->_sAuthor = rootNode->FirstChildElement("Author")->GetText(); + d->_sVersion = rootNode->FirstChildElement("Version")->GetText(); - std::string funcNode = rootNode->FirstChildElement("Node")->GetText(); - d->_runPriority = std::stoi(rootNode->FirstChildElement("Priority")->GetText()); + // 使用标准C++时间处理 + std::string createTimeStr = rootNode->FirstChildElement("CreateTime")->GetText(); + std::string changeTimeStr = rootNode->FirstChildElement("ChangeTime")->GetText(); + d->_cCreatTime = XNSim::parseISOTime(createTimeStr); + d->_cChangeTime = XNSim::parseISOTime(changeTimeStr); - // 检查运行节点是否是 "x-x" 形式 - size_t tmp = funcNode.find('-'); - if (tmp == std::string::npos || tmp == 0) { - LOG_WARNING( - "0x2162 The value of the run node attribute in the configuration file of model " - "%1 is not in the x-x format, registration not executed!", - GetObjectName()); - return; - } + std::string funcNode = rootNode->FirstChildElement("Node")->GetText(); + d->_runPriority = XNSim::safe_stoi(rootNode->FirstChildElement("Priority")->GetText()); - // 使用标准C++字符串处理 - d->_runFreq = std::stoi(funcNode.substr(0, tmp)); - d->_runNode = std::stoi(funcNode.substr(tmp + 1)); + // 检查运行节点是否是 "x-x" 形式 + size_t tmp = funcNode.find('-'); + if (tmp == std::string::npos || tmp == 0) { + LOG_WARNING("0x2162 The value of the run node attribute in the configuration file of model " + "%1 is not in the x-x format, registration not executed!", + GetObjectName()); + return; + } - // 注册周期性函数 - auto framework = GetFramework(); - if (framework) { - auto threadManager = framework->GetThreadManager(); - if (threadManager) { - threadManager->RegisterFunction( - GetUniqueId(), std::bind(&XNModelObject::StepUpdate, this), d->_threadID, - d->_runFreq, d->_runNode, d->_runPriority); - } - } + // 使用标准C++字符串处理 + d->_runFreq = XNSim::safe_stoi(funcNode.substr(0, tmp)); + d->_runNode = XNSim::safe_stoi(funcNode.substr(tmp + 1)); - // 加载动态库 - const char *mathlib = rootNode->FirstChildElement("MathLib")->GetText(); - if (mathlib && strlen(mathlib) > 0) { - // 使用标准C++文件路径处理 - std::filesystem::path xmlPath(GetXmlPath()); - d->_sLibPath = xmlPath.parent_path().string() + "/" + mathlib; - - // 使用标准C++动态库加载 - d->_dynamicLib = dlopen(d->_sLibPath.c_str(), RTLD_LAZY); - if (d->_dynamicLib) { // 动态库加载成功 - LOG_INFO("0x2163 Model %1 loaded algorithm dynamic library %2 successfully!", - GetObjectName(), d->_sLibPath); - } else { - LOG_WARNING( - "0x2160 Model %1 failed to find algorithm dynamic library %2, will not call " - "algorithm!", - GetObjectName(), d->_sLibPath); - d->_dynamicLib = nullptr; - } - } - - // 处理指令列表 - tinyxml2::XMLElement *nodeCmds = rootNode->FirstChildElement("CommandList"); - if (nodeCmds) { - for (tinyxml2::XMLElement *nodeCmd = nodeCmds->FirstChildElement("Command"); - nodeCmd != nullptr; nodeCmd = nodeCmd->NextSiblingElement("Command")) { - const char *cmdName = nodeCmd->Attribute("Name"); - const char *cmdDescription = nodeCmd->Attribute("Description"); - const char *cmdCall = nodeCmd->Attribute("Call"); - // TODO: 处理命令列表 - } + // 注册周期性函数 + auto framework = GetFramework(); + if (framework) { + auto threadManager = framework->GetThreadManager(); + if (threadManager) { + threadManager->RegisterFunction( + GetUniqueId(), std::bind(&XNModelObject::StepUpdate, this), d->_threadID, + d->_runFreq, d->_runNode, d->_runPriority); } } + + // 加载动态库 + const char *mathlib = rootNode->FirstChildElement("MathLib")->GetText(); + if (mathlib && strlen(mathlib) > 0) { + // 使用标准C++文件路径处理 + std::filesystem::path xmlPath(GetXmlPath()); + d->_sLibPath = xmlPath.parent_path().string() + "/" + mathlib; + + // 使用标准C++动态库加载 + d->_dynamicLib = dlopen(d->_sLibPath.c_str(), RTLD_LAZY); + if (d->_dynamicLib) { // 动态库加载成功 + LOG_INFO("0x2163 Model %1 loaded algorithm dynamic library %2 successfully!", + GetObjectName(), d->_sLibPath); + } else { + LOG_WARNING( + "0x2160 Model %1 failed to find algorithm dynamic library %2, will not call " + "algorithm!", + GetObjectName(), d->_sLibPath); + d->_dynamicLib = nullptr; + } + } + + // 处理指令列表 + tinyxml2::XMLElement *nodeCmds = rootNode->FirstChildElement("CommandList"); + if (nodeCmds) { + for (tinyxml2::XMLElement *nodeCmd = nodeCmds->FirstChildElement("Command"); + nodeCmd != nullptr; nodeCmd = nodeCmd->NextSiblingElement("Command")) { + const char *cmdName = nodeCmd->Attribute("Name"); + const char *cmdDescription = nodeCmd->Attribute("Description"); + const char *cmdCall = nodeCmd->Attribute("Call"); + // TODO: 处理命令列表 + } + } +} + +void XNModelObject::ParseConfig() +{ + T_D(); + std::vector nameAndVersion = XNSim::split(GetXmlPath(), ","); + std::string planeName = nameAndVersion[0]; + std::string modelName = nameAndVersion[1]; + std::string modelVersion = nameAndVersion[2]; + // 获取数据库路径 + std::string dbPath = std::getenv("XNCore"); + if (dbPath.empty()) { + LOG_ERROR("0x1015 未设置XNCore环境变量, 引擎将退出!"); + return; + } + dbPath += "/database/XNSim.db"; + + // 打开数据库 + sqlite3 *db; + if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) { + LOG_ERROR("0x1016 打开数据库失败: %1", sqlite3_errmsg(db)); + return; + } + + // 准备SQL语句 + std::string sql = + "SELECT * FROM XNModelsVersion WHERE PlaneName = ? AND ClassName = ? AND Version = ?"; + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { + LOG_ERROR("0x1017 准备SQL语句失败: %1", sqlite3_errmsg(db)); + sqlite3_close(db); + return; + } + + // 绑定参数 + if (sqlite3_bind_text(stmt, 1, planeName.c_str(), planeName.length(), nullptr) != SQLITE_OK + || sqlite3_bind_text(stmt, 2, modelName.c_str(), modelName.length(), nullptr) != SQLITE_OK + || sqlite3_bind_text(stmt, 3, modelVersion.c_str(), modelVersion.length(), nullptr) + != SQLITE_OK) { + LOG_ERROR("0x1018 绑定参数失败: %1", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + sqlite3_close(db); + return; + } + + // 执行查询 + if (sqlite3_step(stmt) != SQLITE_ROW) { + LOG_ERROR("0x1019 未找到机型为%1,模型名称为%2,版本号%3的记录", planeName.c_str(), + modelName.c_str(), modelVersion.c_str()); + sqlite3_finalize(stmt); + sqlite3_close(db); + return; + } + + d->_sDescription = XNSim::getStringFromSqlite3(stmt, 7); + d->_sAuthor = XNSim::getStringFromSqlite3(stmt, 6); + d->_sVersion = XNSim::getStringFromSqlite3(stmt, 2); + + // 解析时间 + std::string createTimeStr = XNSim::getStringFromSqlite3(stmt, 8); + std::string changeTimeStr = XNSim::getStringFromSqlite3(stmt, 9); + d->_cCreatTime = XNSim::parseISOTime(createTimeStr); + d->_cChangeTime = XNSim::parseISOTime(changeTimeStr); + d->_runFreq = XNSim::safe_stoi(XNSim::getStringFromSqlite3(stmt, 10)); + d->_runNode = XNSim::safe_stoi(XNSim::getStringFromSqlite3(stmt, 11)); + d->_runPriority = XNSim::safe_stoi(XNSim::getStringFromSqlite3(stmt, 12)); + + // 注册周期性函数 + auto framework = GetFramework(); + if (framework) { + auto threadManager = framework->GetThreadManager(); + if (threadManager) { + threadManager->RegisterFunction( + GetUniqueId(), std::bind(&XNModelObject::StepUpdate, this), d->_threadID, + d->_runFreq, d->_runNode, d->_runPriority); + } + } + + // 加载动态库 + std::string mathlib = XNSim::getStringFromSqlite3(stmt, 13); + if (mathlib.length() > 0) { + // 使用标准C++文件路径处理 + std::filesystem::path xmlPath(GetXmlPath()); + d->_sLibPath = xmlPath.parent_path().string() + "/" + mathlib; + + // 使用标准C++动态库加载 + d->_dynamicLib = dlopen(d->_sLibPath.c_str(), RTLD_LAZY); + if (d->_dynamicLib) { // 动态库加载成功 + LOG_INFO("0x2163 Model %1 loaded algorithm dynamic library %2 successfully!", + GetObjectName(), d->_sLibPath); + } else { + LOG_WARNING( + "0x2160 Model %1 failed to find algorithm dynamic library %2, will not call " + "algorithm!", + GetObjectName(), d->_sLibPath); + d->_dynamicLib = nullptr; + } + } + + // TODO: 读取模型命令列表 + // 清理资源 + sqlite3_finalize(stmt); + sqlite3_close(db); } // 单步执行函数 diff --git a/XNCore/XNModelObject.h b/XNCore/XNModelObject.h index 540781a..2f7153f 100755 --- a/XNCore/XNModelObject.h +++ b/XNCore/XNModelObject.h @@ -238,6 +238,10 @@ public: public: virtual void RegisterDDSParticipant(); + +private: + void ParseXml(); + void ParseConfig(); }; #define XN_MODEL_INITIALIZE(ClassName) \ diff --git a/XNCore/XNScenarioManager.cpp b/XNCore/XNScenarioManager.cpp index 68e1070..468fdbd 100755 --- a/XNCore/XNScenarioManager.cpp +++ b/XNCore/XNScenarioManager.cpp @@ -66,35 +66,19 @@ bool XNScenarioManager::PrepareForExecute() return true; } -// 辅助函数:分割字符串 -std::vector split(const std::string &str, const std::string &delim) -{ - std::vector tokens; - size_t prev = 0, pos = 0; - do { - pos = str.find(delim, prev); - if (pos == std::string::npos) - pos = str.length(); - std::string token = str.substr(prev, pos - prev); - if (!token.empty()) - tokens.push_back(token); - prev = pos + delim.length(); - } while (pos < str.length() && prev < str.length()); - return tokens; -} - -// 辅助函数:获取文件名(不含扩展名) -std::string getFileNameWithoutExt(const std::string &path) -{ - size_t lastDot = path.find_last_of('.'); - if (lastDot != std::string::npos) { - return path.substr(0, lastDot); - } - return path; -} - // 运行环境配置文件解析 bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t initialType) +{ + T_D(); + if (initialType == 0) { + return ParseScenarioXml(XmlPath); + } else { + return ParseConfig(XmlPath); + } +} + +// 解析运行环境描述文件 +bool XNScenarioManager::ParseScenarioXml(const std::string &XmlPath) { T_D(); std::ifstream file(XmlPath); @@ -114,6 +98,7 @@ bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t std::string OSName = envInfo->Attribute("OSName"); std::string version = envInfo->Attribute("Version"); std::string kernel = envInfo->Attribute("RTXVersion"); + std::string planeName = envInfo->Attribute("PlaneName"); // 设置工作目录 std::string rootPath = envInfo->Attribute("WorkPath"); GetFramework()->SetWorkPath(rootPath); @@ -128,7 +113,7 @@ bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t GetFramework()->GetDDSManager()->SetDomainID(domainID); // 读取CPU亲和性 std::string cpuAff = envInfo->Attribute("CPUAffinity"); - std::vector cpuAffList = split(cpuAff, ","); + std::vector cpuAffList = XNSim::split(cpuAff, ","); //读取服务列表 tinyxml2::XMLElement *serviceList = root->FirstChildElement("ServicesList"); @@ -137,10 +122,12 @@ bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t while (service) { std::string serviceName = service->Attribute("Name"); std::string libName = service->Attribute("ClassName"); - libName = getFileNameWithoutExt(libName); - std::string dynamicLibName = servicePath + "lib" + libName + ".so"; + std::string serviceVersion = service->Attribute("Version"); + libName = XNSim::getFileNameWithoutExt(libName); + std::string dynamicLibName = servicePath + "lib" + libName + ".so." + serviceVersion; // 加载动态库 - GetFramework()->GetServiceManager()->LoadService(dynamicLibName, libName, 0); + GetFramework()->GetServiceManager()->LoadService(dynamicLibName, libName, + serviceVersion, 0); service = service->NextSiblingElement("Service"); } } @@ -153,14 +140,14 @@ bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t // 读取模型分组频率 double modelGroupFreq = std::stod(modelGroup->Attribute("Freq")); // 读取模型分组优先级 - int modelGroupPriority = std::stoi(modelGroup->Attribute("Priority")); + int modelGroupPriority = XNSim::safe_stoi(modelGroup->Attribute("Priority")); if (modelGroupPriority > 99 || modelGroupPriority < 0) { LOG_ERROR("0x2100 模型分组优先级设置错误,优先级值:%d", modelGroupPriority); return false; } // 读取模型分组CPU亲和性 std::string modelGroupCPUAff = modelGroup->Attribute("CPUAff"); - std::vector modelGroupCPUAffList = split(modelGroupCPUAff, ","); + std::vector modelGroupCPUAffList = XNSim::split(modelGroupCPUAff, ","); // 验证CPU亲和性 for (const auto &cpu : modelGroupCPUAffList) { @@ -188,10 +175,12 @@ bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t while (model) { std::string modelName = model->Attribute("Name"); std::string libName = model->Attribute("ClassName"); - libName = getFileNameWithoutExt(libName); - std::string dynamicLibName = modelPath + "lib" + libName + ".so"; + std::string modelVersion = model->Attribute("Version"); + libName = XNSim::getFileNameWithoutExt(libName); + std::string dynamicLibName = modelPath + "lib" + libName + ".so." + modelVersion; // 加载动态库 - GetFramework()->GetModelManager()->LoadModel(dynamicLibName, libName, 0, threadID); + GetFramework()->GetModelManager()->LoadModel(dynamicLibName, libName, modelVersion, + planeName, 0, threadID); model = model->NextSiblingElement("Model"); } @@ -200,3 +189,204 @@ bool XNScenarioManager::AnalysisScenarioXml(const std::string &XmlPath, uint32_t return true; } + +// 解析构型配置文件 +bool XNScenarioManager::ParseConfig(const std::string &ConfigID) +{ + T_D(); + // 获取数据库路径 + std::string dbPath = std::getenv("XNCore"); + if (dbPath.empty()) { + LOG_ERROR("0x1015 未设置XNCore环境变量, 引擎将退出!"); + return false; + } + dbPath += "/database/XNSim.db"; + + // 打开数据库 + sqlite3 *db; + if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) { + LOG_ERROR("0x1016 打开数据库失败: %1", sqlite3_errmsg(db)); + return false; + } + + // 准备SQL语句 + std::string sql = "SELECT * FROM Configuration WHERE ConfID = ?"; + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { + LOG_ERROR("0x1017 准备SQL语句失败: %1", sqlite3_errmsg(db)); + sqlite3_close(db); + return false; + } + + // 绑定参数 + int configIdInt = XNSim::safe_stoi(ConfigID); + if (sqlite3_bind_int(stmt, 1, configIdInt) != SQLITE_OK) { + LOG_ERROR("0x1018 绑定参数失败: %1", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + sqlite3_close(db); + return false; + } + + // 执行查询 + if (sqlite3_step(stmt) != SQLITE_ROW) { + LOG_ERROR("0x1019 未找到配置ID为%1的记录", ConfigID); + sqlite3_finalize(stmt); + sqlite3_close(db); + return false; + } + std::string planeName = XNSim::getStringFromSqlite3(stmt, 1); + std::string osName = XNSim::getStringFromSqlite3(stmt, 3); + std::string version = XNSim::getStringFromSqlite3(stmt, 4); + std::string kernel = XNSim::getStringFromSqlite3(stmt, 5); + std::string rootPath = XNSim::getStringFromSqlite3(stmt, 7); + GetFramework()->SetWorkPath(rootPath); + // 设置模型库目录 + std::string modelPath = rootPath + XNSim::getStringFromSqlite3(stmt, 8); + GetFramework()->SetModelPath(modelPath); + // 设置服务库目录 + std::string servicePath = rootPath + XNSim::getStringFromSqlite3(stmt, 9); + GetFramework()->SetServicePath(servicePath); + // 设置域ID + uint32_t domainID = std::stoul(XNSim::getStringFromSqlite3(stmt, 10)); + GetFramework()->GetDDSManager()->SetDomainID(domainID); + // 读取CPU亲和性 + std::string cpuAff = XNSim::getStringFromSqlite3(stmt, 6); + std::vector cpuAffList = XNSim::split(cpuAff, ","); + + //查询LoadServices表读取服务信息 + std::string servicesSql = "SELECT * FROM LoadServices WHERE ConfID = ?"; + sqlite3_stmt *servicesStmt; + if (sqlite3_prepare_v2(db, servicesSql.c_str(), -1, &servicesStmt, nullptr) != SQLITE_OK) { + LOG_ERROR("0x1020 准备LoadServices查询语句失败: %1", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + sqlite3_close(db); + return false; + } + // 绑定参数 + if (sqlite3_bind_int(servicesStmt, 1, configIdInt) != SQLITE_OK) { + LOG_ERROR("0x1021 绑定LoadServices参数失败: %1", sqlite3_errmsg(db)); + sqlite3_finalize(servicesStmt); + sqlite3_finalize(stmt); + sqlite3_close(db); + return false; + } + + // 执行查询并处理结果 + while (sqlite3_step(servicesStmt) == SQLITE_ROW) { + // 获取服务信息 + std::string ClassName = XNSim::getStringFromSqlite3(servicesStmt, 1); + std::string ServiceVersion = XNSim::getStringFromSqlite3(servicesStmt, 2); + std::string ServiceName = XNSim::getStringFromSqlite3(servicesStmt, 3); + + ClassName = XNSim::getFileNameWithoutExt(ClassName); + std::string dynamicLibName = servicePath + "lib" + ClassName + ".so." + ServiceVersion; + // 加载动态库 + GetFramework()->GetServiceManager()->LoadService(dynamicLibName, ClassName, ServiceVersion, + 1); + } + + // 查询LoadModelGroups表读取模型组信息 + std::string modelGroupsSql = "SELECT * FROM LoadModelGroups WHERE ConfID = ?"; + sqlite3_stmt *modelGroupsStmt; + if (sqlite3_prepare_v2(db, modelGroupsSql.c_str(), -1, &modelGroupsStmt, nullptr) + != SQLITE_OK) { + LOG_ERROR("0x1020 准备LoadModelGroups查询语句失败: %1", sqlite3_errmsg(db)); + sqlite3_finalize(servicesStmt); + sqlite3_finalize(stmt); + sqlite3_close(db); + return false; + } + + // 绑定参数 + if (sqlite3_bind_int(modelGroupsStmt, 1, configIdInt) != SQLITE_OK) { + LOG_ERROR("0x1021 绑定LoadModelGroups参数失败: %1", sqlite3_errmsg(db)); + sqlite3_finalize(modelGroupsStmt); + sqlite3_finalize(servicesStmt); + sqlite3_finalize(stmt); + sqlite3_close(db); + return false; + } + + // 执行查询并处理结果 + while (sqlite3_step(modelGroupsStmt) == SQLITE_ROW) { + // 获取模型组信息 + std::string GroupID = XNSim::getStringFromSqlite3(modelGroupsStmt, 1); + std::string GroupName = XNSim::getStringFromSqlite3(modelGroupsStmt, 2); + double GroupFreq = std::stod(XNSim::getStringFromSqlite3(modelGroupsStmt, 3)); + uint32_t GroupPriority = XNSim::safe_stoi(XNSim::getStringFromSqlite3(modelGroupsStmt, 4)); + std::string GroupCPUAff = XNSim::getStringFromSqlite3(modelGroupsStmt, 5); + std::vector GroupCPUAffList = XNSim::split(GroupCPUAff, ","); + + // 验证CPU亲和性 + for (const auto &cpu : GroupCPUAffList) { + if (std::find(cpuAffList.begin(), cpuAffList.end(), cpu) == cpuAffList.end()) { + LOG_ERROR("0x2100 模型分组CPU亲和性设置错误,CPU亲和性值:%s,进程CPU亲和性值:%s", + cpu.c_str(), cpuAff.c_str()); + sqlite3_finalize(modelGroupsStmt); + sqlite3_finalize(servicesStmt); + sqlite3_finalize(stmt); + sqlite3_close(db); + return false; + } + } + + int ThreadCpuAffinity = 0; + for (const auto &cpu : GroupCPUAffList) { + auto it = std::find(cpuAffList.begin(), cpuAffList.end(), cpu); + if (it != cpuAffList.end()) { + ThreadCpuAffinity |= 1 << std::distance(cpuAffList.begin(), it); + } + } + LOG_INFO("0x1021 添加线程池: %1", GroupName); + // 添加线程池 + uint32_t threadID = GetFramework()->GetThreadManager()->AddThreadPool( + GroupName, GroupFreq, GroupPriority, ThreadCpuAffinity); + + // 准备查询LoadModels表的SQL语句 + std::string modelsSql = "SELECT * FROM LoadModels WHERE GroupID = ?"; + sqlite3_stmt *modelsStmt = nullptr; + if (sqlite3_prepare_v2(db, modelsSql.c_str(), -1, &modelsStmt, nullptr) != SQLITE_OK) { + LOG_ERROR("0x1022 准备LoadModels查询语句失败: %1", sqlite3_errmsg(db)); + sqlite3_finalize(modelGroupsStmt); + sqlite3_finalize(servicesStmt); + sqlite3_finalize(stmt); + sqlite3_close(db); + return false; + } + + // 绑定参数 + if (sqlite3_bind_int(modelsStmt, 1, XNSim::safe_stoi(GroupID)) != SQLITE_OK) { + LOG_ERROR("0x1023 绑定LoadModels参数失败: %1", sqlite3_errmsg(db)); + sqlite3_finalize(modelsStmt); + sqlite3_finalize(modelGroupsStmt); + sqlite3_finalize(servicesStmt); + sqlite3_finalize(stmt); + sqlite3_close(db); + return false; + } + + // 执行查询并处理结果 + while (sqlite3_step(modelsStmt) == SQLITE_ROW) { + // 获取模型信息 + std::string ClassName = XNSim::getStringFromSqlite3(modelsStmt, 1); + std::string ModelVersion = XNSim::getStringFromSqlite3(modelsStmt, 2); + std::string ModelName = XNSim::getStringFromSqlite3(modelsStmt, 3); + + ClassName = XNSim::getFileNameWithoutExt(ClassName); + std::string dynamicLibName = modelPath + "lib" + ClassName + ".so." + ModelVersion; + // 加载动态库 + LOG_INFO("0x1021 加载模型: %1", dynamicLibName); + GetFramework()->GetModelManager()->LoadModel(dynamicLibName, ClassName, ModelVersion, + planeName, 1, threadID); + } + // 清理资源 + sqlite3_finalize(modelsStmt); + } + + // 清理资源 + sqlite3_finalize(modelGroupsStmt); + sqlite3_finalize(servicesStmt); + sqlite3_finalize(stmt); + sqlite3_close(db); + return true; +} diff --git a/XNCore/XNScenarioManager.h b/XNCore/XNScenarioManager.h index 89a293b..b659e78 100755 --- a/XNCore/XNScenarioManager.h +++ b/XNCore/XNScenarioManager.h @@ -76,4 +76,21 @@ public: * @return false: 解析失败 */ virtual bool AnalysisScenarioXml(const std::string &XmlPath, uint32_t initialType); + +private: + /** + * @brief 解析运行环境配置文件 + * @param XmlPath: std::string类型,运行环境配置文件解析路径 + * @return true: 解析成功 + * @return false: 解析失败 + */ + bool ParseScenarioXml(const std::string &XmlPath); + + /** + * @brief 解析构型配置文件 + * @param ConfigID: std::string类型,构型配置文件在数据库中的ID + * @return true: 解析成功 + * @return false: 解析失败 + */ + bool ParseConfig(const std::string &ConfigID); }; diff --git a/XNCore/XNServiceManager.cpp b/XNCore/XNServiceManager.cpp index 4bdb00e..cdce8a4 100755 --- a/XNCore/XNServiceManager.cpp +++ b/XNCore/XNServiceManager.cpp @@ -38,7 +38,7 @@ bool XNServiceManager::PrepareForExecute() } void XNServiceManager::LoadService(const std::string &servicePath, const std::string &serviceName, - uint32_t initialType) + const std::string &serviceVersion, uint32_t initialType) { T_D(); void *handle = dlopen(servicePath.c_str(), RTLD_LAZY); @@ -59,15 +59,26 @@ void XNServiceManager::LoadService(const std::string &servicePath, const std::st service->SetUniqueId(serviceID); service->SetObjectName(serviceName); service->SetFramework(GetFramework()); - // 使用std::filesystem处理路径 - std::filesystem::path configPath = - std::filesystem::path(servicePath).parent_path() / (serviceName + ".scfg"); - service->SetXmlPath(configPath.string()); + if (initialType == 0) { + // 使用std::filesystem处理路径 + std::filesystem::path configPath = + std::filesystem::path(servicePath).parent_path() + / (serviceName + "_V" + serviceVersion + ".scfg"); + service->SetXmlPath(configPath.string()); + } else if (initialType == 1) { + LOG_INFO("0x2176 加载服务: %1", serviceName + "," + serviceVersion); + service->SetXmlPath(serviceName + "," + serviceVersion); + } else { + LOG_WARNING("0x2175 InitialType Error, InitialType: %d", initialType); + dlclose(handle); + return; + } // 注册服务到管理器 d->ServiceList[serviceID] = service; service->SetInitializeType(initialType); // 初始化服务 + LOG_INFO("0x2176 初始化服务: %1", serviceName); service->Initialize(); } else { LOG_WARNING("0x2173 Service %s Not found in dynamic link library %s!", diff --git a/XNCore/XNServiceManager.h b/XNCore/XNServiceManager.h index eb0a5bb..a736a7f 100755 --- a/XNCore/XNServiceManager.h +++ b/XNCore/XNServiceManager.h @@ -29,7 +29,7 @@ public: virtual bool Initialize() override; virtual bool PrepareForExecute() override; void LoadService(const std::string &servicePath, const std::string &serviceName, - uint32_t initialType); + const std::string &serviceVersion, uint32_t initialType); public: XNServiceObjectPtr GetService(uint32_t serviceID); diff --git a/XNCore/XNServiceObject.cpp b/XNCore/XNServiceObject.cpp index 8fd2626..15b6b63 100755 --- a/XNCore/XNServiceObject.cpp +++ b/XNCore/XNServiceObject.cpp @@ -139,51 +139,154 @@ void XNServiceObject::Initialize() { T_D(); if (d->_initialType == 0) { - tinyxml2::XMLDocument doc; - if (doc.LoadFile(GetXmlPath().c_str()) != tinyxml2::XML_SUCCESS) { - LOG_WARNING("Failed to open the service configuration file: %1!", GetXmlPath()); - return; - } - - tinyxml2::XMLElement *rootNode = doc.RootElement(); - if (!rootNode) { - LOG_WARNING("Invalid XML file format: %1!", GetXmlPath()); - return; - } - - const char *serviceName = rootNode->FirstChildElement("Name")->GetText(); - if (serviceName != GetObjectName()) { - LOG_WARNING( - "The service name in the configuration file of service %1 is not consistent " - "with the service name in the configuration file of service %2!", - GetObjectName(), serviceName); - return; - } - - d->_sDescription = rootNode->FirstChildElement("Description")->GetText(); - d->_sAuthor = rootNode->FirstChildElement("Author")->GetText(); - d->_sVersion = rootNode->FirstChildElement("Version")->GetText(); - - // 解析时间 - const char *createTimeStr = rootNode->FirstChildElement("CreateTime")->GetText(); - const char *changeTimeStr = rootNode->FirstChildElement("ChangeTime")->GetText(); - d->_cCreateTime = parseISOTime(createTimeStr); - d->_cChangeTime = parseISOTime(changeTimeStr); - - tinyxml2::XMLElement *nodeCmds = rootNode->FirstChildElement("CommandList"); - if (nodeCmds) { - for (tinyxml2::XMLElement *nodeCmd = nodeCmds->FirstChildElement("Command"); - nodeCmd != nullptr; nodeCmd = nodeCmd->NextSiblingElement("Command")) { - const char *cmdName = nodeCmd->Attribute("Name"); - const char *cmdDescription = nodeCmd->Attribute("Description"); - const char *cmdCall = nodeCmd->Attribute("Call"); - // TODO: 处理命令信息 - } - } + ParseXml(); } else { + ParseConfig(); } } +void XNServiceObject::ParseXml() +{ + T_D(); + tinyxml2::XMLDocument doc; + if (doc.LoadFile(GetXmlPath().c_str()) != tinyxml2::XML_SUCCESS) { + LOG_WARNING("Failed to open the service configuration file: %1!", GetXmlPath()); + return; + } + + tinyxml2::XMLElement *rootNode = doc.RootElement(); + if (!rootNode) { + LOG_WARNING("Invalid XML file format: %1!", GetXmlPath()); + return; + } + + const char *serviceName = rootNode->FirstChildElement("Name")->GetText(); + if (serviceName != GetObjectName()) { + LOG_WARNING("The service name in the configuration file of service %1 is not consistent " + "with the service name in the configuration file of service %2!", + GetObjectName(), serviceName); + return; + } + + d->_sDescription = rootNode->FirstChildElement("Description")->GetText(); + d->_sAuthor = rootNode->FirstChildElement("Author")->GetText(); + d->_sVersion = rootNode->FirstChildElement("Version")->GetText(); + + // 解析时间 + const char *createTimeStr = rootNode->FirstChildElement("CreateTime")->GetText(); + const char *changeTimeStr = rootNode->FirstChildElement("ChangeTime")->GetText(); + d->_cCreateTime = XNSim::parseISOTime(createTimeStr); + d->_cChangeTime = XNSim::parseISOTime(changeTimeStr); + + tinyxml2::XMLElement *nodeCmds = rootNode->FirstChildElement("CommandList"); + if (nodeCmds) { + for (tinyxml2::XMLElement *nodeCmd = nodeCmds->FirstChildElement("Command"); + nodeCmd != nullptr; nodeCmd = nodeCmd->NextSiblingElement("Command")) { + const char *cmdName = nodeCmd->Attribute("Name"); + const char *cmdDescription = nodeCmd->Attribute("Description"); + const char *cmdCall = nodeCmd->Attribute("Call"); + // TODO: 处理命令信息 + } + } +} + +void XNServiceObject::ParseConfig() +{ + T_D(); + std::vector nameAndVersion = XNSim::split(GetXmlPath(), ","); + std::string serviceName = nameAndVersion[0]; + std::string serviceVersion = nameAndVersion[1]; + // 获取数据库路径 + std::string dbPath = std::getenv("XNCore"); + if (dbPath.empty()) { + LOG_ERROR("0x1015 未设置XNCore环境变量, 引擎将退出!"); + return; + } + dbPath += "/database/XNSim.db"; + + // 打开数据库 + sqlite3 *db; + if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) { + LOG_ERROR("0x1016 打开数据库失败: %1", sqlite3_errmsg(db)); + return; + } + + // 准备SQL语句 + std::string sql = "SELECT * FROM XNServiceVersion WHERE ClassName = ? AND Version = ?"; + sqlite3_stmt *stmt; + if (sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { + LOG_ERROR("0x1017 准备SQL语句失败: %1", sqlite3_errmsg(db)); + sqlite3_close(db); + return; + } + + // 绑定参数 + if (sqlite3_bind_text(stmt, 1, serviceName.c_str(), serviceName.length(), nullptr) != SQLITE_OK + || sqlite3_bind_text(stmt, 2, serviceVersion.c_str(), serviceVersion.length(), nullptr) + != SQLITE_OK) { + LOG_ERROR("0x1018 绑定参数失败: %1", sqlite3_errmsg(db)); + sqlite3_finalize(stmt); + sqlite3_close(db); + return; + } + + // 执行查询 + if (sqlite3_step(stmt) != SQLITE_ROW) { + LOG_ERROR("0x1019 未找到服务名称为%1,版本号%2的记录", serviceName.c_str(), + serviceVersion.c_str()); + sqlite3_finalize(stmt); + sqlite3_close(db); + return; + } + d->_sDescription = XNSim::getStringFromSqlite3(stmt, 5); + d->_sAuthor = XNSim::getStringFromSqlite3(stmt, 4); + d->_sVersion = XNSim::getStringFromSqlite3(stmt, 2); + + // 解析时间 + std::string createTimeStr = XNSim::getStringFromSqlite3(stmt, 6); + std::string changeTimeStr = XNSim::getStringFromSqlite3(stmt, 7); + d->_cCreateTime = XNSim::parseISOTime(createTimeStr); + d->_cChangeTime = XNSim::parseISOTime(changeTimeStr); + + // 读取服务命令列表 + std::string commandListStr = XNSim::getStringFromSqlite3(stmt, 8); + if (!commandListStr.empty()) { + try { + XN_JSON commandList = XN_JSON::parse(commandListStr); + if (commandList.is_array()) { + for (const auto &cmd : commandList) { + if (cmd.contains("Name") && cmd.contains("Description") + && cmd.contains("Call")) { + LOG_INFO("0x1021 服务命令: %1", cmd["Name"].get()); + // TODO: 处理服务命令信息 + // d->_commandList.emplace_back( + // cmd["Name"].get(), + // cmd["Description"].get(), + // cmd["Call"].get() + // ); + } + } + } + } catch (const std::exception &e) { + LOG_WARNING("0x1020 解析服务命令列表失败: %1", e.what()); + } + } + + // 读取其他参数 + std::string otherParamsStr = XNSim::getStringFromSqlite3(stmt, 9); + if (!otherParamsStr.empty()) { + try { + d->_otherParams = XN_JSON::parse(otherParamsStr); + } catch (const std::exception &e) { + LOG_WARNING("0x1020 解析其他参数失败: %1", e.what()); + } + } + + // 清理资源 + sqlite3_finalize(stmt); + sqlite3_close(db); +} + void XNServiceObject::PrepareForExecute() { T_D(); diff --git a/XNCore/XNServiceObject.h b/XNCore/XNServiceObject.h index 163be32..c01ff25 100755 --- a/XNCore/XNServiceObject.h +++ b/XNCore/XNServiceObject.h @@ -54,6 +54,10 @@ public: protected: XNFrameworkPtr GetFramework() const; + +private: + void ParseXml(); + void ParseConfig(); }; XNCLASS_PTR_DECLARE(XNServiceObject) diff --git a/XNCore/XNServiceObject_p.h b/XNCore/XNServiceObject_p.h index a9c4bb4..426dd33 100755 --- a/XNCore/XNServiceObject_p.h +++ b/XNCore/XNServiceObject_p.h @@ -11,4 +11,5 @@ struct XNServiceObjectPrivate : public XNObjectPrivate { std::unordered_map _dataWriters; XNFrameworkPtr pFramework; uint32_t _initialType; + XN_JSON _otherParams; }; diff --git a/XNEngine/XNEngine.cpp b/XNEngine/XNEngine.cpp index e28c70c..7ec7439 100755 --- a/XNEngine/XNEngine.cpp +++ b/XNEngine/XNEngine.cpp @@ -403,24 +403,35 @@ void XNEngine::PublishEngineStatus() } // 运行引擎 -bool XNEngine::Run(const std::string &XmlPath) +bool XNEngine::Run(const std::string &XmlPath, const uint32_t InitializeType) { if (!framework) { return false; } - // 解析配置文件 - bool isReady = ParseConfig(XmlPath); - // 如果解析配置文件失败 - if (!isReady) { - // 返回失败 - return false; + if (InitializeType == 0) { + // 解析配置文件 + bool isReady = ParseConfig(XmlPath); + // 如果解析配置文件失败 + if (!isReady) { + // 返回失败 + return false; + } + + } else if (InitializeType == 1) { + // 解析数据库 + bool isReady = ParseDataBase(XmlPath); + // 如果解析数据库失败 + if (!isReady) { + // 返回失败 + return false; + } } // 设置场景XML路径 framework->SetScenarioXml(XmlPath); // 设置CPU亲和性 framework->SetCpuAffinity(CPUAffinity); // 单次触发初始化信号 - bool ret = framework->Initialize(0); + bool ret = framework->Initialize(InitializeType); // 如果初始化失败 if (!ret) { LOG_ERROR("0x1012 初始化失败, 引擎将退出!"); @@ -488,7 +499,7 @@ bool XNEngine::Run(const std::string &XmlPath) } // 运行引擎 -bool XNEngine::ParseDataBase(const uint32_t &ConfigId) +bool XNEngine::ParseDataBase(const std::string &ConfigId) { // 获取数据库路径 std::string dbPath = std::getenv("XNCore"); @@ -501,7 +512,7 @@ bool XNEngine::ParseDataBase(const uint32_t &ConfigId) // 打开数据库 sqlite3 *db; if (sqlite3_open(dbPath.c_str(), &db) != SQLITE_OK) { - LOG_ERROR("0x1016 打开数据库失败: {}", sqlite3_errmsg(db)); + LOG_ERROR("0x1016 打开数据库失败: %1", sqlite3_errmsg(db)); return false; } @@ -509,14 +520,15 @@ bool XNEngine::ParseDataBase(const uint32_t &ConfigId) std::string sql = "SELECT * FROM Configuration WHERE ConfID = ?"; sqlite3_stmt *stmt; if (sqlite3_prepare_v2(db, sql.c_str(), -1, &stmt, nullptr) != SQLITE_OK) { - LOG_ERROR("0x1017 准备SQL语句失败: {}", sqlite3_errmsg(db)); + LOG_ERROR("0x1017 准备SQL语句失败: %1", sqlite3_errmsg(db)); sqlite3_close(db); return false; } // 绑定参数 - if (sqlite3_bind_int(stmt, 1, ConfigId) != SQLITE_OK) { - LOG_ERROR("0x1018 绑定参数失败: {}", sqlite3_errmsg(db)); + int configIdInt = std::stoi(ConfigId); + if (sqlite3_bind_int(stmt, 1, configIdInt) != SQLITE_OK) { + LOG_ERROR("0x1018 绑定参数失败: %1", sqlite3_errmsg(db)); sqlite3_finalize(stmt); sqlite3_close(db); return false; @@ -524,7 +536,7 @@ bool XNEngine::ParseDataBase(const uint32_t &ConfigId) // 执行查询 if (sqlite3_step(stmt) != SQLITE_ROW) { - LOG_ERROR("0x1019 未找到配置ID为{}的记录", ConfigId); + LOG_ERROR("0x1019 未找到配置ID为%1的记录", ConfigId); sqlite3_finalize(stmt); sqlite3_close(db); return false; @@ -539,7 +551,8 @@ bool XNEngine::ParseDataBase(const uint32_t &ConfigId) CPUAffinity = 0; // 读取配置信息 - std::string CPUAff = reinterpret_cast(sqlite3_column_text(stmt, 6)); + std::string CPUAff = XNSim::getStringFromSqlite3(stmt, 6); + //std::string CPUAff = reinterpret_cast(sqlite3_column_text(stmt, 6)); std::istringstream iss(CPUAff); std::string cpuIndex; @@ -591,88 +604,6 @@ bool XNEngine::ParseDataBase(const uint32_t &ConfigId) sqlite3_close(db); return true; } - -bool XNEngine::Run(const uint32_t &ConfigId) -{ - if (!framework) { - return false; - } - // 解析数据库 - bool isReady = ParseDataBase(ConfigId); - // 如果解析数据库失败 - if (!isReady) { - // 返回失败 - return false; - } - // 设置构型ID - //framework->SetScenarioId(ConfigId); - // 设置CPU亲和性 - framework->SetCpuAffinity(CPUAffinity); - // 单次触发初始化信号 - bool ret = framework->Initialize(1); - // 如果初始化失败 - if (!ret) { - LOG_ERROR("0x1012 初始化失败, 引擎将退出!"); - // 返回失败 - return false; - } - // 如果初始化成功 - // 设置框架状态 - frameworkStatus = XNFrameObjectStatus::Initialized; - // 记录信息日志 - LOG_INFO("引擎初始化成功!"); - // 如果测试模式 - if (isTestMode) { - // 记录信息日志 - LOG_INFO("引擎测试通过!"); - // 返回成功 - return true; - } - ret = framework->PrepareForExecute(); - // 如果准备执行失败 - if (!ret) { - LOG_ERROR("0x1013 准备执行失败, 引擎将退出!"); - // 返回失败 - return false; - } - // 设置框架状态 - frameworkStatus = XNFrameObjectStatus::Ready; - // 获取DDS管理器 - XNDDSManagerPtr ddsManager = framework->GetDDSManager(); - // 如果DDS管理器存在 - if (ddsManager) { - // 注册仿真控制订阅者 - auto func = std::bind(&XNEngine::SimControlListener, this, std::placeholders::_1); - ddsManager->RegisterSubscriber( - "XNSim::XNSimControl::XNRuntimeControl", 0, func); - // 触发仿真控制信号 - framework->SimControl(0, SimControlCmd::Start); - // 注册引擎状态发布者 - engineStatusWriter = - ddsManager->RegisterPublisher( - "XNSim::XNSimStatus::XNEngineStatus", 0); - // 如果引擎状态写入器存在 - if (engineStatusWriter) { - // 设置引擎运行标志 - engineRunning = true; - while (engineRunning) { - // 发布一次初始状态 - PublishEngineStatus(); - // 等待1秒 - std::this_thread::sleep_for(std::chrono::seconds(1)); - } - if (!engineRunning) { - // 取消注册引擎状态发布者 - //ddsManager->UnregisterPublisher("XNSim::XNSimStatus::XNEngineStatus"); - //ddsManager->UnregisterSubscriber("XNSim::XNSimControl::XNRuntimeControl"); - } - } - } else { - // 记录错误日志 - LOG_ERROR("0x1014 无法发送引擎运行状态, 引擎将退出!"); - } - return true; -} // 设置测试模式 void XNEngine::SetTestMode(bool isTestMode) { diff --git a/XNEngine/XNEngine.h b/XNEngine/XNEngine.h index 8c0d66c..30f2a5a 100755 --- a/XNEngine/XNEngine.h +++ b/XNEngine/XNEngine.h @@ -40,13 +40,8 @@ public: * @param XmlPath 场景XML路径 * @return 是否成功 */ - bool Run(const std::string &XmlPath); - /** - * @brief 运行引擎 - * @param ConfigId 构型ID - * @return 是否成功 - */ - bool Run(const uint32_t &ConfigId); + bool Run(const std::string &XmlPath, const uint32_t InitializeType); + /** * @brief 设置测试模式 * @param isTestMode 是否为测试模式 @@ -66,7 +61,7 @@ private: * @param ConfigId 配置ID * @return 是否成功 */ - bool ParseDataBase(const uint32_t &ConfigId); + bool ParseDataBase(const std::string &ConfigId); /** * @brief 设置控制台输出 diff --git a/XNEngine/main.cpp b/XNEngine/main.cpp index d4acff3..38bafd9 100755 --- a/XNEngine/main.cpp +++ b/XNEngine/main.cpp @@ -72,9 +72,9 @@ int main(int argc, char *argv[]) //检测配置文件格式 if (hasConfigPath) { - return engine.Run(configPath); + return engine.Run(configPath, 0); } else if (hasConfigId) { - return engine.Run(configId); + return engine.Run(configId, 1); } return -1; } diff --git a/XNModels/XNATA04DataProcessor/CMakeLists.txt b/XNModels/XNATA04DataProcessor/CMakeLists.txt index a2b2903..bb44890 100755 --- a/XNModels/XNATA04DataProcessor/CMakeLists.txt +++ b/XNModels/XNATA04DataProcessor/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.16) project(XNATA04DataProcessor LANGUAGES CXX) +set(MODEL_VERSION "1.0.0.0") + set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -23,6 +25,14 @@ add_library(XNATA04DataProcessor SHARED XNATA04DataProcessor_p.h ) +set_target_properties(XNATA04DataProcessor PROPERTIES + LIBRARY_OUTPUT_NAME "libXNATA04DataProcessor.so.${MODEL_VERSION}" + PREFIX "" + SUFFIX "" + SKIP_BUILD_RPATH TRUE + BUILD_WITH_INSTALL_RPATH TRUE +) + target_link_libraries(XNATA04DataProcessor PRIVATE ${XNCore_PATH}/lib/libXNCore.so ${XNCore_PATH}/lib/libC909_V1_Interface.so @@ -45,4 +55,7 @@ install(TARGETS XNATA04DataProcessor file(GLOB CONFIG_FILE "*.mcfg") # 使用 install 命令在安装时拷贝配置文件 -install(FILES ${CONFIG_FILE} DESTINATION ${CMAKE_INSTALL_PREFIX}) +install(FILES ${CONFIG_FILE} + DESTINATION ${CMAKE_INSTALL_PREFIX} + RENAME "XNATA04DataProcessor_V${MODEL_VERSION}.mcfg" +) \ No newline at end of file diff --git a/XNModels/XNAerodynamics/CMakeLists.txt b/XNModels/XNAerodynamics/CMakeLists.txt index 6b1e005..ba3848a 100755 --- a/XNModels/XNAerodynamics/CMakeLists.txt +++ b/XNModels/XNAerodynamics/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.16) project(XNAerodynamics LANGUAGES CXX) +set(MODEL_VERSION "1.0.0.0") + set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -24,6 +26,14 @@ add_library(XNAerodynamics SHARED XNAerodynamics_p.h ) +set_target_properties(XNAerodynamics PROPERTIES + LIBRARY_OUTPUT_NAME "libXNAerodynamics.so.${MODEL_VERSION}" + PREFIX "" + SUFFIX "" + SKIP_BUILD_RPATH TRUE + BUILD_WITH_INSTALL_RPATH TRUE +) + target_link_libraries(XNAerodynamics PRIVATE ${XNCore_PATH}/lib/libXNCore.so ${XNCore_PATH}/lib/libC909_V1_Interface.so @@ -47,4 +57,7 @@ install(TARGETS XNAerodynamics file(GLOB CONFIG_FILE "*.mcfg") # 使用 install 命令在安装时拷贝配置文件 -install(FILES ${CONFIG_FILE} DESTINATION ${CMAKE_INSTALL_PREFIX}) +install(FILES ${CONFIG_FILE} + DESTINATION ${CMAKE_INSTALL_PREFIX} + RENAME "XNAerodynamics_V${MODEL_VERSION}.mcfg" +) diff --git a/XNModels/XNGroundHandling/CMakeLists.txt b/XNModels/XNGroundHandling/CMakeLists.txt index a38ba1c..bb5cc98 100755 --- a/XNModels/XNGroundHandling/CMakeLists.txt +++ b/XNModels/XNGroundHandling/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.16) project(XNGroundHandling LANGUAGES CXX) +set(MODEL_VERSION "1.0.0.0") + set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -24,6 +26,14 @@ add_library(XNGroundHandling SHARED XNGroundHandling_p.h ) +set_target_properties(XNGroundHandling PROPERTIES + LIBRARY_OUTPUT_NAME "libXNGroundHandling.so.${MODEL_VERSION}" + PREFIX "" + SUFFIX "" + SKIP_BUILD_RPATH TRUE + BUILD_WITH_INSTALL_RPATH TRUE +) + target_link_libraries(XNGroundHandling PRIVATE ${XNCore_PATH}/lib/libXNCore.so ${XNCore_PATH}/lib/libC909_V1_Interface.so @@ -46,4 +56,7 @@ install(TARGETS XNGroundHandling file(GLOB CONFIG_FILE "*.mcfg") # 使用 install 命令在安装时拷贝配置文件 -install(FILES ${CONFIG_FILE} DESTINATION ${CMAKE_INSTALL_PREFIX}) +install(FILES ${CONFIG_FILE} + DESTINATION ${CMAKE_INSTALL_PREFIX} + RENAME "XNGroundHandling_V${MODEL_VERSION}.mcfg" +) \ No newline at end of file diff --git a/XNModels/XNWeightBalance/CMakeLists.txt b/XNModels/XNWeightBalance/CMakeLists.txt index 27cf78b..03a0313 100755 --- a/XNModels/XNWeightBalance/CMakeLists.txt +++ b/XNModels/XNWeightBalance/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.16) project(XNWeightBalance LANGUAGES CXX) +set(MODEL_VERSION "1.0.0.0") + set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) @@ -24,6 +26,14 @@ add_library(XNWeightBalance SHARED XNWeightBalance_p.h ) +set_target_properties(XNWeightBalance PROPERTIES + LIBRARY_OUTPUT_NAME "libXNWeightBalance.so.${MODEL_VERSION}" + PREFIX "" + SUFFIX "" + SKIP_BUILD_RPATH TRUE + BUILD_WITH_INSTALL_RPATH TRUE +) + target_link_libraries(XNWeightBalance PRIVATE ${XNCore_PATH}/lib/libXNCore.so ${XNCore_PATH}/lib/libC909_V1_Interface.so @@ -47,4 +57,7 @@ install(TARGETS XNWeightBalance file(GLOB CONFIG_FILE "*.mcfg") # 使用 install 命令在安装时拷贝配置文件 -install(FILES ${CONFIG_FILE} DESTINATION ${CMAKE_INSTALL_PREFIX}) \ No newline at end of file +install(FILES ${CONFIG_FILE} + DESTINATION ${CMAKE_INSTALL_PREFIX} + RENAME "XNWeightBalance_V${MODEL_VERSION}.mcfg" +) \ No newline at end of file diff --git a/XNServices/XNUDPService/.vscode/settings.json b/XNServices/XNUDPService/.vscode/settings.json new file mode 100644 index 0000000..9b6b487 --- /dev/null +++ b/XNServices/XNUDPService/.vscode/settings.json @@ -0,0 +1,77 @@ +{ + "files.associations": { + "cctype": "cpp", + "clocale": "cpp", + "cmath": "cpp", + "csignal": "cpp", + "cstdarg": "cpp", + "cstddef": "cpp", + "cstdio": "cpp", + "cstdlib": "cpp", + "cstring": "cpp", + "ctime": "cpp", + "cwchar": "cpp", + "cwctype": "cpp", + "any": "cpp", + "array": "cpp", + "atomic": "cpp", + "bit": "cpp", + "*.tcc": "cpp", + "bitset": "cpp", + "chrono": "cpp", + "codecvt": "cpp", + "compare": "cpp", + "complex": "cpp", + "concepts": "cpp", + "condition_variable": "cpp", + "cstdint": "cpp", + "deque": "cpp", + "forward_list": "cpp", + "list": "cpp", + "map": "cpp", + "set": "cpp", + "unordered_map": "cpp", + "unordered_set": "cpp", + "vector": "cpp", + "exception": "cpp", + "algorithm": "cpp", + "functional": "cpp", + "iterator": "cpp", + "memory": "cpp", + "memory_resource": "cpp", + "numeric": "cpp", + "optional": "cpp", + "random": "cpp", + "ratio": "cpp", + "regex": "cpp", + "string": "cpp", + "string_view": "cpp", + "system_error": "cpp", + "tuple": "cpp", + "type_traits": "cpp", + "utility": "cpp", + "fstream": "cpp", + "future": "cpp", + "initializer_list": "cpp", + "iomanip": "cpp", + "iosfwd": "cpp", + "iostream": "cpp", + "istream": "cpp", + "limits": "cpp", + "mutex": "cpp", + "new": "cpp", + "ostream": "cpp", + "ranges": "cpp", + "span": "cpp", + "sstream": "cpp", + "stdexcept": "cpp", + "stop_token": "cpp", + "streambuf": "cpp", + "thread": "cpp", + "cinttypes": "cpp", + "typeindex": "cpp", + "typeinfo": "cpp", + "valarray": "cpp", + "variant": "cpp" + } +} \ No newline at end of file diff --git a/XNServices/XNUDPService/CMakeLists.txt b/XNServices/XNUDPService/CMakeLists.txt index d90b5bb..9c645c2 100755 --- a/XNServices/XNUDPService/CMakeLists.txt +++ b/XNServices/XNUDPService/CMakeLists.txt @@ -2,6 +2,8 @@ cmake_minimum_required(VERSION 3.16) project(XNUDPService LANGUAGES CXX) +set(MODEL_VERSION "1.0.0.0") + set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -22,6 +24,14 @@ add_library(XNUDPService SHARED XNUDPService_p.h ) +set_target_properties(XNUDPService PROPERTIES + LIBRARY_OUTPUT_NAME "libXNUDPService.so.${MODEL_VERSION}" + PREFIX "" + SUFFIX "" + SKIP_BUILD_RPATH TRUE + BUILD_WITH_INSTALL_RPATH TRUE +) + target_link_libraries(XNUDPService PRIVATE ${XNCore_PATH}/lib/libXNCore.so ) @@ -43,4 +53,7 @@ install(TARGETS XNUDPService file(GLOB CONFIG_FILE "*.scfg") # 使用 install 命令在安装时拷贝配置文件 -install(FILES ${CONFIG_FILE} DESTINATION ${CMAKE_INSTALL_PREFIX}) \ No newline at end of file +install(FILES ${CONFIG_FILE} + DESTINATION ${CMAKE_INSTALL_PREFIX} + RENAME "XNUDPService_V${MODEL_VERSION}.mcfg" +) \ No newline at end of file diff --git a/XNServices/XNUDPService/XNUDPService.cpp b/XNServices/XNUDPService/XNUDPService.cpp index 2f5f7d6..ed97f0b 100755 --- a/XNServices/XNUDPService/XNUDPService.cpp +++ b/XNServices/XNUDPService/XNUDPService.cpp @@ -36,43 +36,68 @@ void XNUDPService::Initialize() { XNServiceObject::Initialize(); T_D(); - // 读取配置文件 - std::ifstream file(GetXmlPath()); - if (!file.is_open()) { - LOG_WARNING("无法打开配置文件:%s", GetXmlPath().c_str()); - return; - } - - std::stringstream buffer; - buffer << file.rdbuf(); - std::string content = buffer.str(); - file.close(); - - // 简单的XML解析 - size_t udpPos = content.find(""); - if (udpPos != std::string::npos) { - size_t localPortPos = content.find("", udpPos); - size_t targetHostPos = content.find("", udpPos); - size_t targetPortPos = content.find("", udpPos); - - if (localPortPos != std::string::npos) { - size_t endPos = content.find("", localPortPos); - d->localPort = std::stoi(content.substr(localPortPos + 11, endPos - localPortPos - 11)); + if (d->_initialType == 0) { + // 读取配置文件 + std::ifstream file(GetXmlPath()); + if (!file.is_open()) { + LOG_WARNING("无法打开配置文件:%1,使用默认值", GetXmlPath().c_str()); + d->localPort = 12345; + d->targetHost = "127.0.0.1"; + d->targetPort = 54321; + return; } - if (targetHostPos != std::string::npos) { - size_t endPos = content.find("", targetHostPos); - d->targetHost = content.substr(targetHostPos + 12, endPos - targetHostPos - 12); - } - if (targetPortPos != std::string::npos) { - size_t endPos = content.find("", targetPortPos); - d->targetPort = - std::stoi(content.substr(targetPortPos + 12, endPos - targetPortPos - 12)); + + std::stringstream buffer; + buffer << file.rdbuf(); + std::string content = buffer.str(); + file.close(); + + // 简单的XML解析 + size_t udpPos = content.find(""); + if (udpPos != std::string::npos) { + size_t localPortPos = content.find("", udpPos); + size_t targetHostPos = content.find("", udpPos); + size_t targetPortPos = content.find("", udpPos); + + if (localPortPos != std::string::npos) { + size_t endPos = content.find("", localPortPos); + d->localPort = + std::stoi(content.substr(localPortPos + 11, endPos - localPortPos - 11)); + } + if (targetHostPos != std::string::npos) { + size_t endPos = content.find("", targetHostPos); + d->targetHost = content.substr(targetHostPos + 12, endPos - targetHostPos - 12); + } + if (targetPortPos != std::string::npos) { + size_t endPos = content.find("", targetPortPos); + d->targetPort = + std::stoi(content.substr(targetPortPos + 12, endPos - targetPortPos - 12)); + } + } else { + LOG_WARNING("未找到UDP配置, 使用默认值"); + d->localPort = 12345; + d->targetHost = "127.0.0.1"; + d->targetPort = 54321; } } else { - LOG_WARNING("未找到UDP配置, 使用默认值"); - d->localPort = 12345; - d->targetHost = "127.0.0.1"; - d->targetPort = 54321; + try { + if (d->_otherParams.contains("LocalPort")) { + d->localPort = d->_otherParams["LocalPort"].get(); + } + if (d->_otherParams.contains("TargetHost")) { + d->targetHost = d->_otherParams["TargetHost"].get(); + } + if (d->_otherParams.contains("TargetPort")) { + d->targetPort = d->_otherParams["TargetPort"].get(); + } + LOG_INFO("UDP配置: 本地端口:%1, 目标主机:%2, 目标端口:%3", d->localPort, d->targetHost, + d->targetPort); + } catch (const std::exception &e) { + LOG_WARNING("解析JSON参数失败: %1, 使用默认值", e.what()); + d->localPort = 12345; + d->targetHost = "127.0.0.1"; + d->targetPort = 54321; + } } }