<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>http://groupkos.com/dev/index.php?action=history&amp;feed=atom&amp;title=ESP32_Packet_Format_%26_DataNet_Protocol</id>
	<title>ESP32 Packet Format &amp; DataNet Protocol - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://groupkos.com/dev/index.php?action=history&amp;feed=atom&amp;title=ESP32_Packet_Format_%26_DataNet_Protocol"/>
	<link rel="alternate" type="text/html" href="http://groupkos.com/dev/index.php?title=ESP32_Packet_Format_%26_DataNet_Protocol&amp;action=history"/>
	<updated>2026-04-18T14:05:32Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.39.3</generator>
	<entry>
		<id>http://groupkos.com/dev/index.php?title=ESP32_Packet_Format_%26_DataNet_Protocol&amp;diff=5240&amp;oldid=prev</id>
		<title>XenoEngineer at 16:10, 28 June 2025</title>
		<link rel="alternate" type="text/html" href="http://groupkos.com/dev/index.php?title=ESP32_Packet_Format_%26_DataNet_Protocol&amp;diff=5240&amp;oldid=prev"/>
		<updated>2025-06-28T16:10:03Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:10, 28 June 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{menuDataNet}}&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;{{menuDataNet}}&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&amp;lt;br style=&amp;quot;clear:both;&amp;quot;/&amp;gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-added&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;head&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;head&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>XenoEngineer</name></author>
	</entry>
	<entry>
		<id>http://groupkos.com/dev/index.php?title=ESP32_Packet_Format_%26_DataNet_Protocol&amp;diff=5234&amp;oldid=prev</id>
		<title>XenoEngineer at 15:55, 28 June 2025</title>
		<link rel="alternate" type="text/html" href="http://groupkos.com/dev/index.php?title=ESP32_Packet_Format_%26_DataNet_Protocol&amp;diff=5234&amp;oldid=prev"/>
		<updated>2025-06-28T15:55:34Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 15:55, 28 June 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l1&quot;&gt;Line 1:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 1:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Category:dataNet]]&lt;/del&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;{{menuDataNet}}&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt; &lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>XenoEngineer</name></author>
	</entry>
	<entry>
		<id>http://groupkos.com/dev/index.php?title=ESP32_Packet_Format_%26_DataNet_Protocol&amp;diff=5232&amp;oldid=prev</id>
		<title>XenoEngineer: Created page with &quot;Category:dataNet  &lt;html lang=&quot;en&quot;&gt; &lt;head&gt;     &lt;meta charset=&quot;UTF-8&quot;&gt;     &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;     &lt;title&gt;ESP32 Packet Format &amp; Protocol Details&lt;/title&gt;     &lt;style&gt;         body {             font-family: &#039;Segoe UI&#039;, Tahoma, Geneva, Verdana, sans-serif;             margin: 0;             padding: 20px;             background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%);             min-height: 100vh;...&quot;</title>
		<link rel="alternate" type="text/html" href="http://groupkos.com/dev/index.php?title=ESP32_Packet_Format_%26_DataNet_Protocol&amp;diff=5232&amp;oldid=prev"/>
		<updated>2025-06-28T15:51:26Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&lt;a href=&quot;/dev/index.php/Category:DataNet&quot; title=&quot;Category:DataNet&quot;&gt;Category:dataNet&lt;/a&gt;  &amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt; &amp;lt;head&amp;gt;     &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;     &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;     &amp;lt;title&amp;gt;ESP32 Packet Format &amp;amp; Protocol Details&amp;lt;/title&amp;gt;     &amp;lt;style&amp;gt;         body {             font-family: &amp;#039;Segoe UI&amp;#039;, Tahoma, Geneva, Verdana, sans-serif;             margin: 0;             padding: 20px;             background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%);             min-height: 100vh;...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:dataNet]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;html lang=&amp;quot;en&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;head&amp;gt;&lt;br /&gt;
    &amp;lt;meta charset=&amp;quot;UTF-8&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;meta name=&amp;quot;viewport&amp;quot; content=&amp;quot;width=device-width, initial-scale=1.0&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;title&amp;gt;ESP32 Packet Format &amp;amp; Protocol Details&amp;lt;/title&amp;gt;&lt;br /&gt;
    &amp;lt;style&amp;gt;&lt;br /&gt;
        body {&lt;br /&gt;
            font-family: &amp;#039;Segoe UI&amp;#039;, Tahoma, Geneva, Verdana, sans-serif;&lt;br /&gt;
            margin: 0;&lt;br /&gt;
            padding: 20px;&lt;br /&gt;
            background: linear-gradient(135deg, #2c3e50 0%, #34495e 100%);&lt;br /&gt;
            min-height: 100vh;&lt;br /&gt;
            color: #333;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .container {&lt;br /&gt;
            max-width: 1400px;&lt;br /&gt;
            margin: 0 auto;&lt;br /&gt;
            background: rgba(255, 255, 255, 0.95);&lt;br /&gt;
            backdrop-filter: blur(10px);&lt;br /&gt;
            border-radius: 20px;&lt;br /&gt;
            padding: 30px;&lt;br /&gt;
            box-shadow: 0 20px 40px rgba(0,0,0,0.1);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        h1 {&lt;br /&gt;
            text-align: center;&lt;br /&gt;
            color: #2c3e50;&lt;br /&gt;
            margin-bottom: 30px;&lt;br /&gt;
            font-size: 2.5em;&lt;br /&gt;
            text-shadow: 2px 2px 4px rgba(0,0,0,0.1);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .packet-visual {&lt;br /&gt;
            background: #f8f9fa;&lt;br /&gt;
            border-radius: 15px;&lt;br /&gt;
            padding: 30px;&lt;br /&gt;
            margin: 30px 0;&lt;br /&gt;
            border: 2px solid #e9ecef;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .packet-title {&lt;br /&gt;
            font-size: 1.8em;&lt;br /&gt;
            color: #2c3e50;&lt;br /&gt;
            margin-bottom: 25px;&lt;br /&gt;
            text-align: center;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .packet-structure {&lt;br /&gt;
            display: grid;&lt;br /&gt;
            grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));&lt;br /&gt;
            gap: 10px;&lt;br /&gt;
            margin: 20px 0;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .packet-field {&lt;br /&gt;
            background: linear-gradient(145deg, #667eea, #764ba2);&lt;br /&gt;
            color: white;&lt;br /&gt;
            padding: 15px;&lt;br /&gt;
            border-radius: 10px;&lt;br /&gt;
            text-align: center;&lt;br /&gt;
            font-weight: bold;&lt;br /&gt;
            transition: transform 0.3s ease;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .packet-field:hover {&lt;br /&gt;
            transform: scale(1.05);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .field-name {&lt;br /&gt;
            font-size: 0.9em;&lt;br /&gt;
            margin-bottom: 5px;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .field-size {&lt;br /&gt;
            font-size: 1.2em;&lt;br /&gt;
            color: #fff;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .field-description {&lt;br /&gt;
            font-size: 0.8em;&lt;br /&gt;
            margin-top: 5px;&lt;br /&gt;
            opacity: 0.9;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .protocol-section {&lt;br /&gt;
            background: white;&lt;br /&gt;
            border-radius: 15px;&lt;br /&gt;
            padding: 25px;&lt;br /&gt;
            margin: 25px 0;&lt;br /&gt;
            box-shadow: 0 5px 15px rgba(0,0,0,0.1);&lt;br /&gt;
            border-left: 5px solid #3498db;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .code-block {&lt;br /&gt;
            background: #2c3e50;&lt;br /&gt;
            color: #ecf0f1;&lt;br /&gt;
            padding: 20px;&lt;br /&gt;
            border-radius: 10px;&lt;br /&gt;
            font-family: &amp;#039;Courier New&amp;#039;, monospace;&lt;br /&gt;
            overflow-x: auto;&lt;br /&gt;
            margin: 15px 0;&lt;br /&gt;
            position: relative;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .code-block::before {&lt;br /&gt;
            content: attr(data-lang);&lt;br /&gt;
            position: absolute;&lt;br /&gt;
            top: 5px;&lt;br /&gt;
            right: 10px;&lt;br /&gt;
            font-size: 0.8em;&lt;br /&gt;
            color: #bdc3c7;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .highlight {&lt;br /&gt;
            background: rgba(52, 152, 219, 0.3);&lt;br /&gt;
            padding: 2px 4px;&lt;br /&gt;
            border-radius: 3px;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .timing-diagram {&lt;br /&gt;
            background: #e8f5e8;&lt;br /&gt;
            border-radius: 15px;&lt;br /&gt;
            padding: 25px;&lt;br /&gt;
            margin: 25px 0;&lt;br /&gt;
            text-align: center;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .timing-sequence {&lt;br /&gt;
            display: flex;&lt;br /&gt;
            justify-content: space-around;&lt;br /&gt;
            align-items: center;&lt;br /&gt;
            flex-wrap: wrap;&lt;br /&gt;
            gap: 15px;&lt;br /&gt;
            margin: 20px 0;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .timing-step {&lt;br /&gt;
            background: white;&lt;br /&gt;
            padding: 15px;&lt;br /&gt;
            border-radius: 10px;&lt;br /&gt;
            box-shadow: 0 3px 10px rgba(0,0,0,0.1);&lt;br /&gt;
            min-width: 100px;&lt;br /&gt;
            font-size: 0.9em;&lt;br /&gt;
            text-align: center;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .timing-arrow {&lt;br /&gt;
            font-size: 1.5em;&lt;br /&gt;
            color: #27ae60;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .register-map {&lt;br /&gt;
            display: grid;&lt;br /&gt;
            grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));&lt;br /&gt;
            gap: 20px;&lt;br /&gt;
            margin: 20px 0;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .register-item {&lt;br /&gt;
            background: linear-gradient(145deg, #ffffff, #f0f0f0);&lt;br /&gt;
            border-radius: 10px;&lt;br /&gt;
            padding: 20px;&lt;br /&gt;
            box-shadow: 0 5px 15px rgba(0,0,0,0.1);&lt;br /&gt;
            border-left: 4px solid #e74c3c;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .register-addr {&lt;br /&gt;
            font-weight: bold;&lt;br /&gt;
            color: #e74c3c;&lt;br /&gt;
            font-size: 1.1em;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .register-desc {&lt;br /&gt;
            color: #555;&lt;br /&gt;
            margin-top: 8px;&lt;br /&gt;
            line-height: 1.4;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .data-format {&lt;br /&gt;
            background: #fff3cd;&lt;br /&gt;
            border: 1px solid #ffeaa7;&lt;br /&gt;
            border-radius: 10px;&lt;br /&gt;
            padding: 20px;&lt;br /&gt;
            margin: 20px 0;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .format-table {&lt;br /&gt;
            width: 100%;&lt;br /&gt;
            border-collapse: collapse;&lt;br /&gt;
            margin-top: 15px;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .format-table th, .format-table td {&lt;br /&gt;
            border: 1px solid #ddd;&lt;br /&gt;
            padding: 12px;&lt;br /&gt;
            text-align: left;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .format-table th {&lt;br /&gt;
            background: #f8f9fa;&lt;br /&gt;
            font-weight: bold;&lt;br /&gt;
            color: #2c3e50;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        .format-table tr:nth-child(even) {&lt;br /&gt;
            background: #f8f9fa;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        @media (max-width: 768px) {&lt;br /&gt;
            .timing-sequence {&lt;br /&gt;
                flex-direction: column;&lt;br /&gt;
            }&lt;br /&gt;
            .timing-arrow {&lt;br /&gt;
                transform: rotate(90deg);&lt;br /&gt;
            }&lt;br /&gt;
            .packet-structure {&lt;br /&gt;
                grid-template-columns: 1fr;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    &amp;lt;/style&amp;gt;&lt;br /&gt;
&amp;lt;/head&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;h1&amp;gt;📡 ESP32 Packet Format &amp;amp; Protocol Details&amp;lt;/h1&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;packet-visual&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;packet-title&amp;quot;&amp;gt;🔗 Event Data Packet Structure&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;packet-structure&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;packet-field&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-name&amp;quot;&amp;gt;HEADER&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-size&amp;quot;&amp;gt;2 bytes&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-description&amp;quot;&amp;gt;Magic: 0xABCD&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;packet-field&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-name&amp;quot;&amp;gt;PACKET_ID&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-size&amp;quot;&amp;gt;2 bytes&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-description&amp;quot;&amp;gt;Sequence number&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;packet-field&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-name&amp;quot;&amp;gt;ON_TIMESTAMP&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-size&amp;quot;&amp;gt;4 bytes&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-description&amp;quot;&amp;gt;Microseconds&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;packet-field&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-name&amp;quot;&amp;gt;OFF_TIMESTAMP&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-size&amp;quot;&amp;gt;4 bytes&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-description&amp;quot;&amp;gt;Microseconds&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;packet-field&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-name&amp;quot;&amp;gt;EVENT_COUNT&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-size&amp;quot;&amp;gt;4 bytes&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-description&amp;quot;&amp;gt;Binary counter&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;packet-field&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-name&amp;quot;&amp;gt;CHECKSUM&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-size&amp;quot;&amp;gt;2 bytes&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;field-description&amp;quot;&amp;gt;CRC16&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;p style=&amp;quot;text-align: center; color: #7f8c8d; margin-top: 20px;&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;strong&amp;gt;Total packet size: 18 bytes&amp;lt;/strong&amp;gt; | Block size: 10-100 packets (180-1800 bytes)&lt;br /&gt;
            &amp;lt;/p&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;protocol-section&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;h3&amp;gt;🚀 ESP32 Firmware Event Capture&amp;lt;/h3&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;code-block&amp;quot; data-lang=&amp;quot;C++&amp;quot;&amp;gt;&lt;br /&gt;
// ESP32 Interrupt Handler for Binary Input&lt;br /&gt;
volatile uint32_t on_timestamp = 0;&lt;br /&gt;
volatile bool waiting_for_off = false;&lt;br /&gt;
EventPacket event_buffer[BLOCK_SIZE];&lt;br /&gt;
volatile int buffer_index = 0;&lt;br /&gt;
&lt;br /&gt;
void IRAM_ATTR binary_input_isr() {&lt;br /&gt;
    uint32_t current_time = esp_timer_get_time(); // microseconds&lt;br /&gt;
    &lt;br /&gt;
    if (digitalRead(BINARY_INPUT_PIN) == HIGH) {&lt;br /&gt;
        // Rising edge - store ON timestamp&lt;br /&gt;
        on_timestamp = current_time;&lt;br /&gt;
        waiting_for_off = true;&lt;br /&gt;
    } &lt;br /&gt;
    else if (waiting_for_off) {&lt;br /&gt;
        // Falling edge - capture complete event&lt;br /&gt;
        EventPacket* packet = &amp;amp;event_buffer[buffer_index];&lt;br /&gt;
        &lt;br /&gt;
        packet-&amp;gt;header = 0xABCD;&lt;br /&gt;
        packet-&amp;gt;packet_id = ++sequence_counter;&lt;br /&gt;
        packet-&amp;gt;on_timestamp = on_timestamp;&lt;br /&gt;
        packet-&amp;gt;off_timestamp = current_time;&lt;br /&gt;
        packet-&amp;gt;event_count = read_binary_counter(); // Sample counter NOW&lt;br /&gt;
        packet-&amp;gt;checksum = calculate_crc16(packet);&lt;br /&gt;
        &lt;br /&gt;
        buffer_index++;&lt;br /&gt;
        waiting_for_off = false;&lt;br /&gt;
        &lt;br /&gt;
        // Check if block is full&lt;br /&gt;
        if (buffer_index &amp;gt;= BLOCK_SIZE) {&lt;br /&gt;
            xQueueSendFromISR(transmit_queue, &amp;amp;event_buffer, NULL);&lt;br /&gt;
            buffer_index = 0; // Reset for next block&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;timing-diagram&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;packet-title&amp;quot;&amp;gt;⏱️ Event Capture Timing Sequence&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;timing-sequence&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-step&amp;quot;&amp;gt;Binary Input&amp;lt;br&amp;gt;HIGH&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-arrow&amp;quot;&amp;gt;→&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-step&amp;quot;&amp;gt;Store&amp;lt;br&amp;gt;ON timestamp&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-arrow&amp;quot;&amp;gt;→&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-step&amp;quot;&amp;gt;Binary Input&amp;lt;br&amp;gt;LOW&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-arrow&amp;quot;&amp;gt;→&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-step&amp;quot;&amp;gt;Capture&amp;lt;br&amp;gt;OFF timestamp&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-arrow&amp;quot;&amp;gt;→&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-step&amp;quot;&amp;gt;Sample&amp;lt;br&amp;gt;Counter&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-arrow&amp;quot;&amp;gt;→&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-step&amp;quot;&amp;gt;Store&amp;lt;br&amp;gt;Event Packet&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-arrow&amp;quot;&amp;gt;→&amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;timing-step&amp;quot;&amp;gt;Block Full?&amp;lt;br&amp;gt;Transmit&amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;protocol-section&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;h3&amp;gt;📤 Block Transmission Protocol (UDP)&amp;lt;/h3&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;data-format&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;strong&amp;gt;Block Header Format:&amp;lt;/strong&amp;gt;&lt;br /&gt;
                &amp;lt;table class=&amp;quot;format-table&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Field&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Size&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Description&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Example&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Block Magic&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4 bytes&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0xDEADBEEF&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Block identifier&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Block ID&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4 bytes&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Sequential&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;0x00000001&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Packet Count&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;2 bytes&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Events in block&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;50&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Timestamp Base&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4 bytes&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Block start time&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;System uptime&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Event Packets&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;N * 18 bytes&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Event data array&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Variable&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                    &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Block CRC&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;4 bytes&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;Integrity check&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;CRC32&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;
                &amp;lt;/table&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;protocol-section&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;h3&amp;gt;⚙️ Control Register Map&amp;lt;/h3&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;register-map&amp;quot;&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;register-item&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-addr&amp;quot;&amp;gt;0x1000 - CONTROL_MODE&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-desc&amp;quot;&amp;gt;&lt;br /&gt;
                        Bit 0: Enable event capture&amp;lt;br&amp;gt;&lt;br /&gt;
                        Bit 1: Reset counter&amp;lt;br&amp;gt;&lt;br /&gt;
                        Bit 2: Trigger calibration&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;register-item&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-addr&amp;quot;&amp;gt;0x1004 - BLOCK_SIZE&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-desc&amp;quot;&amp;gt;&lt;br /&gt;
                        Number of events per transmission block (10-100)&amp;lt;br&amp;gt;&lt;br /&gt;
                        Default: 25 events&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;register-item&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-addr&amp;quot;&amp;gt;0x1008 - THRESHOLD_VALUE&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-desc&amp;quot;&amp;gt;&lt;br /&gt;
                        Digital input threshold voltage (mV)&amp;lt;br&amp;gt;&lt;br /&gt;
                        For add-on board signal conditioning&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;register-item&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-addr&amp;quot;&amp;gt;0x100C - COUNTER_PRESCALER&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-desc&amp;quot;&amp;gt;&lt;br /&gt;
                        Binary counter clock divider&amp;lt;br&amp;gt;&lt;br /&gt;
                        Controls counting resolution&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;register-item&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-addr&amp;quot;&amp;gt;0x1010 - STATUS_FLAGS&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-desc&amp;quot;&amp;gt;&lt;br /&gt;
                        Bit 0: Buffer overflow&amp;lt;br&amp;gt;&lt;br /&gt;
                        Bit 1: WiFi connected&amp;lt;br&amp;gt;&lt;br /&gt;
                        Bit 2: Counter running&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;div class=&amp;quot;register-item&amp;quot;&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-addr&amp;quot;&amp;gt;0x1014 - DEBUG_OUTPUT&amp;lt;/div&amp;gt;&lt;br /&gt;
                    &amp;lt;div class=&amp;quot;register-desc&amp;quot;&amp;gt;&lt;br /&gt;
                        Test signal generation&amp;lt;br&amp;gt;&lt;br /&gt;
                        For add-on board verification&lt;br /&gt;
                    &amp;lt;/div&amp;gt;&lt;br /&gt;
                &amp;lt;/div&amp;gt;&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;protocol-section&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;h3&amp;gt;🔄 PC ↔ ESP32 Communication Protocol&amp;lt;/h3&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;code-block&amp;quot; data-lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Python Device Communication Service&lt;br /&gt;
import socket&lt;br /&gt;
import struct&lt;br /&gt;
import asyncio&lt;br /&gt;
&lt;br /&gt;
class ESP32Protocol:&lt;br /&gt;
    def __init__(self, esp32_ip, port=8888):&lt;br /&gt;
        self.esp32_ip = esp32_ip&lt;br /&gt;
        self.port = port&lt;br /&gt;
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)&lt;br /&gt;
        &lt;br /&gt;
    def write_register(self, address, value):&lt;br /&gt;
        # Command format: [CMD][ADDR][VALUE]&lt;br /&gt;
        packet = struct.pack(&amp;#039;&amp;lt;BII&amp;#039;, 0x01, address, value)  # WRITE_CMD&lt;br /&gt;
        self.sock.sendto(packet, (self.esp32_ip, self.port))&lt;br /&gt;
        &lt;br /&gt;
    def read_register(self, address):&lt;br /&gt;
        # Command format: [CMD][ADDR]&lt;br /&gt;
        packet = struct.pack(&amp;#039;&amp;lt;BI&amp;#039;, 0x02, address)  # READ_CMD&lt;br /&gt;
        self.sock.sendto(packet, (self.esp32_ip, self.port))&lt;br /&gt;
        response, addr = self.sock.recvfrom(8)&lt;br /&gt;
        return struct.unpack(&amp;#039;&amp;lt;I&amp;#039;, response[4:])[0]  # Skip status bytes&lt;br /&gt;
        &lt;br /&gt;
    async def listen_for_events(self, callback):&lt;br /&gt;
        # Listen for event data blocks&lt;br /&gt;
        while True:&lt;br /&gt;
            data, addr = self.sock.recvfrom(2048)  # Max block size&lt;br /&gt;
            if len(data) &amp;gt;= 18:  # Minimum block header&lt;br /&gt;
                block = self.parse_event_block(data)&lt;br /&gt;
                await callback(block)&lt;br /&gt;
                &lt;br /&gt;
    def parse_event_block(self, data):&lt;br /&gt;
        # Parse block header&lt;br /&gt;
        magic, block_id, count, timestamp_base = struct.unpack(&amp;#039;&amp;lt;IIHH&amp;#039;, data[:12])&lt;br /&gt;
        &lt;br /&gt;
        events = []&lt;br /&gt;
        offset = 16  # Skip block header&lt;br /&gt;
        &lt;br /&gt;
        for i in range(count):&lt;br /&gt;
            if offset + 18 &amp;lt;= len(data):&lt;br /&gt;
                # Parse event packet&lt;br /&gt;
                header, pkt_id, on_time, off_time, counter, crc = \&lt;br /&gt;
                    struct.unpack(&amp;#039;&amp;lt;HHIIII&amp;#039;, data[offset:offset+18])&lt;br /&gt;
                &lt;br /&gt;
                events.append({&lt;br /&gt;
                    &amp;#039;packet_id&amp;#039;: pkt_id,&lt;br /&gt;
                    &amp;#039;on_timestamp&amp;#039;: on_time,&lt;br /&gt;
                    &amp;#039;off_timestamp&amp;#039;: off_time,&lt;br /&gt;
                    &amp;#039;pulse_width&amp;#039;: off_time - on_time,  # Calculate immediately&lt;br /&gt;
                    &amp;#039;event_count&amp;#039;: counter,&lt;br /&gt;
                    &amp;#039;block_id&amp;#039;: block_id&lt;br /&gt;
                })&lt;br /&gt;
                offset += 18&lt;br /&gt;
                &lt;br /&gt;
        return {&amp;#039;block_id&amp;#039;: block_id, &amp;#039;events&amp;#039;: events, &amp;#039;timestamp_base&amp;#039;: timestamp_base}&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
        &lt;br /&gt;
        &amp;lt;div class=&amp;quot;protocol-section&amp;quot;&amp;gt;&lt;br /&gt;
            &amp;lt;h3&amp;gt;📊 Analysis Service Data Processing&amp;lt;/h3&amp;gt;&lt;br /&gt;
            &amp;lt;div class=&amp;quot;code-block&amp;quot; data-lang=&amp;quot;Python&amp;quot;&amp;gt;&lt;br /&gt;
# Event Data Service - Pulse Analysis&lt;br /&gt;
import numpy as np&lt;br /&gt;
from collections import deque&lt;br /&gt;
&lt;br /&gt;
class PulseAnalyzer:&lt;br /&gt;
    def __init__(self, window_size=1000):&lt;br /&gt;
        self.pulse_widths = deque(maxlen=window_size)&lt;br /&gt;
        self.frequencies = deque(maxlen=window_size)&lt;br /&gt;
        self.counter_deltas = deque(maxlen=window_size)&lt;br /&gt;
        self.last_counter = 0&lt;br /&gt;
        &lt;br /&gt;
    def process_event_block(self, block):&lt;br /&gt;
        events = block[&amp;#039;events&amp;#039;]&lt;br /&gt;
        &lt;br /&gt;
        for event in events:&lt;br /&gt;
            # Calculate pulse characteristics&lt;br /&gt;
            pulse_width = event[&amp;#039;pulse_width&amp;#039;]  # microseconds&lt;br /&gt;
            counter_delta = event[&amp;#039;event_count&amp;#039;] - self.last_counter&lt;br /&gt;
            &lt;br /&gt;
            self.pulse_widths.append(pulse_width)&lt;br /&gt;
            self.counter_deltas.append(counter_delta)&lt;br /&gt;
            self.last_counter = event[&amp;#039;event_count&amp;#039;]&lt;br /&gt;
            &lt;br /&gt;
        # Calculate frequency from recent events&lt;br /&gt;
        if len(events) &amp;gt; 1:&lt;br /&gt;
            time_span = events[-1][&amp;#039;off_timestamp&amp;#039;] - events[0][&amp;#039;on_timestamp&amp;#039;]&lt;br /&gt;
            frequency = (len(events) - 1) * 1e6 / time_span  # Hz&lt;br /&gt;
            self.frequencies.append(frequency)&lt;br /&gt;
            &lt;br /&gt;
        # Return analysis results for UI feedback&lt;br /&gt;
        return {&lt;br /&gt;
            &amp;#039;avg_pulse_width&amp;#039;: np.mean(self.pulse_widths) if self.pulse_widths else 0,&lt;br /&gt;
            &amp;#039;frequency&amp;#039;: np.mean(self.frequencies) if self.frequencies else 0,&lt;br /&gt;
            &amp;#039;counter_rate&amp;#039;: np.mean(self.counter_deltas) if self.counter_deltas else 0,&lt;br /&gt;
            &amp;#039;pulse_jitter&amp;#039;: np.std(self.pulse_widths) if len(self.pulse_widths) &amp;gt; 1 else 0&lt;br /&gt;
        }&lt;br /&gt;
            &amp;lt;/div&amp;gt;&lt;br /&gt;
        &amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&lt;/div&gt;</summary>
		<author><name>XenoEngineer</name></author>
	</entry>
</feed>