From 5ba709470949711e728132d98ec4871b7973d280 Mon Sep 17 00:00:00 2001 From: "GukSang.Jin" Date: Thu, 12 Mar 2026 09:39:53 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...01132_ae5e162317444eba9515071ebc4da160.trn | 5 - ...01132_cd9ce2fc949f47b282a25065facb0314.trn | 5 - ...01207_29e8b7409365437281263f9a64c97105.trn | 5 - ...01207_355edbe52e8d4f52b4140a0063ffab25.trn | 5 - ...01207_b8dfe3641ec94bc29ec4ef38b3e77bff.trn | 5 - ...01207_d03d06df80cd4d3ca806551f3e503b6d.trn | 5 - ...11249_65d022e2ac4d4f6b858df8364492908b.trn | 5 + ...11249_ade84ff4a3494c3ab3399c0a5633a401.trn | 5 + ...11304_beef04e9d9fd4e6284c81303751b7238.trn | 5 + ...11304_d4d157d1e8504b6b989e7f9358ff8e54.trn | 5 + ...11339_1349017f61b443d2b1ed1e256da5cfc6.trn | 5 + ...11339_21e40c2ece704c9a9c665a26988ab5d4.trn | 5 + ...11339_34f05c901d6c4f79afa92871f4e4c7dc.trn | 5 + ...11339_58cfa4f36fd34029bff6f5467c0859c3.trn | 5 + CSI-H238M/CSI-H238M/Services/ModbusService.cs | 38 ++++++- CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs | 101 +++++++++++++++--- 16 files changed, 164 insertions(+), 45 deletions(-) delete mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101132_ae5e162317444eba9515071ebc4da160.trn delete mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101132_cd9ce2fc949f47b282a25065facb0314.trn delete mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_29e8b7409365437281263f9a64c97105.trn delete mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_355edbe52e8d4f52b4140a0063ffab25.trn delete mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_b8dfe3641ec94bc29ec4ef38b3e77bff.trn delete mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_d03d06df80cd4d3ca806551f3e503b6d.trn create mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011249_65d022e2ac4d4f6b858df8364492908b.trn create mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011249_ade84ff4a3494c3ab3399c0a5633a401.trn create mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011304_beef04e9d9fd4e6284c81303751b7238.trn create mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011304_d4d157d1e8504b6b989e7f9358ff8e54.trn create mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_1349017f61b443d2b1ed1e256da5cfc6.trn create mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_21e40c2ece704c9a9c665a26988ab5d4.trn create mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_34f05c901d6c4f79afa92871f4e4c7dc.trn create mode 100644 CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_58cfa4f36fd34029bff6f5467c0859c3.trn diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101132_ae5e162317444eba9515071ebc4da160.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101132_ae5e162317444eba9515071ebc4da160.trn deleted file mode 100644 index fe984e0..0000000 --- a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101132_ae5e162317444eba9515071ebc4da160.trn +++ /dev/null @@ -1,5 +0,0 @@ -https://dc.services.visualstudio.com/v2/track -Content-Type:application/x-json-stream -Content-Encoding:gzip - -H4sIAAAAAAAACpSUy27dNhCGX0XgWpR5Ey/apXaKukZgIzbaojtehjYRHeqAok4aGOfdC8onSNxdd8SAM/PPx5/zirI9AJrQh+Px4wlyXVGPatpDjDCJCceUPlEyUTpxNjCuBR3l36hH6Q6+oQkp4T31BjAHCVgEMmLHo8chgKGEBsJG0Wra5xVNr8imIcApeRiW9Q8oa1oymtCfKYfla+tt0+DnZQtDWWa4zWu12TcxNx8f757uH/C1oOT6/pe3myusrcCQApqQZRIijREL70YsjDbYCD1i8MwpIaS3yr2lpVyhZDsPa/jyQ0NYaobqpzbkQDAz6NyjYKttsp1d4enbsSnZMd20eL+H9+P0ik5Q0MT670Dfyl35OV3V5TjDCeajLSuUK78cDjYH1KNjWY5QaoIdzT7tPNualtxdml3PCXJFPbp/7B5mW+NSDu94Pb4huP0fBE5QHJoQJyOXSoHgnFsjHSMQlPRSMuctUdExoB7IaIQyVBHKDSOGj1JpFSwxHvXoeV6cnX9fd36GEacDUUwyEGCYkNJ4AlxDHBWQYKV0UnsTuFZM6KC5NdZS40B5I30zySfrX1KG7vYGTUgbEbU3EYsxjFiAFthoTrANYFSAkWuiUY+ul1xT3pZt7W5zheey80MT+tXOK7yR+1D8S6rg61Ya1L9ka/ZQlrD52v1wACUDGSjhLWmrx612nyGkAr5Cw/tUtku9/6QwyQhpUrZSINfuwdaX7je7vqAJQRBUBW+s1IZG5ZWMo4yaaA6OCBmjkHRUVI7a2dG5KH0IwZnIgjfGEIN6BM1w3e5xp0TkFDhWTHssgpDYKkqw8X7UiijvRHzHsbufW56RzlpmKHZGCSy8ItgFN2KtCaNROMM8+wnJxXyi8b2DkmH+aeRPyZdlXWLtLi7s3kH4vOW2P7rdkV9Txv/stG8W/wVK117Lpty+yuWBzj06gF23Aod9/Uyv6KH9k+5p30KcDpJq0aPHakvdjt/D40C11ufz+fwvAAAA//8DAIVrT6vDBAAA \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101132_cd9ce2fc949f47b282a25065facb0314.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101132_cd9ce2fc949f47b282a25065facb0314.trn deleted file mode 100644 index 8ca6355..0000000 --- a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101132_cd9ce2fc949f47b282a25065facb0314.trn +++ /dev/null @@ -1,5 +0,0 @@ -https://dc.services.visualstudio.com/v2/track -Content-Type:application/x-json-stream -Content-Encoding:gzip - -H4sIAAAAAAAACpSUy27cOBBFf0XgWpT5fmiXsTMYwwhsxEYmmB0fxZiIWmpQVGcCo/99QLUDJ7PLjiiwirdOXdYLmt0B0IjeHY/vTzDXFfWo5j3ECFOYcEzpEyUjpSNnAyfSCk3/QT3Kd/AdjUiLEGiwgDkowCISiT1PAccIlhIaCZOi1XRfVjS+IJeHCKccYFjWT1DWvMxoRH/nOS7f2tsuD2FatjiUZYLbea1uDk3MzfvHu6f7B3wtKLm+/+Nyc4W1FRhyRCNyTEGiKWERvMTCGoutMBJDYF4LoYLT/pKW5wpldtOwxq9vGuJSZ6hhZAPjA8HMonOPoquuyfZuhafvx6Zkx3TT4v0e3o/jCzpBQSPrfwC9lLsKU75aNz/BCaajKyuUq7AcDm6OqEfHshyh1Aw7mhMUv6y5NqohaGcMpdE4LaSOhkvGdeQEoiFaRhutU0IlFqRM0RurRRKRUREVCOE16tEOb5pczcvcvWq/njLMFfXo/rF7mFxNSzn8gv/xQvT2N4A22WhEnEiutAbBOXdWeUYgahWUYj44opNnQAPs9rFUE8otI5ZLpY2OjtiAevTBhec8Q3d7g0ZkrEgm2ISFjBILMAJbwwl2EayOILkhBvXoeplrnrdlW7vbucKXsveLRvSnm1a4dPquhOdcIdStNAifVTPkQ1niFmr3ZgBKBjJQwlvSVo9b7T5CzAVChYbjqWyv9f6XwhQjpEnZSoG5dg+uPnd/ufUZjQiioDoG65SxNOmgVZIqGWI4eCJUSkJRqamSxjvpfVIhxuhtYjFYa4lFPYLmt263eAJvTRAcC+4kFtxT7KVV2ABII5VigbXW3jh291PLs8o7xyzF3mqBRdAE++glNoYwmoS3LLCfkLyaRTS+d1BmmH5q+UMOZVmXVLtX13S/QPi4zW19dLuDvuUZ/7vTvlnCVyhdm5bLc/sprwM69+gAbt0KHPbtM76gh/ZNuqd9CXE6KGpEjx6rK3U7/gjLgRpjzufz+T8AAAD//wMAXcXEucIEAAA= \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_29e8b7409365437281263f9a64c97105.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_29e8b7409365437281263f9a64c97105.trn deleted file mode 100644 index c6753fc..0000000 --- a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_29e8b7409365437281263f9a64c97105.trn +++ /dev/null @@ -1,5 +0,0 @@ -https://dc.services.visualstudio.com/v2/track -Content-Type:application/x-json-stream -Content-Encoding:gzip - -H4sIAAAAAAAACpRUy07kOBT9lcjbidO242d2NEVrEKJBTWlmNDs/bsBDyik5DgxC9e+tpKAbaM1iNlF0dR/nnnOun1GyO0AdOtnvzx4glQnVqMQ1xAiTmLSY0i0lHWUdUQ0hikul/0Y1ihfwhDqkuPfUG8AtSMA8EIFd23scAhhKaCBM8KWnvZ1Q94xsbAI8RA/NOP0BeYpjQh36M6YwPi6zbWz8MM6hyeMA52kqNvkFzObs5mJ7dY1POSWnV5+PmRNMS4MmBtQhyyT0tO8x905gbrTBhmuBwTOnOJfeKncsi6lATnZopnD/E0MYS4LiO9awtiGYGXSoUbDFLrCdnWD7tF+QrDRtlni9htff7hk9QEYdq18JPbb75If4aTe5OQ7h0/pFNdrncQ+5RFgZWZccBlvimKqXGadDhFRQjT4vJTez9zBNqENf7DDBa/gs3cYEX7LdweOY778e5zZfz7aoRtd5/Ad8ubblbhFJ66ANGAqegSZcEtEzJakhCmSvjbKGUsaMJMRRxoQMTikIVFunmASBanR1U10PtvRj3r0T7Oaowfn/kODm5PQsWTdA+LjS1uZbKKhDQgoHba+ZdNIGa1rdUwutCd61UoB2KmhQqmWt9cITTT1VVFijhFCyZRTV6NL6u5igOt+gDmnDe+1Nj7kIAnPQHBvdEmwDGBVAtJpoVKPTMZWY5nGeqvNU4DavqrxBeXVTnWR/Fwv4MueF77/kYu/rPIbZl+qnnShpSENJuxTNZT+X6huEmMGXde1tnl/6fShhkhGyQJlzhlSqRcHqdzstMkLgVAVvrNSG9sor2QvZa6JbcITLvueSCkWl0M4K53rpQwjO9Cx4YwwxqEawuLc6HozUWnPVY218wJxJgp2XPZbSCUGE0K0U73isroalzkhnLTMUO6M45l4R7IITWGvCaM+dYZ699+ibFfXCCm2UXJl5pe3F9nzR4AJyguENLZfR53Ea+1K9uK56R9SbOZs47Qf79Mu43zzjrfAt/Mg/vQN//6sJv81pefyq1c2PMeF/V3U3o7+HXC3usDEtd/6j4nIeStzeZbABwuUY4GPTQ412YKc5w259XteLT5BXGJv56LDzdBmHIU7gxxQm1LVcKtNwLvUL3v9OVKptpGjZ4XA4fAcAAP//AwDt9x8mzgUAAA== \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_355edbe52e8d4f52b4140a0063ffab25.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_355edbe52e8d4f52b4140a0063ffab25.trn deleted file mode 100644 index 937d45f..0000000 --- a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_355edbe52e8d4f52b4140a0063ffab25.trn +++ /dev/null @@ -1,5 +0,0 @@ -https://dc.services.visualstudio.com/v2/track -Content-Type:application/x-json-stream -Content-Encoding:gzip - -H4sIAAAAAAAACpSTQW/cIBCF/4o1Z+MAxjb41m5aNYqqRE3UVr1hGLqoDqwwTltF+98rvFsl6a03NGKG9743PEHQDwgjvDkc3j1iyAvUkP1W4pT3hLaEsXtGR8ZHOjSUDlJ1wzeowV/jbxhhEMYwo5C02CMRlnZkap0h1qJilFnKO1Fm6u8LjE+gfWPx0Rts4vIZ0+JjgBG++GDjz/K29o2Z42qbFGe8CkvWwRQxl+/uru9vbslOMLq7eXu6ueBSBjTewgia9+iYc0SYqSNCSUWUkB1Bw6dBiN7oYTq1+ZAxBT03i/3xrMHGHDCbkTe8bSjhCo41WJ11kT3pBe9/H4qSDdNlqddbeTuOT/CICUZe/wV6GndhZn9h4sODDvbC+eCXPdRwSPGAKXvckGwu51lnH0N1fmQ3ewwZari5q25nnV1MD6843Z2sX/2H84/a7H3A6uoSRpBKOGmUI6KzHREoBVGypURbVIPFrpVUQg27GLIPa1yX6ipk/J42lTDCez0veNL3Jpm9z2jymor0r33JG3/5vIu2FBjUcJuiXU2unnEz2tCG0bbMWPNhzdUntD6hyVg83af1PP6fFt5zSouyNSUMubrVeV990MseRkAr2GCN0r1UzA1m6F3XO0llixMVvXOiZ93A+k5Oupsm1xtr7aQct0YpRVXRXdKttoXqxKQ7y1piBR+IaFtNtLGGcKkH12ojlSs78Iy1uplLn+onrbliZFKDIMIMlEx26oiUlDMnJsUNf4HknLgouK8xBZxfWP7oTYpLdLk6R1+9gvBpDeWzVtsa/PSB/NrgX0bzA1NVwtM+lL0853U8Ho9/AAAA//8DAPBoK+/zAwAA \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_b8dfe3641ec94bc29ec4ef38b3e77bff.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_b8dfe3641ec94bc29ec4ef38b3e77bff.trn deleted file mode 100644 index 73ae407..0000000 --- a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_b8dfe3641ec94bc29ec4ef38b3e77bff.trn +++ /dev/null @@ -1,5 +0,0 @@ -https://dc.services.visualstudio.com/v2/track -Content-Type:application/x-json-stream -Content-Encoding:gzip - -H4sIAAAAAAAACpSTT0/cMBDFv0o053WwHSexc6MLVRGqQGXVVr35zxgsgrNyHApC+90rZ7ei7a2XKBplZt77vckbRP2EMMD5fn/5jDHPsIEc1hKnvCO0IYztGB0YH2hfUyqUEPIHbCBc4ysM0AtrmVVIGuyQCEdbYhpviXOoGGWO8laUmfp+huENdKgdPgeL9TR/xTSHKcIA30J008+yW4fajtPi6jSNeBXnrKMtYi4u7653N7dkKxjd3nw4fjnjXAbUwcEAmnfomfdEWNMSoaQiSsiWoOWmF6KzujfHthAzpqjHenaP7xrclCNmO/CaNzUlXMFhA05nXWQbPePudV+UrJguSn2zltfX4Q2eMcHAN7+BHsed2TGcPc1mCaM7Oz6znh+L032a9phywJXLanUcdQ5TrE6btmPAmGEDN3fV7aizn9LTX7Dujv6v/sP+rmy/fEG7ZHTbaYkZBhAloc/aPoSI1dUFDCCV8NIqT0TrWiJQCqJkQ4l2qHqHbSOphA1sp5hDXKZlrq5ixvu06ocBPupxxqPy82QfQkabl1RMfe/Ksts0ucXm6h0/ozWtGW1K05L3S66+oAsJbcZib5eW07x/WnjHKS1SlpQw5upW54fqk54fYAB0gvXOKt1JxXxv+863nZdUNmio6LwXHWt71rXS6NYY31nnnFGeO6uUogo2gCXtaj0wRi1tlLNE6oYR0bKWGImWeIPoJGtM1xT17xyrm7H0qc5ozRUjRvWCCNtTYpxpiZSUMy+M4pb/geQUvih8rzFFHP+w/DnYNM2Tz9XpCqq/IHxZYvl5q/UifoZIXlbaF5N9xFSVtHSI5U5PAR0Oh8MvAAAA//8DADPqJ3gDBAAA \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_d03d06df80cd4d3ca806551f3e503b6d.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_d03d06df80cd4d3ca806551f3e503b6d.trn deleted file mode 100644 index 193ba14..0000000 --- a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260311101207_d03d06df80cd4d3ca806551f3e503b6d.trn +++ /dev/null @@ -1,5 +0,0 @@ -https://dc.services.visualstudio.com/v2/track -Content-Type:application/x-json-stream -Content-Encoding:gzip - -H4sIAAAAAAAACpSUTW8cKRCG/0qLc9MGmqabvjljR2tZka14lF3lxkcRI7dhBLQTy5r/vqJnIsen1V4QKqjirect8YaCegY0o8vD4foFQsmoRcVvIUaYwKTHlO4pmSmbydgR0lPK+++oRf4WXtGMRm4MNRJwDwIwt2TAuncGWwuSEmoJG3itqX5kNL8h5TsLL95AF/M3SNnHgGb0tw82/qxvK9+ZJa62S3GBm5CLCqaKubp+uN3f3eMdp2R39+l0M0OuBTpv0YwUE+Coc5gbPWAuJ4klnwYMhumRc2HUqE9pPhRIQS1dtk/vGmwsAYqZWcf6jmAm0bFFVhVVZWuVYf96qEo2TFc13m7hbTu/oRdIaGbtb6Cnchdm8RfPWa9+sRentaj8lLfVKVNiekUtOqR4gFQ8bIwuc4ZnvbzuVX76fLpTt/n6F5i1gN3FNRQ0o35CLdoYLYsqPobmLHG3eAhlOyzJh+zNf5USqEV3D839ooqL6fmDJQ8nyjf/A/IXZR59gObmCs1oktxNRjrMBztgDhPHcuoJVhbkaGHoJ1Ib2cVQfFjjmpubUOBH2lpCM/qslgwnfZfJPPoCpqyp9vmPqKN1n6JdTWneraSkIx0lfU1ay2EtzVewPoEpUJvYp/Vc79vHFCYYIVXKmhKE0tyr8tj8pfIjmhFYTkdrpBKTpG40o3CDcBOZetCEC+e4oMNIxTBpNWjthLHWaumYNVJKIlGLoE5Osw1rTy11Qhg8ibHHXGqBtRt7bB3lVDAYqaoZ7xybu6XmSaGVYpJiLUeOuRkJ1lYPeJoIo45ryQz7A8l5HnjlewspwPJHy1+8STFHV5qz180HCF/XUD+CZvP9pw/410b7KponSE11S/lQZ/5s0PF4PP4LAAD//wMAQozcs08EAAA= \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011249_65d022e2ac4d4f6b858df8364492908b.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011249_65d022e2ac4d4f6b858df8364492908b.trn new file mode 100644 index 0000000..a7cbacf --- /dev/null +++ b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011249_65d022e2ac4d4f6b858df8364492908b.trn @@ -0,0 +1,5 @@ +https://dc.services.visualstudio.com/v2/track +Content-Type:application/x-json-stream +Content-Encoding:gzip + +H4sIAAAAAAAACoxUTW/jNhD9KwLPokJJlEQK6CF1smiQpg5ib7fojR/DmIhMGhSVbBDkvy8oK2tne+mNGHJm3rz3hm/IiT2gHl0eDtfP4OKIchTtHKpI1WJS47LakrIvq57yom5KQmv2L8qRvYVX1KOOKlUqDriGFjDVpMGyNgprDbwkpSZVQ1NN8Tii/g0JW2h4tgoKP/4NYbTeoR59s077l9Rb2EINftJF8APcuDEKpxKYq+vN7XZ9j1e0JKv178eXI4ypQGE16pGgrdRUCUyULjFthMJS6AoTCoSYjlWG82OadRGCE0Mx6qcTBu2jg6j6qqjqguCKo/ccaRFFgi3FCNvXQ0Iy03SV4vkcno/9G3qGgPoq/yD0WO5CDfZiP8rJDvoiivAI0QSxhxcfnuBZDChHh+APEKKFmZ/1JjtBKklBiqqtCEE5uhNqZx1kN1fZekgD81YKUfESS95RTFVHsNSywYyRqjRU8kpVKEe3EBwMZ1XvrAp+9CZmC+3Zpz4r76J1k5/G7MZFeAwiHvO+iGEElKP7SQ523D2A0K9b/zClOzcNaZbVFAK4mN2LuMv+EOMO9Qg0LTutuGgZL02nutY0rWGE1SAJbY2hbdl0ZdswKRopTau01pKbSivOOUmarad4mOLC/zfrrr+f4dgGu9+DPoHYzjTfDyIaH/Y3Gly0xiZ1znw2W2sY5tmypfJqsODiJ6pRjxinhiluMG10gykwijmrCRYaeKehqRlhR9qMfZx+skWM0bQ2DWOt5LIkUJmOUdIZSbQyteK6kdBVHekYMK4IkQ0tmeSKaCgbqtOAwetJxV8NUZIa5ehhcmlPs5s0+Yt1+HtLT6TcBx+98sOJlf+otvL7gx9tTJObRdqvI9x5l26XP+Bz8qWPpxikPcjm1ZNKgjZNjbViBlMpBBai45jKWglGJG1aiXJ05dUThCwZTFg3C/LhqfUmuwxqZyOoOIXU+Z95nKOWXz5W5sRE8df1duUDXB4O+RL97ZkVycDrTfYh/ifJv47p9c6PaYgYpjMPbWAwH7DOnHT0XfYA2gZQcb7aHhMXij65a8m6DNEaoeKYtuBPr2ZHLBZbnvza74z/n9nH5mcaLG5YKtFkus3xA5w98L/+v/f39/cfAAAA//8DAI8VPMr0BQAA \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011249_ade84ff4a3494c3ab3399c0a5633a401.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011249_ade84ff4a3494c3ab3399c0a5633a401.trn new file mode 100644 index 0000000..364148f --- /dev/null +++ b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011249_ade84ff4a3494c3ab3399c0a5633a401.trn @@ -0,0 +1,5 @@ +https://dc.services.visualstudio.com/v2/track +Content-Type:application/x-json-stream +Content-Encoding:gzip + +H4sIAAAAAAAACpSTW2/cIBCF/4o1z8YBjC/4Ld2kahRFiZqorfqGYciiOLDCOBdF+98rvFsl6Vvf0IgZzvnO8AZePSIMcLrbnT+hTzOUkNxa4pS3hNaE8TvKBsYHIauWcd607DeU4C7xFQbohNZMSyQ1tkiEoQ0Za6uJMSgZZYbyRuSZ6n6G4Q2Uqww+OY1VmH9gnF3wMMBP5014zm8rV+kpLKaKYcILPyfldRZzdn57eXd9QzaC0c31l8PNGec8oHIGBlCiHY3QilBtGBGN0mRUhhMqkFLb9dxKeWhzPmH0aqpm8/CuwYTkMemBV7yuKOES9iUYlVSWPaoZ7153WcmK6SzXy7W8Hoc3eMIIAy//Aj2MO9GTO9Hh8VF5c2Kdd/MWStjFsMOYHK5IVpfTpJILvjg+spkc+gQlXN8WN5NKNsTHT5xuD9Yv/sP5ldJb57G4OIMBeilsr6UlojENEdgLIvuaEmVQdgabuqc9lLAJPjm/hGUuLnzC+7iqhAG+qmnGg77TqLcuoU5LzNJ/tTlvfHFpE0wuMCjhJgaz6FS842a0ohWjdZ6xpN2Siu9oXESdMHu6i8tx/D8tvOWUZmVLjOhTcaPStvim5i0MgEawzmip2l4y2+mutU1re9rXOFLRWita1nSsbfpRNeNoW22MGaXlRkspaYaEOd1iXShTC9GxWpJ+3WzdSaJw5KQTomtHYzWqbO0da3E95T7ZjkpxycgoO5H7KBnN2JC+p5xZMUqu+Qckx8RFxn2J0eP0wfKV0zHMwabiGH3xCcL3xefPWqxr8Ow8eVnhnwX9gLHI4Snn814e89rv9/s/AAAA//8DAPk3YPjzAwAA \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011304_beef04e9d9fd4e6284c81303751b7238.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011304_beef04e9d9fd4e6284c81303751b7238.trn new file mode 100644 index 0000000..38301b7 --- /dev/null +++ b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011304_beef04e9d9fd4e6284c81303751b7238.trn @@ -0,0 +1,5 @@ +https://dc.services.visualstudio.com/v2/track +Content-Type:application/x-json-stream +Content-Encoding:gzip + +H4sIAAAAAAAACpSUTW/cNhCG/4rAsyjzmxzdUjtFXSOwES/aojd+jGwhWmpBUU4DY/97IXmDxL31Rgw4M+88fDmvJPsjkp58OJ0+vmCuC2lJHfeQYMJQJikXB8Z7LnumOm2Vsxz+Ji0Z7/Ab6YlVMfIISCUapCoxTYMcIk0JgTOemNBqq+mfFtK/Ej92CV/GiN28/IFlGedMevLnmNP8devtxy5O85q6Mk94m5fqc9zE3Hx8vDvcP9Brxdn1/S9vNxdctgLdmEhPgo2ScadpEANQBYpR4FzSAWzU4EErr9/SxlyxZD91S/ryQ0Oaa8Yae9EJ2TEqgJxbknz1m+zgFzx8O21Kdkw3W7zdw/uxfyUvWEgv2u9A38pdxWm8qvNpwhecTr4sWK7ifDz6nEhLTmU+Yakj7mj2aafJ13HOzaXZ9TRirqQl94/Nw+TrMJfjO16Pbwhu/weBFyyB9EQyLY21qKSUHkwQDJM10RgRomd2CAJ5RKZBWeCWcQmCgdTGOps8g0ha8jTNwU+/Lzs/ECy4xKwwAhWCUMZAZCgdDtoiS96YYFyEJJ0VyiUnPXjPIaCNYOJmkk8+Po8Zm9sb0hMHanARBqp00lShUxScZNQnBJtQS8ccacn1nOuY13ldmttc8ans/EhPfvXTgm/kPpT4PFaMdS0b1L/M1uyhzGmNtfnhAM461nEmt6S1ntbafMY0FowVN7yHsl7q/SdFGMHYJmUtBXNtHnx9bn7zyzPpCSbFbYrgjQM+2GjNoM3gmJMYmDLDoAzXlhvtgtchDCamlAIMIkUAYEBagpvhmt3jPhqvrE3UGKmpiiZQiInTQSarOUTpXXjHsbmftjwwwXsBnAawiqpoGQ0paOocE3xQAUQUPyG5mE9tfO+wZJx+GvnTGMu8zENtLi5s3kH4vOZtfzS7I7+Omf6z076Z4xcszfZafszbV7k80LklR/TLWvC4r5/+lTxs/6Q57FtIQAeK85Y8Vl/qerqEpeosKH0+n8//AgAA//8DAMTD+KDDBAAA \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011304_d4d157d1e8504b6b989e7f9358ff8e54.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011304_d4d157d1e8504b6b989e7f9358ff8e54.trn new file mode 100644 index 0000000..765c608 --- /dev/null +++ b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011304_d4d157d1e8504b6b989e7f9358ff8e54.trn @@ -0,0 +1,5 @@ +https://dc.services.visualstudio.com/v2/track +Content-Type:application/x-json-stream +Content-Encoding:gzip + +H4sIAAAAAAAACpSU227cNhCGX0XgtSjzfNBdaqeoYQRexEZb9I6HUUxESy0oymlg7LsX1G7hpHe9Iwac4T/f/Jw3lN0R0Ig+nE4fXyHXFfWopj3ECFOYcEzZM6Ej5SMRgxaEE0P/Qj1KD/AdjUiLEGiwgDkowCISiT2fAo4RLCU0EiZFq+m+rGh8Qy4NEV5TgGFZf4eypiWjEf2Rcly+tbddGsK8bHEoywz3ea0uhybm7uPTw/PjAd8KSm4ff7ncXGFtBYYU0Yi8DpxQI7Fnk8XCCoItpRxPVgdpnZXCyUtayhVKdvOwxq/vGuJSM9QwsoHxgWBm0blH0VXXZHu3wvP3U1OyY7pr8X4P78fxDb1CQSPr/wV6KXcT5nSzbn6GV5hPrqxQbsJyPLocUY9OZTlBqQl2NK9Q/LKm2qiGoJ0xlEbjtJA6Gi4Z15ETiIZoGW20Tgk1sSDlFL2xWkwiMiqiAiG8Rj3a4c2zq2nJ3VX77ZwgV9Sjx6fuMLs6LeX4E/6nC9H7/wG0yUYj4kRypTUIzrmzyjMCUaugFPPBET15BjQAkVZoSzWh3DJiuVTa6OiIDahHn1x4SRm6+zs0ImPFZIKdsJBRYgFGYGs4wS6C1REkN8SgHt0uuaa8Ldva3ecKX8reLxrRr25e4dLphxJeUoVQt9Ig/KmaIQ9liVuo3bsBKBnIQAlvSVs9bbX7DDEVCBUajueyXev9J4UpRkiTspUCuXYHV1+639z6gkYEUVAdg3XKWDrpoNUk1WSI4eCJUNMkFJWaKmm8k95PKsQYvZ1YDNZaYlGPoPmt2y2uLBNaWYoDiRYL7wj2jjnMhAiTUMKbffLvHLvHueVZ5Z1jlmJvtcAiaIJ99BIbQxidhLcssB+QXM0iGt8HKBnmH1r+lEJZ1mWq3dU13U8QPm+5rY9ud9C3lPHfO+27JXyF0rVpuZTbT7kO6NyjI7h1K3Dct8/4hg7tm3TP+xJidrCC0h49VVfqdrqGuRi0FfJ8Pp//AQAA//8DAEwV3yvCBAAA \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_1349017f61b443d2b1ed1e256da5cfc6.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_1349017f61b443d2b1ed1e256da5cfc6.trn new file mode 100644 index 0000000..1730ee4 --- /dev/null +++ b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_1349017f61b443d2b1ed1e256da5cfc6.trn @@ -0,0 +1,5 @@ +https://dc.services.visualstudio.com/v2/track +Content-Type:application/x-json-stream +Content-Encoding:gzip + +H4sIAAAAAAAACpSU0W7cKhCGX8Waa+MABtv4LmeTqlFUJWpW7dG5wzA0KA5eAU4bRfvuFd6t2lxV5wahgRn++f4RbxD0M8IIl4fD9QuGnKCG7LcQp7wjtCWM7ykbWTu2qpGtlL2Q/0EN/hZfYYReGMOMQtJih0RYKsnUOkOsRcUos5RLUWrqbwnGN9C+sfjiDTZL+oIx+SXACF99sMv38rb2jZmX1TZxmfEmpKyDKWKurh9u93f3ZCcY3d39c7qZMJUCjbcwwtSblrJBkok7RYQSlCjGWuJUb6TSSgotT2k+ZIxBz02yT7812CUHzGbkDW8bSriCYw1WZ11kTzrh/vVQlGyYrkq83sLbdnyDF4ww8voX0FO5CzP7i+c0rX62F6c16/SUttVpk5f4CjUc4nLAmD1ujC5Twudpft3r9PThdKds0/UPNGtGu1vWkGGEdoAaNkbzrLNfQnWWuJs9hrwd5uhD8uZvpTqo4e6hup91dkt8fmfJw4nyzf+A/EmbRx+wurmCEQYl3GCUI0JaSQQOgqihpURbVL1F2Q60NLJbQvZhXdZU3YSM3+LWEozwQc8JT/ouo3n0GU1eY+nz366M1n1c7Gpy9dtKRhvaMNqWpDUf1lx9RusjmoyliX1cz/W+vE/hHae0SFljxJCre50fq486PcIIaAXrrVG6GxRzvek7Jzs30KHFiYrOOdEx2bNODpOW0+Q6Y62dlOPWKKWoghqwTE61Das2QiiOmqiWSyKsM0SziZFWctWJzmnN3TuO1d1c8lQ3ac0VI5PqBRGmp2SykyTDQDlzYlLc8D+QnOdBFL63GAPOf7T8yZu4pMXl6ux19Q7C5zWUj6DafP/uA/mx0b5azBPGqrilfSgzfzboeDwefwIAAP//AwB8EUERTwQAAA== \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_21e40c2ece704c9a9c665a26988ab5d4.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_21e40c2ece704c9a9c665a26988ab5d4.trn new file mode 100644 index 0000000..cc9010a --- /dev/null +++ b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_21e40c2ece704c9a9c665a26988ab5d4.trn @@ -0,0 +1,5 @@ +https://dc.services.visualstudio.com/v2/track +Content-Type:application/x-json-stream +Content-Encoding:gzip + +H4sIAAAAAAAACpRUy07kRhT9Fau26fLU++EdQzMKQgxoaCVRdvW4hgrucqtchiDEv49sYAYYZZGNZV3dx7nnnFuPKLs9oA4dHQ4nd5DrhDaopjXECFOYcEzZjtCO8o7bVgpOKLd/ow1KZ/CAOqRFCDRYwBwUYBGJxJ73AccIlhIaCZNi6emuJ9Q9IpfaCHcpQDtOf0CZ0phRh/5MOY73y2yX2jCMc2zLOMBpnqrLYQGzPbk6211c4mNByfHF5+fMCaalQZsi6pDXgRNqJPast1hYQbCllOPe6iCts1I4+VyWcoWS3dBO8fYnhjjWDDV0rGW8JZhZ9LRB0VW3wPZugt3DYUGy0rRd4ps1vP52j+gOCurY5pXQ53afwpA+7Sc/pyF+Wr9ogw5lPECpCVZG1iWHwdU05uZlxvGQIFe0QZ+Xkqs5BJgm1KEvbpjgNXySr1OGL8Xt4X4st1+f57ZfT3Zogy7L+A+EeunqzSKSMdFYsBQCA0OEIrJnWlFLNKjeWO0spYxZRYinjEkVvdYQqXFeMwULbxdXzeXgaj+W/TvBrp41OP0fElwdHZ9k5weIH1fauXINFXVIKumB94Ypr1x0lpueOuA2Bs+VBON1NKA1Z9wFGYihgWoqndVSasUZRRt07sJNytCcblGHjBW9CbbHQkaJBRiBreEEuwhWR5DcEIM26HjMNeV5nKfmNFe4Lqsqb1BeXDVHJdykCqHOZeH7L7XY+7KMcQ61+WknSlrSUsKXorke5tp8g5gKhLquvSvzS78PJUwxQhYocymQa7Mo2PzupkVGiILqGKxTxtJeB616qXpDDAdPhOp7oajUVEnjnfS+VyHG6G3PYrDWEos2CBb3NuvBqF5Yy6TEHITFwpuIrbYe6z7Y0CsXwJN3PDYXw1JnlXeOWYq91QKLoAn20UtsDGG0F96ywN579M2KZmGFtlqtzLzS9mJ7sWhwBiXD8IaW8xTKOI19bV5c17wj6s2cbZoOg3v4ZdxvgQkuA4cf+cc3EG5/NeG3OS+PX7O6+T5l/O+q7nYMt1CaxR0u5eXOf1Scz0NNu5sCLkI8HyN8bPq0QXtw01xgvz6v68VnKCuM7fzssNN8noYhTRDGHCfUcWEMbymx8gXvfydaZVrDqXl6enr6DgAA//8DAMCQ7JfOBQAA \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_34f05c901d6c4f79afa92871f4e4c7dc.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_34f05c901d6c4f79afa92871f4e4c7dc.trn new file mode 100644 index 0000000..bd2012e --- /dev/null +++ b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_34f05c901d6c4f79afa92871f4e4c7dc.trn @@ -0,0 +1,5 @@ +https://dc.services.visualstudio.com/v2/track +Content-Type:application/x-json-stream +Content-Encoding:gzip + +H4sIAAAAAAAACpSTQW/cIBCF/4o1Z+MABtv41m5aNYqqRE3UVr1hGLqoDqwwTltF+98rvFsl6a03NGKG9743PEHQDwgjvDkc3j1iyAvUkP1W4pR3hLaE8XvKRtaOrWqkYKKXwzeowV/jbxihF8Ywo5C02CERlkoytc4Qa1ExyizlUpSZ+vsC4xNo31h89AabuHzGtPgYYIQvPtj4s7ytfWPmuNomxRmvwpJ1MEXM5bu76/ubW7ITjO5u3p5uLriUAY23MMLUm5ayQZKJO0WEEpQoxlriVG+k0koKLU9tPmRMQc/NYn88a7AxB8xm5A1vG0q4gmMNVmddZE96wfvfh6Jkw3RZ6vVW3o7jEzxigpHXf4Gexl2Y2V+Y+PCgg71wPvhlDzUcUjxgyh43JJvLedbZx1CdH9nNHkOGGm7uqttZZxfTwytOdyfrV//h/KM2ex+wurqEEQYl3GCUI0JaSQQOgqihpURbVL1F2Q50gBp2MWQf1rgu1VXI+D1tKmGE93pe8KTvTTJ7n9HkNRXpX7uSN/7yeRdtKTCo4TZFu5pcPeNmtKENo22ZsebDmqtPaH1Ck7F4uk/refw/LbzjlBZla0oYcnWr8776oJc9jIBWsN4apbtBMdebvnOycwMdWpyo6JwTHZM96+QwaTlNrjPW2kk5bo1Siqqiu6RbbQtlWds7nCxpJzREUCPJpPqWIEehGaXU2eL0GWt1M5c+1U1ac8XKbUGE6SmZ7CTJMFDOnJgUN/wFknPiouC+xhRwfmH5ozcpLtHl6hx99QrCpzWUz1pta/DTB/Jrg38ZzQ9MVQlP+1D28pzX8Xg8/gEAAP//AwBJsyo48wMAAA== \ No newline at end of file diff --git a/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_58cfa4f36fd34029bff6f5467c0859c3.trn b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_58cfa4f36fd34029bff6f5467c0859c3.trn new file mode 100644 index 0000000..4df1487 --- /dev/null +++ b/CSI-H238M/.dotnet/.dotnet/TelemetryStorageService/20260312011339_58cfa4f36fd34029bff6f5467c0859c3.trn @@ -0,0 +1,5 @@ +https://dc.services.visualstudio.com/v2/track +Content-Type:application/x-json-stream +Content-Encoding:gzip + +H4sIAAAAAAAACpSTT2+cMBDFvwqaMya2sQFzS3dTdRVFGzWrturN2EPWCjErY/JH0X73yuxWSXrrBaERM/Pe7w1v4PUjQguXh8PVE/o4QQ7RLSVOeUVoSRjfUdaysi1VIQUtlap+Qw7uGl+hhVoYw4xCUmKFRFgqSVf2hliLilFmKZcizdT3E7RvoF1h8ckZLMbpB4bJjR5a+Om8HZ/Tbu0KM4yzLcI44MZPUXuTxKyv7q5321uyEoyutl9OX044pQGFs9BCV5uSskaSjveKCCUoUYyVpFe1kUorKbQ8tTkfMXg9FJN9eNdgx+gxmpYXvCwo4QqOOVgddZLd6Ql3r4ekZMG0TvV8KS+v7Rs8YYCW53+BnsZdmMFdPE7d7AZ7cXpGPT0kp4cwHjBEhwuXxeow6OhGn503rQaHPkIO27vsdtCxH8PjJ1h3J/+b/7C/S9uvXtDMEe1qnH2EFkRK6EabvfOYbdbQQqNE3xjVEyGtJAIbQVRTUqItqtqiLBvaQA6r0Ufn53Geso2PeB8W/dDCVz1MeFJ+GczeRTRxDsnUryotuw2jnU3M3vEzWtCC0TI1zfEwx+w7WhfQREz2dmE+z/unhVec0iRlDgF9zG513Gff9LSHFtAKVlujdNUo1temrnpZ9Q1tSuyoqPpeVEzWrJJNp2XX9ZWx1naq59YopaiCHDClnS0HZmSltRIVYQw1EUYK0pSqJ6iFaapa8rpJQt45Ztsh9amq05orRjpVCyJMTUlnO0mahnLWi05xwz8gOYcvEt9rDB6HD5ZvnAnjNPYxO19B9gnC99mnnzdbLuLZefKy0F6P5gFDltLSzqc7PQd0PB6PfwAAAP//AwDhQYZRAwQAAA== \ No newline at end of file diff --git a/CSI-H238M/CSI-H238M/Services/ModbusService.cs b/CSI-H238M/CSI-H238M/Services/ModbusService.cs index d907280..1fcb91e 100644 --- a/CSI-H238M/CSI-H238M/Services/ModbusService.cs +++ b/CSI-H238M/CSI-H238M/Services/ModbusService.cs @@ -156,6 +156,7 @@ namespace COFTester.Services protected bool _isConnected; protected bool _isAcquiring; protected CancellationTokenSource? _cts; + protected Task? _acquisitionTask; public event EventHandler? DataReceived; public event EventHandler? TestFinished; @@ -203,7 +204,7 @@ namespace COFTester.Services _isAcquiring = true; _cts = new CancellationTokenSource(); - Task.Run(async () => await AcquisitionLoopAsync(parameters, _cts.Token), _cts.Token); + _acquisitionTask = Task.Run(async () => await AcquisitionLoopAsync(parameters, _cts.Token), _cts.Token); } /// @@ -216,6 +217,38 @@ namespace COFTester.Services _isAcquiring = false; } + protected virtual async Task WaitForAcquisitionToStopAsync(int timeoutMs = 5000) + { + var acquisitionTask = _acquisitionTask; + if (acquisitionTask == null || acquisitionTask.IsCompleted) + { + return; + } + + try + { + var completedTask = await Task.WhenAny(acquisitionTask, Task.Delay(timeoutMs)); + if (completedTask == acquisitionTask) + { + await acquisitionTask; + } + else + { + System.Diagnostics.Debug.WriteLine($"[Modbus] 等待采集停止超时: {timeoutMs}ms"); + } + } + catch (OperationCanceledException) + { + } + finally + { + if (acquisitionTask.IsCompleted) + { + _acquisitionTask = null; + } + } + } + /// /// 重置傳感器(已廢棄) /// 注意:ControlRegister 不存在,請使用 ToggleResetAsync(1301) 進行復位 @@ -650,6 +683,9 @@ namespace COFTester.Services { const ushort STOP_BUTTON_ADDRESS = 32; // M32 停止按钮 + StopAcquisition(); + await WaitForAcquisitionToStopAsync(); + System.Diagnostics.Debug.WriteLine($"[Modbus] 触发测试停止按钮 M{STOP_BUTTON_ADDRESS}"); await _modbusMaster.WriteSingleCoilAsync(1, STOP_BUTTON_ADDRESS, true); diff --git a/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs b/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs index eeb4ce2..66fcdbf 100644 --- a/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs +++ b/CSI-H238M/CSI-H238M/ViewModels/ViewModel.cs @@ -28,6 +28,11 @@ namespace COFTester.ViewModels private readonly AppConfig _config; private ScottPlot.Plottables.Scatter? _scatterPlot; private readonly Dictionary _testCurves = new(); + private readonly object _pendingUiPointsLock = new(); + private readonly List _pendingUiPoints = new(); + private bool _isUiDataUpdateQueued; + private long _lastPlotRefreshTick; + private const int PlotRefreshIntervalMs = 100; private double _currentForce; private double _currentDisp; @@ -616,31 +621,39 @@ namespace COFTester.ViewModels { return; } - // 使用 Dispatcher 確保在 UI 線程更新 - Application.Current?.Dispatcher.InvokeAsync(() => + + bool shouldQueueUiUpdate; + lock (_pendingUiPointsLock) { if (!_acceptIncomingTestData || sessionId != Volatile.Read(ref _testSessionId)) { return; } - // 更新力值和位移 - CurrentForce = point.Force; - CurrentDisp = point.Displacement; - - // 更新實際位置數據(從 PLC 讀取) - LiftPosition = point.VerticalPosition; // D12 升降位置 - HorizontalPosition = point.HorizontalPosition; // D16 水平位置 - - _realTimePoints.Add(point); - OnPropertyChanged(nameof(DataPointsCount)); - UpdateScottPlot(); - }); + + _pendingUiPoints.Add(point); + shouldQueueUiUpdate = !_isUiDataUpdateQueued; + if (shouldQueueUiUpdate) + { + _isUiDataUpdateQueued = true; + } + } + + if (!shouldQueueUiUpdate) + { + return; + } + + Application.Current?.Dispatcher.InvokeAsync(() => + { + ApplyPendingUiPoints(sessionId); + }, DispatcherPriority.Background); } private void OnTestFinished(object? sender, EventArgs e) { Application.Current?.Dispatcher.InvokeAsync(() => { + ApplyPendingUiPoints(Volatile.Read(ref _testSessionId), forcePlotRefresh: true); IsTesting = false; TestButtonText = Lang.StartTest; // 测试完成后恢复按钮文本 _m31Status = false; // 测试完成,M31应该为0 @@ -882,6 +895,8 @@ namespace COFTester.ViewModels int sessionId = Interlocked.Increment(ref _testSessionId); _isTestTransitioning = true; UpdateCanStartTest(); + ClearPendingUiPoints(); + _lastPlotRefreshTick = 0; _realTimePoints.Clear(); OnPropertyChanged(nameof(DataPointsCount)); @@ -996,6 +1011,7 @@ namespace COFTester.ViewModels _stopRequestedByUser = true; _acceptIncomingTestData = false; _isTestTransitioning = true; + ClearPendingUiPoints(); _daqService.StopAcquisition(); IsTesting = false; _m31Status = false; @@ -1046,6 +1062,7 @@ namespace COFTester.ViewModels // 2. 清除界面数据(包括位置数据) _realTimePoints.Clear(); + ClearPendingUiPoints(); OnPropertyChanged(nameof(DataPointsCount)); LatestResult = null; CurrentForce = 0; @@ -1756,6 +1773,62 @@ namespace COFTester.ViewModels configWindow.ShowDialog(); } + private void ApplyPendingUiPoints(int sessionId, bool forcePlotRefresh = false) + { + List pendingPoints; + lock (_pendingUiPointsLock) + { + pendingPoints = _pendingUiPoints.Count == 0 ? new List() : new List(_pendingUiPoints); + _pendingUiPoints.Clear(); + _isUiDataUpdateQueued = false; + } + + if (pendingPoints.Count == 0) + { + return; + } + + if (!_acceptIncomingTestData || sessionId != Volatile.Read(ref _testSessionId)) + { + return; + } + + var latestPoint = pendingPoints[pendingPoints.Count - 1]; + CurrentForce = latestPoint.Force; + CurrentDisp = latestPoint.Displacement; + LiftPosition = latestPoint.VerticalPosition; + HorizontalPosition = latestPoint.HorizontalPosition; + + _realTimePoints.AddRange(pendingPoints); + OnPropertyChanged(nameof(DataPointsCount)); + + if (forcePlotRefresh || ShouldRefreshPlot()) + { + UpdateScottPlot(); + } + } + + private bool ShouldRefreshPlot() + { + long now = Environment.TickCount64; + if (now - _lastPlotRefreshTick < PlotRefreshIntervalMs) + { + return false; + } + + _lastPlotRefreshTick = now; + return true; + } + + private void ClearPendingUiPoints() + { + lock (_pendingUiPointsLock) + { + _pendingUiPoints.Clear(); + _isUiDataUpdateQueued = false; + } + } + #endregion #region INotifyPropertyChanged