Joseph Doherty
cf43f8d0ab
feat(mtconnect): current/sample parse + sequence-gap detection (Task 7)
...
Adds the /current and /sample legs to MTConnectAgentClient:
- MTConnectStreamsParser: hand-rolled System.Xml.Linq parse of an
MTConnectStreams document into MTConnectStreamsResult. Observations are
every element child of <Samples>/<Events>/<Condition>, keyed by
dataItemId (the element NAME is the data item's type in PascalCase, so
a fixed name set would drop observations). A CONDITION's value is its
element name, not its text - <Normal/> is empty - and <Unavailable/>
normalizes onto the same UNAVAILABLE sentinel a Sample/Event carries as
text, so Task 8's no-comms mapping sees one token. Timestamps are
normalized to DateTimeKind.Utc explicitly.
- IsSequenceGap(requestedFrom, chunk) => chunk.FirstSequence >
requestedFrom, so Task 11's pump can re-baseline after a ring-buffer
overflow. Equality is NOT a gap.
- SampleAsync: ResponseHeadersRead + a hand-rolled
multipart/x-mixed-replace frame reader (Content-length fast path,
boundary-scan fallback), bounded by a heartbeat watchdog derived from
HeartbeatMs so a silent Agent faults instead of wedging the pump - the
S7 frozen-peer shape (arch-review R2-01). The long poll gets its own
HttpClient with an infinite Timeout so the unary /probe + /current
deadline stays bounded.
Task 0 package decision, option (c): both TrakHound PackageReferences and
their PackageVersions are dropped. MTConnectHttpClientStream takes a URL
and dials its own socket (no handler/stream seam, so it cannot serve a
socket-free unit suite), and it emits already-parsed documents through the
formatter lookup Task 6 proved is missing - framing-only reuse was never
actually on offer. The driver now depends on nothing but the BCL. Recorded
in the plan's Task 0 CORRECTION block.
Also folds in two Task 6 review carry-overs: the stale
IMTConnectAgentClient doc comment claiming a TrakHound-backed
implementation, and a probe test constructing a mixed-namespace vendor
extension (<x:Pump> with default-namespace <DataItems> children) that
backs the parser's ignore-the-namespace claim with a test.
187/187 green.
2026-07-27 13:57:46 -04:00
..
2026-05-26 03:04:21 -04:00
2026-05-26 11:15:59 -04:00
2026-06-15 09:52:51 -04:00
2026-05-26 03:55:48 -04:00
2026-06-15 09:52:51 -04:00
2026-06-18 09:24:35 -04:00
2026-05-28 08:36:53 -04:00
2026-06-18 09:24:35 -04:00
2026-05-28 15:19:52 -04:00
2026-05-28 15:29:40 -04:00
2026-06-15 09:52:51 -04:00
2026-05-29 08:45:50 -04:00
2026-05-29 08:59:55 -04:00
2026-05-29 08:59:55 -04:00
2026-05-29 07:58:18 -04:00
2026-05-29 07:43:11 -04:00
2026-06-15 09:52:51 -04:00
2026-06-03 13:59:02 -04:00
2026-06-03 14:06:24 -04:00
2026-06-15 09:52:51 -04:00
2026-06-07 06:08:36 -04:00
2026-06-06 14:20:36 -04:00
2026-06-06 15:07:45 -04:00
2026-06-07 04:49:27 -04:00
2026-06-07 06:09:23 -04:00
2026-06-07 10:06:08 -04:00
2026-06-07 10:20:52 -04:00
2026-06-07 10:56:27 -04:00
2026-06-07 02:50:49 -04:00
2026-06-07 02:59:46 -04:00
2026-06-16 18:51:49 -04:00
2026-06-07 14:55:28 -04:00
2026-06-07 15:00:11 -04:00
2026-06-07 15:57:43 -04:00
2026-06-08 06:49:28 -04:00
2026-06-08 06:49:28 -04:00
2026-06-08 07:10:14 -04:00
2026-06-08 12:02:18 -04:00
2026-06-08 12:11:40 -04:00
2026-06-15 09:52:51 -04:00
2026-06-09 09:03:22 -04:00
2026-06-09 09:11:02 -04:00
2026-06-15 09:52:51 -04:00
2026-06-09 13:44:20 -04:00
2026-06-09 13:56:59 -04:00
2026-06-09 15:52:57 -04:00
2026-06-10 07:27:44 -04:00
2026-06-10 07:36:59 -04:00
2026-06-15 09:52:51 -04:00
2026-06-10 11:28:13 -04:00
2026-06-11 05:37:54 -04:00
2026-06-11 08:08:37 -04:00
2026-06-11 04:19:43 -04:00
2026-06-11 04:24:00 -04:00
2026-06-11 05:37:54 -04:00
2026-06-11 08:23:58 -04:00
2026-06-11 10:51:55 -04:00
2026-06-11 10:56:25 -04:00
2026-06-15 09:52:51 -04:00
2026-06-11 08:28:37 -04:00
2026-06-15 09:52:51 -04:00
2026-06-11 12:42:54 -04:00
2026-06-15 09:52:51 -04:00
2026-06-11 20:22:32 -04:00
2026-06-11 20:31:17 -04:00
2026-06-15 09:52:51 -04:00
2026-06-11 14:03:21 -04:00
2026-06-11 14:13:25 -04:00
2026-06-11 15:42:38 -04:00
2026-06-12 20:55:08 -04:00
2026-06-12 21:05:45 -04:00
2026-06-15 09:52:51 -04:00
2026-06-12 11:03:32 -04:00
2026-06-12 11:10:41 -04:00
2026-06-12 11:10:41 -04:00
2026-06-13 06:21:40 -04:00
2026-06-13 06:24:38 -04:00
2026-06-15 09:52:51 -04:00
2026-06-13 08:11:41 -04:00
2026-06-13 08:14:04 -04:00
2026-06-13 09:37:20 -04:00
2026-06-13 10:45:25 -04:00
2026-06-13 10:51:18 -04:00
2026-06-13 12:44:29 -04:00
2026-06-14 17:08:24 -04:00
2026-06-14 17:11:07 -04:00
2026-06-14 18:09:46 -04:00
2026-06-14 02:50:34 -04:00
2026-06-14 02:58:12 -04:00
2026-06-15 09:52:51 -04:00
2026-06-14 18:46:43 -04:00
2026-06-14 18:48:33 -04:00
2026-06-15 09:52:51 -04:00
2026-06-14 00:51:05 -04:00
2026-06-14 00:51:05 -04:00
2026-06-14 22:38:42 -04:00
2026-06-15 09:52:51 -04:00
2026-06-14 01:13:38 -04:00
2026-06-15 05:57:15 -04:00
2026-06-15 09:52:51 -04:00
2026-06-15 10:43:29 -04:00
2026-06-15 09:40:03 -04:00
2026-06-15 09:40:03 -04:00
2026-06-15 12:33:09 -04:00
2026-06-15 12:41:51 -04:00
2026-06-15 12:41:51 -04:00
2026-06-15 13:59:28 -04:00
2026-06-15 14:05:00 -04:00
2026-06-15 14:05:00 -04:00
2026-06-16 05:18:19 -04:00
2026-06-16 05:21:00 -04:00
2026-06-16 05:21:00 -04:00
2026-06-16 19:17:19 -04:00
2026-06-16 19:23:03 -04:00
2026-06-16 20:15:37 -04:00
2026-06-16 21:06:59 -04:00
2026-06-16 21:10:50 -04:00
2026-06-16 23:02:23 -04:00
2026-06-16 07:12:48 -04:00
2026-06-16 06:32:15 -04:00
2026-06-16 07:35:17 -04:00
2026-06-16 16:09:06 -04:00
2026-06-16 16:11:42 -04:00
2026-06-16 17:32:12 -04:00
2026-06-16 17:47:25 -04:00
2026-06-16 17:51:56 -04:00
2026-06-16 18:41:30 -04:00
2026-06-17 19:52:52 -04:00
2026-06-17 20:00:05 -04:00
2026-06-17 20:51:55 -04:00
2026-06-17 11:44:14 -04:00
2026-06-17 11:51:29 -04:00
2026-06-17 12:14:56 -04:00
2026-06-17 05:15:42 -04:00
2026-06-17 05:17:50 -04:00
2026-06-17 06:37:37 -04:00
2026-06-18 04:59:52 -04:00
2026-06-18 05:01:29 -04:00
2026-06-18 05:24:18 -04:00
2026-06-18 08:47:12 -04:00
2026-06-18 09:07:33 -04:00
2026-06-18 09:24:35 -04:00
2026-06-18 13:30:01 -04:00
2026-06-18 13:31:10 -04:00
2026-06-18 14:02:47 -04:00
2026-06-18 12:59:51 -04:00
2026-06-18 13:00:54 -04:00
2026-06-18 13:14:50 -04:00
2026-06-18 12:17:13 -04:00
2026-06-18 12:19:45 -04:00
2026-06-18 12:48:52 -04:00
2026-06-18 04:11:24 -04:00
2026-06-18 04:13:51 -04:00
2026-06-18 04:35:14 -04:00
2026-06-18 11:26:09 -04:00
2026-06-18 11:29:58 -04:00
2026-06-18 12:02:15 -04:00
2026-06-18 05:55:58 -04:00
2026-06-18 06:00:01 -04:00
2026-06-18 06:19:47 -04:00
2026-06-18 02:30:58 -04:00
2026-06-18 02:34:45 -04:00
2026-06-18 02:54:20 -04:00
2026-07-13 09:53:01 -04:00
2026-06-19 00:23:32 -04:00
2026-06-19 00:26:30 -04:00
2026-06-19 00:54:32 -04:00
2026-06-19 01:19:37 -04:00
2026-06-19 01:19:37 -04:00
2026-07-07 11:46:02 -04:00
2026-06-25 16:41:42 -04:00
2026-06-25 17:04:44 -04:00
2026-06-26 09:11:40 -04:00
2026-06-26 15:19:46 -04:00
2026-06-26 15:19:46 -04:00
2026-06-26 09:11:40 -04:00
2026-06-26 09:11:40 -04:00
2026-06-26 15:19:46 -04:00
2026-06-26 15:19:46 -04:00
2026-06-26 15:19:46 -04:00
2026-06-26 16:09:29 -04:00
2026-07-25 15:34:31 -04:00
2026-06-26 16:09:29 -04:00
2026-07-13 09:53:01 -04:00
2026-06-27 02:00:09 -04:00
2026-07-15 16:54:09 -04:00
2026-07-15 16:50:30 -04:00
2026-07-24 13:17:44 -04:00
2026-07-15 16:54:09 -04:00
2026-07-15 16:54:09 -04:00
2026-07-25 15:34:31 -04:00
2026-07-15 16:54:09 -04:00
2026-07-15 16:50:30 -04:00
2026-07-25 16:07:53 -04:00
2026-07-15 17:42:42 -04:00
2026-07-15 18:14:03 -04:00
2026-07-15 18:14:03 -04:00
2026-07-15 22:05:19 -04:00
2026-07-15 16:50:30 -04:00
2026-07-15 16:50:30 -04:00
2026-07-15 16:50:30 -04:00
2026-07-15 16:50:30 -04:00
2026-07-15 16:50:30 -04:00
2026-07-16 05:27:31 -04:00
2026-07-16 07:38:20 -04:00
2026-07-26 09:06:39 -04:00
2026-07-17 16:07:55 -04:00
2026-07-20 10:18:01 -04:00
2026-07-20 23:15:21 -04:00
2026-07-21 03:46:56 -04:00
2026-07-21 06:13:01 -04:00
2026-07-21 02:14:00 -04:00
2026-07-20 21:45:35 -04:00
2026-07-20 10:46:07 -04:00
2026-07-21 06:18:57 -04:00
2026-07-21 05:03:57 -04:00
2026-07-21 03:27:54 -04:00
2026-07-21 02:40:14 -04:00
2026-07-24 03:02:35 -04:00
2026-07-22 09:07:29 -04:00
2026-07-22 09:07:48 -04:00
2026-07-22 09:07:29 -04:00
2026-07-22 18:40:42 -04:00
2026-07-22 18:40:42 -04:00
2026-07-22 18:40:42 -04:00
2026-07-22 19:00:36 -04:00
2026-07-22 20:48:58 -04:00
2026-07-22 20:48:58 -04:00
2026-07-24 08:01:26 -04:00
2026-07-22 10:37:37 -04:00
2026-07-22 07:46:02 -04:00
2026-07-22 07:19:34 -04:00
2026-07-23 12:06:42 -04:00
2026-07-23 14:03:28 -04:00
2026-07-23 14:03:28 -04:00
2026-07-23 14:56:20 -04:00
2026-07-23 17:11:52 -04:00
2026-07-23 17:11:52 -04:00
2026-07-27 13:31:39 -04:00
2026-07-24 07:08:52 -04:00
2026-07-24 02:39:08 -04:00
2026-07-24 07:08:52 -04:00
2026-07-24 08:35:16 -04:00
2026-07-24 13:17:44 -04:00
2026-07-24 13:17:44 -04:00
2026-07-24 13:17:44 -04:00
2026-07-24 13:17:44 -04:00
2026-07-27 13:57:46 -04:00
2026-07-24 13:17:44 -04:00
2026-07-24 13:17:44 -04:00
2026-07-24 13:17:44 -04:00
2026-07-15 15:23:32 -04:00
2026-07-15 15:23:32 -04:00
2026-05-31 09:59:01 -04:00
2026-05-18 04:53:36 -04:00
2026-05-18 04:53:36 -04:00
2026-05-18 04:53:36 -04:00