From dd0bd405ee87260bcbec2484eb866c54e57361b6 Mon Sep 17 00:00:00 2001 From: xyy <544939200@qq.com> Date: Wed, 25 Mar 2026 21:34:41 +0800 Subject: [PATCH] --- .../面罩视野测试仪-电气清单.xlsx | Bin 18495 -> 19253 bytes App.xaml | 6 + Models/DeviceDataModel.cs | 38 ++++ Service/HardwareService.cs | 50 +++++ Service/IHardwareService.cs | 22 ++ Styles.xaml | 112 +++++++++++ ViewModels/MainViewModel.cs | 121 +++++++++++ ViewModels/ViewModelBase.cs | 5 +- Views/MainWindow.xaml | 189 ++++++++++++++++++ Views/MainWindow.xaml.cs | 14 ++ 面罩视野测试仪.csproj | 2 - 11 files changed, 555 insertions(+), 4 deletions(-) create mode 100644 Models/DeviceDataModel.cs create mode 100644 Service/HardwareService.cs create mode 100644 Service/IHardwareService.cs create mode 100644 Styles.xaml create mode 100644 ViewModels/MainViewModel.cs create mode 100644 Views/MainWindow.xaml create mode 100644 Views/MainWindow.xaml.cs diff --git a/60.面罩视野测试仪(王蓝峰)/面罩视野测试仪-电气清单.xlsx b/60.面罩视野测试仪(王蓝峰)/面罩视野测试仪-电气清单.xlsx index 5cfc082dcebb64318cf60641c510ab1ca3f94b40..0f6cd976393a5707a3cedbc923fe8a9197196367 100644 GIT binary patch literal 19253 zcmeIa1AArL(l(rQY&#v>Mt5x6w(U;3la6iM?AW$#8y%x#=Uv(RJZJCS=e*zd1Kwv{ z*ILO$-J`0;T|=|Rl#>JjMFj!}f&>BrA_U6(yp|OO35HAQqc)wJwG}}Q=m&}{pbvoi|M&C%um^hMM`U^!5QXo=o&|SlCA6CPAX$yO457q2 zAsTOMtBw{EOf{A}Ok*aYmA_HsAg2libKk8VFUC&2l(;M*BQI}C+H1oKf$KmRzLcV7 z;!ix34MxSW4}&4(tAT_({o3n0F#HJ2Tz;z-5<;;q9^CAsp^rr5hL;?mM7=%05-We$ zl;VvG56-RtA-hRgC?Xgp8p)sxBf2ybqU$O{HXnMDow|@Ek!|3lLT!-ia5x4}f-qA& zr{|+HOQWqPl?AH;q|`!0Hqv_yFN6#0zd9ndS&4s5uG|%0##n0AOC90)eKHJJ=0@>u zIFnc%WGPkRI>%z1PF2R!pC!|efj%PiT06xhI7CCefG~trkt=jmYZ!&+SkK#32 zd6Dec0yy~g1_C7ak3dGzX*UJ~1o8$TPGJCntm|NG}8#mGd8Y8rQ-9JF97D~tb1iLZL6;1@KnH<1v>B_GwY{b=zd#of<>nlcX-tz{)w9X!Pi z1iCi)ozPH}&6(;Jr2qPwm1FkfJZLIc2guusAUcYyJ%hxfZ&P#*S5xhmrPLoKbG4@5 za0mODslWG&%}1$oW-flUnqkcm(p6NNuJn}H13J)3s3c7zU)GYjzN=%96Y@pkuPOYJ zA=`&L`RI_f7gP|E>C}(6zT{dlx`sP)>Q#MU7{o>6ca{Gj;xp7h!}DLG=GFX26&esV zqaZ*)*g%lLZdUYv29B$(gQbD3t>t?M_&-4e4Cn;`_x`{AX^oYY>}5dgJNMZj99=6Y zYYwt%h7ex-QI1cLH&bAh8aH}hxUnu*<*Z+vxNW~4b?3>&w6bQp5aJ3u>sCl0sepJ8 zMvtRP?Z(Zez2;3YUp`yrTBOJ4qiz4C>RZ2x<5!{jLvbMtQD_=RFM3j}(DZ`dyMyh5 z%j_B40l5*K)ZB9UpXSZcTMZDXd5^38K#2^M)wz6V(8JP5#mIgHkYJHCz<-_sY|6$hEA4vr8cXpqa?Jf z4lQJ$>K`k=ZXwctH;F>|0`=2G853{W&2Av9*FCzH%z#chAr3cNlluYP*{ekm8(IS*#3%1T;UPj6D$AmxTI3 zKNK@a+KprV+T@PD==ORYEo*Fi>3pD_{2=AdpjeVdNU{@#ss`^Sp42YhL{T}Ny-2JM z?SqnxloNuxRKO_$RsdTM%{(RQTSyr$KDZ;upJX8nI#e}%I1-kC{AeTLSZz)Hp^>J- zKKqL2C*rPJiLd~gIM=~JlLUHW;6w=0W$GKBR?%7IG#qNKoG@-*Ae#ZqfI(dNU*dNY~MlwA;==f__U`-v6q z=*~|GpM+sPFy=lA(xCi6Kjcwse|$Oh2()q?blGvM54OkKfRw`zKN`eZ3CHCup)UTa znz>0(1i=eFPQnnVxPmFHViZZdF}c>V z+j}<_HAh2j8dmG)Iqka-RFL~G4_7ztuQoMq9`$^0Rut1U^CNByU-1Dv_)n&o zR|(ZS!2<#DWdQ-f{mB$Zr!Q8{p1_pLGhQx{N8w#ZI?Q4S8GDx zZK9x$S;C5-sKRAIF*$q+w>CZ>z7@%X(x#yEdjoy5ht4~d)XEY@VaK?e=)HZ^y&i?7 z7qkyxp0yU&e5$0j*uNa(+-Mqw<>c~w>2{9uNWfoQuiY>^Wyc9&Wo?V*=00a%Z~MG> z%o<0)Qb64Et3aj0-W)7^LDuu$cZZIzu-{!8{i8LjFHJ?vACnr3Q+!+>pr&%_S)Wol^q@eylh|goQcC-rH4;c8| zZ;xJ$v%MD}lf=btlOh}Xv?8S1I7T7uO5*stcZl%@*FQ56p2EAbmMo9Pn3bqcFI{MC z_DuV662f22nI6ZT6laA|UaV?iFh$ElmBA9j#6|?X9uHhMyzYYI5E5+y0(Y18 zb!q*L^!Z3r#G`16t^#avA}-Hn!4r)r8_vbV0~gewfK5{gOi+x4x-s=jreI?01=d^~iymcTAt^_|3ASylb3Yl&AgpaIxr~^d7n7hlUr0-NlF`*kr^c|SE?pAY6~RpjLv*__ zbKb{EZ8)!`_pF%!Xomxr&qV*TOw6^DTnVsl8m{0Yn#QXW5QfC{!`U7zayX??h#3nN zB{{{nGn_=)GGblA3tSIBxwK5<8647Dd5!ti^P}c<%a6D2+-=_`EgF9D1Z~x5cQfd!* z@a^fV&uhRsY(Pl~Og1gFDagKug)o3>- zX9*^>NOvh81S{HRzgZ{@ITz;%kUV^?j_5+O`;T0GLI0|3V0zB=XG9lY^r;*diSbF9 zyp6od?=Hot$hj>%*dspca2akR2GWF)>e4qvM#l^KRV<(`a!~A^-<~&yB9cGl{k%ek zDjJ^;tgMKmY&#)S;RYrYTB*;C&(|9jq}OOEAV#Z&@%A}{Ilxw8@W#%;f<^7RTr%4c z82x}o%gd!dp+v?f1k@264)bHU*{3v!eW4xEj%x457tuuqN<)nejEY90N?T1uMZY_s zsOme3BzAtKvwD)c4pi!zU!DPE_jm<=?vxK)>0465&MH6iWoE>TFo9Zm6Q-hObR|p} z+ry+M*&`(N*D2BJbwN74)>a9PP)$ij6XyL(az|IQ2as0wu&2(Aoc!MFBh(6|`~`O0 zr>{pEZow7&DPLCZ1V&(gtvjQD>-P#zCb*cTnvu`?VJAc;V$k;^0-FOP+RMe5b$Jqb zseM(az%a~~Be95;mj|&n250^C^$BDW#!!t*S}tS~TcU*Lo+m)+(?`A*ig6KDHI!e< zrNQ^ju$`@BaZl}xEtcAwXWxaW6eQK38Im-1c#EJsqa3YXfjIYMTYlbuW*zWSb9`P) z*$GVjYO&?zb_>&hJ%`PE;ynKq$T_%^3%u?K*@w`kj}TTYHh_W77aCd9u4S}dxe326Y=1@Y~Wus%~GwtP$ZBNUuTLvSgzv%j zUS-|OR&_jXpj{-+pvxp^%yF8s%F;0JlBPH-eE4&cbiv{%pU{V# zQ0D2B{#D&0%<+NCJa!f;*IkqL+vps}3G^&qLX^xL5GiQaQPwVagTxXChH<`CT4=Qb z+qkegCC+|MXyZg11Lng}7g;QV339}QfcK1Sk)l46X*Y>zKE;9DiRaGY z&VZ`d8{D33pyP_SU}9{pEIPH;w};I>a@mZRt*b_Ol6a+bJf3*cVo(kdjKgA<3nJ)e z;b)6b!d)LWP8ys{PcHJzotc7I#meHIw!@n0Nh%;*wh!D^#dBa^cN>50&VG(tL>8ks zq~?(R%wzS5=Y-R%o8cJLvb(vPI6ZkE)%c<>kiO3q8ThBu5DXl_nLp*6!%m=Krzjil zoNpK(mim4>nBUBlIT!FJMT?(cF7D$KJ~Xi?!pRU`KZ?Aym=8QXr=@hV@_Zx&1(v(r zhY{jshoqhkVdTq2&kdYI;rld**(H|k3-)O>!_{nju3C{Vprog&b{_d2A1srtq;Ym0)frOfsSJ?;0PN?95_ zFyy?_V=Z;TNj@s{Sq-i>H_~TfSj@B(wU5&okz$p4=)*|%G|qA2Xgx@cJ=#>@6_A^g zZtSA;?t+K?xt9{HGU=$IO-9vq?pEilH$Sn~)3m7$WfZ!5W%g8E=C>RcSX^oFS4iqc zJkLvO7X;1}+1SXi_3oN@GTWyoNrT})beYt(qbH9|K1^rTHiJ>EGH&g=xjSnmw0)LkcB+_v6!b&fo5EcgqiUg;lk@&fF z);{S@A)Utwtrpg1YF*b)qZu0Jw>efRsOnZ}*t1h*(hOFp^=W-m&pnZFPb}9$jE_e7 zZYn5Xc%XJa*Eb|cb>TKPh>hb&-kSPcvmwU2(LV&Arh*dhzS6$$-x%yk{PLXejR$JW zgt1Hsw3m=Db*Cg>uI|pQ|H_56NcC8<e`{U`r zIldF?2opA7oIGXe)RJ6p!-?*0U4^VOzL^~GgfdaZAoN{0LyC)ouZsAiZhdzzlU~j1 z$8%2&9cn6k_sYji%81OMEmq$87Xq%Uw5HF}pF43{TCpRde`FmB2iakKKae?CVWvJ5 z?wNSIaL=}*oj=}|OI67;#-Kb~^1`E`pv$c&V4NSgm{rT8=ZNyLA*S{U=w|t9Y5+~3 zNm#)Ex3M)rovD~Kk1pZJuYWPB4(zK2O`RvFm%Q%OJDEfii_WStNIs2&H6_7kdNvyT)kK8gX;nS|r!d8#7Q>xCV-rgXk2Hfk~!2&*$uruXr_)v>89aGjpkA(W11taG+CEtqGfueWkerfOWBs9wyL9!vS=hN`q| zB>8Qfh$(|O8Z?Pi{?F`)om=&$-*BaNR_`Z>xo@zse|fIOSV8$wiRGf=Bq@snDu>)~ zq(cz}d2_7if~_0|3AKQO5-{6CI0W#7qK*Jjz$eZJ-v2s1&6#12+yE?OC;}ETi2t0P zzAt1rni(5AIsR*P?2iM+f3J;=#%bFwGoS{Xlb`YmwJ&}Qjzxs12cHd#ufAYJ8aA^b z8?X-|tQR~XdOSA`pej?&x1P>B9Ty$g=d6g>*!i&)yf7bKA0mzfyb#ct<1^?JYz=y* z!k&&-8P}iFS%=EkjaZ@&r+F9NfJRDcU$@3sok>76hRcrXnwmCkIBGd1 zxXpXpMe+vhN0>?mi#1re_Z47f z=_Q9BpwkigVHe^ovzS-+ZJ`Fiee(F009K3lYv7lwuKUp!d$Xiv(LJW2f`Jn{LLwZb z=vd+9w#>^5h85cTq`W3O$!Odm(FWX>p@7bNcZ`;A5oGCgG6huQ{nTE`ax~2T^KgDr zzrKu5JM&`@i?kbuHcBi{hfpN@Qk(xtwSN}P6MMcMCu8Jb__IATdShv1@uGajE6uolt`DtWpRR_=W z>&lC!GB5i+mo4p}9Gl0}YJJ1!0rP4{Pw7;3=MhP_eWkgDTK~kG*qPNME^Zh8h0vX` zearn6^n6<8)w#?e`E(iK1PJ9@hp`bAvf?YrHMEWGbrv_9bMp!+#7k( zH~He$O0H(sUw^KXt`EE5owa;;QQWl+zwIDBdQnrJ*bYA*XyXn;!9cHis2HJo4UCh?RD8p~5?#Z7k=Gn}j%(M_=xBb{#9g^sUmveux#?fCQDJL; zFuh6G?VD-xw^1LhC-P9yCO~_xEB7}eD$;&j|F~h4GBz5^S)Eu=R!-IQ!@xMMFlVzU zN6WTet9j%Bd)VNG#37q#tB9zfrms7depMHgPMH8#IjbSPOl8D*zrmchx7#;0^DA4L z`aW93izx!>lTt{X1h6O<%(>%!hkUf1QuG-v^-FPNfMv^P4-SJ5w)IO^=p+7W_Gc^6 zl55V2QT2yC-?ZD*?Y0EsQ#7e;K+ZlIp{#9vso@dbV4SQ?p7cTi&Z?r7W8>4sM^E+G zM_XoAjPZ@@EP;M;Q?F^Tphf`njjXQCII%LX}RLS%I;Oj@D2#_%jkt4Ec*%k;vf|YC`I!+J^ zc1J$w^KnU2p+RDxn-6j7F9jF|8n8 z1T<`}60;D0@JRb>oXS&pUL2Rfz z6;ep^2{NEwCzcHw7I|7En_pm=LO@&>5*ir_*8ltdS*<`2kOJg%H3a1pv^O6$=;4p= zl5BYu@1V*6P{emoXkga~bALqO9RVvb1pGW9YEYkSM4ahaV2McqF@7O_DSjgFE)uPV z8L1E;gP8iZI5RRNGcxm)+&p&ie_zfDrfY%JN152q3i??>o^eno5}65!eDALGDE&<9P_XD-fFW{5{yEW9>lBV z#vSex6jm^1FqSwf;};acE*4vdu*tS5@gCP`v-Lqo#sgMg_AmitM(I(poS>mpw{a9( z7}t8=?h##3*o~iiW?8AZGrj)#p*L>lZSl{nw(#S7_--WJ3Op!5I4@iti3`pK>-W*HiN^(NV z?Gi#7)0Abgbz(SVZDSW968X~_G6XU_94XYPwymO^FS))@q0oOB($krjalLz=b(2Tb z%#O?WE~_v9Z{=)bAy6XW$U+X*@Aazlf0wLvj@|KXw{gn4;3ny5K0VNzwhTCi%Z(C} zLIKpM!6lhUkoo%VB=8k`MmPTnZRf&gOiiQ*km-}DB_l+AtwH%-`O)Y_`lE4u#;*&} zpSdp^9#*jGPnL;%)6*4|>kSsfSR9}1eZPfQU;a?Aeh$9Se2jY&J1)$zDwXu~!4KJI zu7Z*qX~TQSDYIF#eTh_tdE!{>FkPG;*}_O|y03dvQl@SHo+i^Fet+@b2P^5e#9Cm0 z&WIoDJ$>bmr!G!r#@5F4fBgP2LOD^Fw8ddZY{xk8QafpjHabSaiU!e)Yz$8ajgBD_ zwMbkx?$xFf8;-Eycc6ksrHDdrLZxs&%%;H30>-Wld`)Z?iz?vF5iGAIBBk=|3}gv9 z@lALd8y&zpW8Xa*o`Zn8foH_<%ct#dC_eGvfKwBjF526`y5?y*@es&i5sJ%i+>@=k zsIc*Ro}5*pZbRCEim@BYRT!K?x|cRH&($hV zL>5xmkd*&mV;dnt(z(7t|LXSAGt+_R3HA1R%O#R1kfj98iYT|Pid1P_RJGNZgJ?jt z9On@jRR0wcqdFJZli*t<5#g4|2>o%S?sB_=fF?6B)xsjS3-?R%(im*_uYic5Tz#Zk zjWXrq&;DL;Sq^9m)=tN3?pv}Ta)_N$j&ubR%QlV;imCc=a<6k+Ei(sJDm1NIUXK1( zGSV;VZg9gds;U=lIylv4TdWiV3n~|L7KXXnbr;xiJIB=bB3}v>t<~J%LMX)ts1F>< z+LtmW>c59!t~qw6)>%|kF*>&Mby-lTBtkP96l*oiBRggO!UIB$A`(}Sm0{)*0H*oL zmSZ#++#s8yR>EKgL%ie3gBlc1h&F`+OrC7@kZBBw7wNx{NUwv->+bn{(6BQQ8HxX5 z;NEa@D~FxzV(a<*xN(l>{`UO%l1jd@o1OTpySL-F?Sbv?f&r_x{oC!)LrtP= zhx^M6O5okchyb#$e8@DdIQN4sW5`Ka;}K&J2oFm%;EY5GU?E)%JOb*F+8`(OSY4 zesr#hgMX0FqFZ6CH(Sr4h^OeLOvq>+=*RqQ;u?uaT>(L|DODMLeTHOAdZ`Mq&h=X`PUFK5|Bg&Hgj!Rg~sQ+m! z3tLrY2qTUB?wY|g7_Z(fN=|t;JcYLASqrG<9*;WY+4rw0ap*8YYsq$^v=#a$WgD+? z5s33tAV)UAE&|giXk3wYzm`w+JQ+()U99$A_Li>Q15x%BYZ~&VkL}(BtP(hL`23BUE1d*_ zW^^JgKID_`&uzjet*}JPK8`dDqlj{L^!=jlHWQq~tFyH4)!Z;p#7WWyGyFM>_)6l_ zg_dF|zJ3`?{*`8*)U;I2_VYFLfoDTXI_C#{;gm-zl)FH~HYfck;FZ%a6()ZC2>lWr zuahWc2^P2Y(r*PuL$#))wICxqMyG30SX3+At!Bdpm5#O6BNQgUrI~JV&B8LSar`qU z51l(cM4b*6JAA~}(0*ORcdeRja#jgC#a)!Pqg~yX6eX*4FLLt)UN;tYK0;1YLx|W7 z0bMME_hMf@Aq-}TpJ*JVT$o(d*H3JeTOuZ*qChv!yFf#brC}Hxviq}SIaKv!d9-iN zig14}5`3Pzi=mM5rw&m6iMsADs;Qayr8G;R!)uW}#I|DO&ul)VDwax09|Vau!DLA% zOvECgJn$4$J9pEin&W1#&90Sbg+zaxlN-Ud|M?)BFK_r{FbYt1o#uQ;sr%x`LoaiNO z9Lt?0pZszp`MN`&Ih)TYv3>Zhkw$Y0Fe`>Dr%#rO);|A4;qqQKPw~rsylGm=Z$;zo z#)1c*n0x55`7+l%Y1Upbn>^p4pVUELx%CY(625gPU5?U;a%%x3LQimZ!6Qb1t@iNN z>%UHMJ*>tIqW}--O+@~$QOb{&SoySG|i`k4lnPBwL&Ro{(nQRqLccnTq?@J6Kzx1JTx^iKfZp%dD`D!+i|J(dVZ|`#%oR-czXQP?-gIy1z*(g z^z_#T<6S-H^YzWnLgZ5eLehP!$6C5)aag^kZDj85$kS`(!*huJ+v=e$Uij$|0@GW) z2iHmD)BX(DsP<9BWs)tuExrEX>&y&1v7C+V$NCA^Q~Xc4_#SPydoP8<{BLb5p1hwj zH4De~0p;HQs{JOAwoJSCHu3Z#E5Qid>@#GTpCx63C);AXV)pdtz7PRny>FWz`g7o| zxI6_;~*&~5JPen(GDV%w}>c^c(`#DqU&Q3W+F$T;HcwfwZOW+HDvs|d8OgeoPs6Ja(>s+LgQWbNj#U&1>qD!e zQZ-CPjATfV3}Q*=dP8M8@GSPi{fjuJ2xE}ck%od%h317M2we^kQV!e?z(AHxWQd^p z`?BBz6*^%Bg^PCFPZ3;7l^^FTq7jd4prR?G)q>I;n5E0t^04nQGDAb8BZMFWwC?Wv zZR0{D>bMTRL)n|IPTJO@qT$R)LC*U=N;G)p#uuq=>SrX2Bvtp@b ziVBel6$lwfmzRl}3al$O+{<6E8F1sTacBV#HIeL_)2P3)sCtJ zX6a^&I^uy+p@Z>ko7|c&)}64;QK1Cb^UC4sb>+@dKNMm!Qft=waowXVmpHF;Yqzm| zcsw|Bau8NN@m>!JmJ!TZ@HRFzev17(jOsMkeRbN-_-s$>1imu*vCPr8T_cdCUFij9muu+PWeMZBJd0b%p!Qw}0odzaun%-*DLUjS5 zfn`e8!!J7435ZQ9%GhnlIcNMF16TlD;~ErV7WH z`%=NZDX?p_`W5maCchPQ-TKN>FeKr0f*o(^v&+a$!_w5n>-^~k+fyerA{IO)O%|kV zW{-srtAGV_-qS;AB|I!oicj$k~q8*3&gA9CgXE@g>t5u>}0)+D2)=Dt@_9 z-b&c~fbMHsKz^_?(^)c82-sSd=MtBBg8L66sWB|lFa;495lN9`0;%Omn=T1yF9#8S zMoaS7Wdc(bm`}WAWyt=zYoQNb^LG&ziqbYSFN}btGLy=w6owS05IBbdnq1CYKlx#^ zF0&yD6u)Fk_YQ+NW~wk+(|+t-DRus&n*L|sz-P*mvq2U^zZRMsZ7EXQUSGM{sliZ) zY)Z>M@TOl;0qA4u)cSEu8Vnjt!=PV&O{Uw)jcfQ~Y!2j>bR;w_Cu}x!H%fB{bd1-p#lgIP%*87z1BUW`QE2C{o2=|MX9Y&_KLgUx#_B zca`9(+L$vaghxUHlMs4AjvtrYD83Nm`4KteU}=mSCH>)z>OS*+vvG=lTf#Z6%Q%dM z)}J8VQ^#+^RqN<}YqH{Nc2iQaGlAfI%d1*(-3FYtBHcQ06p;-bEgVf?wH!9@Hx(yO z1F6X}WA{(6!XmWXGPdbLJzP?y`;pSQBo>Yxor!UM0@ za};V@-OS45xMuZl02uo7srcAiOa=Wy76$t0oa34A{s9C0WlUj~z|0Rr4@(GR;*Ype z4Fk}v$~e8lLzwp@ooEr)C=r4`it|8`t=Y7@>h@e($v!M$3*j z?GY+51t_>q;FlbEAM*{ge~HG#X@ZSal(QPiV3}%IL70KB)tzbB&oE>W%3QEq(p)LI z33#(U3R5LW>}6%Iu_DyjhM)MbC9OxNt}RD-ZghAKF#yU9E=N*Pzdm-E4O6_Uz;=$i zv|k#}Ab~}TNsDC+Q13v7gTk~-APNIvZIVCV48Smr7e208@n2e8yCjGGf>AgK;jIt+ zW+ixgPd_}Z0Ebi6|1jfU{03wo0Cd>x6O3d;MR0cG!a(@e*bB;>T3qEmGQ%4q^fym@ z^7;p%07bUBzQ@_0LG(Xz`23ON5VwCoTOgWXzmo9}${6)<8?uP32pDac43C^FhwJ|xoiZCR``*LHR_8mo{3E1)esPHs5hQHI)h6{5q48ZeXh+GAL zPW;(!MX}q-4^y$eCC-aU0AsazF{QEkz?YE5F#q17Ht4)Zzt5_BAE1KfseSLCy=BrO z1Jfqf0ImhF<4Y7E(%-GLUgt)r{wuV)d7azdHGOY(05wFZp~F?HqW99NDmgwNm`Sqs zVl&t4L4pi*`7_YwAnU)jp+cHeylx#PMHf_~FCn`JsFuE$6~WExFZT#5aKfKNqay z;s=j2@%;2Px3>ExTkAv@#k{Mt0~j}9Q=Snkxg;Yci9>(mhQaRdh3 zwV2eSakCjv3a3v?(p8Q=FMzyS?^`G5ve}LcxZ1c6W=SYMd)lL+j8OT9u#5a0Lq;7IBmf5Rav1;$mh(iGs$YtVJ zC&%6CDD-|N3?6W%)erRj9!(KIQJZjh@8_Z6O8p%m&IjLBxRZTX3WlH(y#&Io2jpFV z8yHZY4uXH3+}Y-f?7M&sDL@amCZu_RCf^2(cMqg`zr)ROslm*Fw0b}Q1lBEm>!L^m zn*Eu`MXLSXyp>>nK?b7_Cu5qUZ-d3q^yb1Jf$Kp2O!iJJW^9fEJts1BA{6&Sg)x>4 z1BLnZ;SddwB@C%+xWgkX)-3lr+mSX|lm~`PmxrJ2=U2iX_5pbtY*;j?FkK#NxU=>% zm0%OgS@?yvG2TKcd-p8Py73<4%_7YgE}aP8NQ^VNv<)4A7u&&KO> zVaMBs?(1WR*Y&8F;;KvOiZYVba{sqVjckWQQiI15}m z-$Gvfu#E3=|1188UG;1k|EcG&aw$Cx&w_lR1JUvAJ)izR^Qb-P2j|xT`!-&nfPhf{ zT>Eu2(|0g7Qgm`Kw=w-AojOcK(-vD5(X(Rqt#Wxk#Tdi)6tXhPJg+F&qS(HV$4397 zijVeid0Dfp3tc}S@aOh9R+*Gu%mKLmGFwckXH$;-6P`W#-O>eF(@G^M!e3+T%o}N( zj!750wo9<=6+flNCW%`QuCCHb$iw3bctbCkW$`1zuF}jY-6e)Fo3Xbrlwvc(JfEZ& zS!g33k4*ezHC4{M36h3tQ z_nYz<3pH6Pcsm^(n{SWPKJ5{r0P|q8)tN1Zz<(nB>M0IC;`SrlwfQ!b$Gm)Nny4Hj zJze?w2&Kfi+XoE}hHm4^9vbYaRG3ZX^p>>5>cdqFb+t#B3U%I>?&Zl#>is^#rgecj z$@!lrZR9VJE{;o-O257=+1SFni_(}k{wVYpaj8d8M|irg`Su(kEM8|-ah|Q1g=oue z_d=WX*5++t$pUQ2x3(OmAa=f&<;wqhnjP<@hM@2qG@lrN7rAl;VIm_w-NKh@QS$I5 zJ~D^hIK^jYkl^JJoxs*)(M9z=~vtkAO#1!vg2Xc9G;OvH#NrEfpbycqWAi~n|4n)To{1R&Z#Sb zw{|&WEKuK$5NW(d8V_uLm%%44l+zE+-RVM_+yLb}pyoV?lfR+;;@KAvMfjwGwcaf7 z!;v$AL;2>Pv(IwV}VyBU3G`P zXJCQ>whKV-ZQo zmTUeN7&JGF(+G&c7wI88=4O!w>UfXKSj!CMY7LXF8cDh+De5nZZC8jOxpZW!{dGAT zQ;F(%k(*fyd{3fzUhIu5rgYM-%#xBa`%UU8=kiqDlE@S4Fr1I{WjKlfo()@T0gmh> z-sQGa75}w82+nt&$^ay;U<29&M8IAyBU?i`2U|NwdVM>)_k;w39MJ#W!3FSKT1=P4 z3LhXb!@J#g(W5m4M}qMOYuQYUfFP`k!$!Ht?etvvVmjpKJ6w;GvP9euUwm(48pH+g za*3e^926<8*_huZDr9Sj`+rQ6vHF>{jx2T&7(;QKI_{ujeNOdS^%{u@8r~arhrrSl zG%|d!kd^YSAjtAglJg72(j-zL9?#VgDBk{VBr35bSRA!nx!Fz;7C>A9DCW00ZT*mS|LABAvuE;h?!l#rviB~JBjXvpNIQK?E7 zMWEl@Vsk;6H5%h!U?%&WD{n@*Ef{%QYMt@Ma>ZCSZap}aOSm-O0Dm{#)@qi&n}(Ef zrx$Po>_?lxtM$alj&i*AZ|B53J)WOlaK5&{ci->yWQIRsPn0zADnO>Tox%566@S>h zM#cH|8F8R?S}!$fNTCUA7iU5;yUFM3Y<90}i{M-OG{~Kak8PyJE8r>SfA(=UBr3U8 z08X=@0RfT!*~i%dIyWa{2SsBir}tit{g%POmcp4K&zRDgyuxOY+VbolbV(k|NgraU zXa00fifNwuR%AZJgU0NH#%t!Gygy(#dZcd&Cb)aO`n;A~lWrvmw^P-Olo`KFu-!p^ z@uC}knJvi1sdB}4Grk3-s@8-4cB$R};hc0=z6(5L_RITQu+JzmKF7s}j4K^EOcNm%TwgIyi zL)g_)$ck+xI?_2Mt_Pwe86cdXY3v|rUE$2}De2|d9gan{|-w_c%{OthKzw^CL|FhQZfGWKb09T3uUqrwc zu$RzK-^x(XOyAt*y(Qy{;D`RehzNS_-Pf?0T&i;qiQ3cgY$3< zdN^T0=i|e4l-42%8Y{ccVUWG;qtTh*=M5u2g9yfcohaxt-4k{Vm8&kd>`rtE2iWK_ zVrpp0NCYFqrNbH%o{i%?7y0QqY4$Y`$(0jIZs_OX zu*hc&`XRffQlu^$2d~7vP195BP+hThV zctZ@Kq2OK=1-pr!f53gxJ-!?{0rczt87p|f#9Ledp78>BhV&1f**X~iFU$UiV?aP( zqvhXO=D+dIGLO`}T*Cx55ONO(0yX)sFhgr9R?|^JEw3Ik%X7ioh8+8zcdM}m-xQ>; zf#>JS=#Zo#L-;~f<{#y93N3Id9MG;VT12RcjB|NQU2yhBG$@}B_zd|Sug0fqo9|J%Deei!`b3k&`(_y!n206L2Q z%j*k%$N7D``d>)mfax><=kJ@>e;59J2lHRTjxc`+|Fxg_chTRo%l{HZ#{PG?|6jT0 zzXSfBj{FxO6CgqPUxxe(@UP_L-%)=!apZLf5`&@jc@@0{XQl7UHbRo=3nxefc!gvGk+Uw{(k(& z;PZFT-$yflfyVRy0s4=z&F|9x97p^m3k0Mt@Hd108ddxb@Xrq7?*Lswe+T$icOfVF Uo=^Dx4hICFV?Zpjh`t~FA8jRKx&QzG delta 16493 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 diff --git a/App.xaml b/App.xaml index e1da920..4274050 100644 --- a/App.xaml +++ b/App.xaml @@ -3,5 +3,11 @@ xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" StartupUri="Views/MainWindow.xaml"> + + + + + + \ No newline at end of file diff --git a/Models/DeviceDataModel.cs b/Models/DeviceDataModel.cs new file mode 100644 index 0000000..2969165 --- /dev/null +++ b/Models/DeviceDataModel.cs @@ -0,0 +1,38 @@ +using CommunityToolkit.Mvvm.ComponentModel; + +namespace MembranePoreTester.Models +{ + public partial class DeviceDataModel : ObservableObject + { + // 灯条数据 + [ObservableProperty] private double _upperLampData1; + [ObservableProperty] private double _lowerLampData1; + [ObservableProperty] private double _upperLampData2; + [ObservableProperty] private double _lowerLampData2; + [ObservableProperty] private double _upperLampData3; + [ObservableProperty] private double _lowerLampData3; + [ObservableProperty] private double _upperLampData4; + [ObservableProperty] private double _lowerLampData4; + [ObservableProperty] private double _upperLampData5; + [ObservableProperty] private double _lowerLampData5; + [ObservableProperty] private double _upperLampData6; + [ObservableProperty] private double _lowerLampData6; + + // 面积系数 + [ObservableProperty] private double _leftEyeAreaCoeff; + [ObservableProperty] private double _rightEyeAreaCoeff; + [ObservableProperty] private double _saveRateCorrectionCoeff; + + // 中灯 + [ObservableProperty] private double _middleLamp1; + [ObservableProperty] private double _middleLamp2; + [ObservableProperty] private double _middleLamp3; + [ObservableProperty] private double _middleLamp4; + [ObservableProperty] private double _middleLamp5; + [ObservableProperty] private double _middleLamp6; + [ObservableProperty] private double _middleLamp7; + + // 电机限位 + [ObservableProperty] private double _motorLimit; + } +} \ No newline at end of file diff --git a/Service/HardwareService.cs b/Service/HardwareService.cs new file mode 100644 index 0000000..3ef4df2 --- /dev/null +++ b/Service/HardwareService.cs @@ -0,0 +1,50 @@ +using System; +using MembranePoreTester.Models; + +namespace MembranePoreTester.Services +{ + public class HardwareService : IHardwareService + { + public DeviceDataModel LoadDeviceData() + { + // TODO: 实现硬件读取逻辑 + throw new NotImplementedException("请在此处实现硬件读取逻辑"); + } + + public void SaveDeviceData(DeviceDataModel data) + { + // TODO: 实现硬件保存逻辑 + throw new NotImplementedException("请在此处实现硬件保存逻辑"); + } + + public void Reset() + { + // TODO: 实现复位指令 + throw new NotImplementedException("请在此处实现复位指令"); + } + + public void OpenLeftEye() + { + // TODO: 实现左眼开指令 + throw new NotImplementedException("请在此处实现左眼开指令"); + } + + public void OpenRightEye() + { + // TODO: 实现右眼开指令 + throw new NotImplementedException("请在此处实现右眼开指令"); + } + + public void ReverseMotor() + { + // TODO: 实现电机反转 + throw new NotImplementedException("请在此处实现电机反转"); + } + + public void ForwardMotor() + { + // TODO: 实现电机正转 + throw new NotImplementedException("请在此处实现电机正转"); + } + } +} \ No newline at end of file diff --git a/Service/IHardwareService.cs b/Service/IHardwareService.cs new file mode 100644 index 0000000..eb70bde --- /dev/null +++ b/Service/IHardwareService.cs @@ -0,0 +1,22 @@ +using MembranePoreTester.Models; + +namespace MembranePoreTester.Services +{ + public interface IHardwareService + { + // 读取设备全部参数 + DeviceDataModel LoadDeviceData(); + + // 保存设备全部参数 + void SaveDeviceData(DeviceDataModel data); + + // 控制命令 + void Reset(); + void OpenLeftEye(); + void OpenRightEye(); + void ReverseMotor(); + void ForwardMotor(); + + // 可扩展其他方法... + } +} \ No newline at end of file diff --git a/Styles.xaml b/Styles.xaml new file mode 100644 index 0000000..e7fb574 --- /dev/null +++ b/Styles.xaml @@ -0,0 +1,112 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/ViewModels/MainViewModel.cs b/ViewModels/MainViewModel.cs new file mode 100644 index 0000000..c48b9ce --- /dev/null +++ b/ViewModels/MainViewModel.cs @@ -0,0 +1,121 @@ +using CommunityToolkit.Mvvm.ComponentModel; +using CommunityToolkit.Mvvm.Input; +using MembranePoreTester.ViewModels; +using System; +using System.Windows.Media; +using MembranePoreTester.Models; +using MembranePoreTester.Services; + +namespace MembranePoreTester.ViewModels +{ + public partial class MainViewModel : ViewModelBase + { + private readonly IHardwareService _hardwareService; + + // 设备数据模型(界面绑定用) + [ObservableProperty] + private DeviceDataModel _deviceData = new DeviceDataModel(); + + // 通信状态 + [ObservableProperty] + private string _communicationStatus = "未连接"; + + // 状态颜色 + [ObservableProperty] + private SolidColorBrush _statusColor = new SolidColorBrush(Colors.Red); + + public MainViewModel() + { + // 注入硬件服务(实际项目中可用依赖注入) + _hardwareService = new HardwareService(); + } + + // 保存参数到硬件 + [RelayCommand] + private void SaveParameters() + { + // 用户实现:调用硬件服务将 DeviceData 中的参数写入设备 + // _hardwareService.SaveDeviceData(DeviceData); + CommunicationStatus = "参数已保存"; + StatusColor = new SolidColorBrush(Colors.Green); + } + + // 从硬件读取参数 + [RelayCommand] + private void LoadParameters() + { + // 用户实现:从硬件读取数据并更新 DeviceData + // var data = _hardwareService.LoadDeviceData(); + // DeviceData = data; + CommunicationStatus = "参数已读取"; + StatusColor = new SolidColorBrush(Colors.Green); + } + + // 复位 + [RelayCommand] + private void Reset() + { + // 用户实现:调用硬件复位 + // _hardwareService.Reset(); + CommunicationStatus = "复位指令已发送"; + } + + // 左眼开 + [RelayCommand] + private void OpenLeftEye() + { + // _hardwareService.OpenLeftEye(); + CommunicationStatus = "左眼开启指令已发送"; + } + + // 右眼开 + [RelayCommand] + private void OpenRightEye() + { + // _hardwareService.OpenRightEye(); + CommunicationStatus = "右眼开启指令已发送"; + } + + // 反转 + [RelayCommand] + private void Reverse() + { + // _hardwareService.ReverseMotor(); + CommunicationStatus = "反转指令已发送"; + } + + // 正转 + [RelayCommand] + private void Forward() + { + // _hardwareService.ForwardMotor(); + CommunicationStatus = "正转指令已发送"; + } + + // 导航命令(供用户自行实现页面跳转) + [RelayCommand] + private void NavigateHome() + { + // 用户实现:切换到主页视图 + CommunicationStatus = "导航至主页"; + } + + [RelayCommand] + private void NavigateTest() + { + CommunicationStatus = "导航至测试界面"; + } + + [RelayCommand] + private void NavigateDataRecord() + { + CommunicationStatus = "导航至数据记录"; + } + + [RelayCommand] + private void NavigateRecordScreen() + { + CommunicationStatus = "导航至记录画面"; + } + } +} \ No newline at end of file diff --git a/ViewModels/ViewModelBase.cs b/ViewModels/ViewModelBase.cs index 86f3e4f..5a9cbcc 100644 --- a/ViewModels/ViewModelBase.cs +++ b/ViewModels/ViewModelBase.cs @@ -1,10 +1,11 @@ -using MembranePoreTester.Communication; +using CommunityToolkit.Mvvm.ComponentModel; +using MembranePoreTester.Communication; using System.ComponentModel; using System.Runtime.CompilerServices; namespace MembranePoreTester.ViewModels { - public class ViewModelBase : INotifyPropertyChanged + public class ViewModelBase : ObservableObject { public event PropertyChangedEventHandler PropertyChanged; diff --git a/Views/MainWindow.xaml b/Views/MainWindow.xaml new file mode 100644 index 0000000..981a674 --- /dev/null +++ b/Views/MainWindow.xaml @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +