mirror of
				https://github.com/alexandrebobkov/ESP-Nodes.git
				synced 2025-10-27 07:08:52 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			174 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			174 lines
		
	
	
		
			9.7 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
| <!DOCTYPE html>
 | ||
| 
 | ||
| <html lang="en" data-content_root="./">
 | ||
|   <head>
 | ||
|     <meta charset="utf-8" />
 | ||
|     <meta name="viewport" content="width=device-width, initial-scale=1.0" /><meta name="viewport" content="width=device-width, initial-scale=1" />
 | ||
| 
 | ||
|     <title>3. DATA STRUCTS — Byte Rider 06-2025 documentation</title>
 | ||
|     <link rel="stylesheet" type="text/css" href="_static/pygments.css?v=5ecbeea2" />
 | ||
|     <link rel="stylesheet" type="text/css" href="_static/basic.css?v=b08954a9" />
 | ||
|     <link rel="stylesheet" type="text/css" href="_static/alabaster.css?v=27fed22d" />
 | ||
|     <script src="_static/documentation_options.js?v=e6ef2064"></script>
 | ||
|     <script src="_static/doctools.js?v=9bcbadda"></script>
 | ||
|     <script src="_static/sphinx_highlight.js?v=dc90522c"></script>
 | ||
|     <link rel="index" title="Index" href="genindex.html" />
 | ||
|     <link rel="search" title="Search" href="search.html" />
 | ||
|     <link rel="next" title="4. TRANSMITTER" href="transmitter.html" />
 | ||
|     <link rel="prev" title="2. HOW DOES IT WORK?" href="overview.html" />
 | ||
|    
 | ||
|   <link rel="stylesheet" href="_static/custom.css" type="text/css" />
 | ||
|   
 | ||
| 
 | ||
|   
 | ||
|   
 | ||
| 
 | ||
|   </head><body>
 | ||
|   
 | ||
| 
 | ||
|     <div class="document">
 | ||
|       <div class="documentwrapper">
 | ||
|         <div class="bodywrapper">
 | ||
|           
 | ||
| 
 | ||
|           <div class="body" role="main">
 | ||
|             
 | ||
|   <section id="data-structs">
 | ||
| <h1><span class="section-number">3. </span>DATA STRUCTS<a class="headerlink" href="#data-structs" title="Link to this heading">¶</a></h1>
 | ||
| <p>The struct serves as the data payload for sending control signals from the transmitting device to the receiver using ESP-NOW.
 | ||
| In addition, it may contain additional data such as telemetry, battery status, etc. The <em>sensors_data_t</em> struct encapsulates all control commands and sensor states
 | ||
| relevant to the vehicle’s operation. It’s intended to be sent from a transmitting device (like a remote control) to a receiver
 | ||
| (such as a microcontroller on board of the vehicle).</p>
 | ||
| <div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">typedef</span><span class="w"> </span><span class="k">struct</span><span class="w"> </span><span class="p">{</span>
 | ||
| <span class="w">    </span><span class="kt">int</span><span class="w">         </span><span class="n">x_axis</span><span class="p">;</span><span class="w">             </span><span class="c1">// Joystick x-position</span>
 | ||
| <span class="w">    </span><span class="kt">int</span><span class="w">         </span><span class="n">y_axis</span><span class="p">;</span><span class="w">             </span><span class="c1">// Joystick y-position</span>
 | ||
| <span class="w">    </span><span class="kt">bool</span><span class="w">        </span><span class="n">nav_bttn</span><span class="p">;</span><span class="w">           </span><span class="c1">// Joystick push button</span>
 | ||
| <span class="w">    </span><span class="kt">bool</span><span class="w">        </span><span class="n">led</span><span class="p">;</span><span class="w">                </span><span class="c1">// LED ON/OFF state</span>
 | ||
| <span class="w">    </span><span class="kt">uint8_t</span><span class="w">     </span><span class="n">motor1_rpm_pwm</span><span class="p">;</span><span class="w">     </span><span class="c1">// PWMs for 4 DC motors</span>
 | ||
| <span class="w">    </span><span class="kt">uint8_t</span><span class="w">     </span><span class="n">motor2_rpm_pwm</span><span class="p">;</span>
 | ||
| <span class="w">    </span><span class="kt">uint8_t</span><span class="w">     </span><span class="n">motor3_rpm_pwm</span><span class="p">;</span>
 | ||
| <span class="w">    </span><span class="kt">uint8_t</span><span class="w">     </span><span class="n">motor4_rpm_pwm</span><span class="p">;</span>
 | ||
| <span class="p">}</span><span class="w"> </span><span class="n">__attribute__</span><span class="p">((</span><span class="n">packed</span><span class="p">))</span><span class="w"> </span><span class="n">sensors_data_t</span><span class="p">;</span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <div class="highlight-c notranslate"><div class="highlight"><pre><span></span><span class="k">struct</span><span class="w"> </span><span class="nc">motors_rpm</span><span class="w"> </span><span class="p">{</span>
 | ||
| <span class="w">    </span><span class="kt">int</span><span class="w"> </span><span class="n">motor1_rpm_pwm</span><span class="p">;</span>
 | ||
| <span class="w">    </span><span class="kt">int</span><span class="w"> </span><span class="n">motor2_rpm_pwm</span><span class="p">;</span>
 | ||
| <span class="w">    </span><span class="kt">int</span><span class="w"> </span><span class="n">motor3_rpm_pwm</span><span class="p">;</span>
 | ||
| <span class="w">    </span><span class="kt">int</span><span class="w"> </span><span class="n">motor4_rpm_pwm</span><span class="p">;</span>
 | ||
| <span class="p">};</span>
 | ||
| </pre></div>
 | ||
| </div>
 | ||
| <p>When used with communication protocols like ESP-NOW, this struct is <strong>encoded</strong> into a byte stream, then
 | ||
| <strong>transmitted</strong> at regular intervals or in response to user input, and finally
 | ||
| <strong>decoded</strong> on the receiving end to control hardware.</p>
 | ||
| <div class="admonition-what-is-struct admonition">
 | ||
| <p class="admonition-title">What is struct?</p>
 | ||
| <p>In C programming, a struct (short for structure) is a user-defined data type that lets you group multiple variables of different types together under a
 | ||
| single name. It’s like a container that holds related information — perfect for organizing data that logically belongs together. Structs are especially
 | ||
| powerful in systems programming, embedded projects, and when dealing with raw binary data — like parsing sensor input or transmitting control packets over
 | ||
| ESP-NOW.</p>
 | ||
| </div>
 | ||
| <section id="data-payload">
 | ||
| <h2><span class="section-number">3.1. </span>Data Payload<a class="headerlink" href="#data-payload" title="Link to this heading">¶</a></h2>
 | ||
| <p><em>x_axis</em> and <em>y_axis</em> fields capture analog input from a joystick, determining direction and speed.
 | ||
| <em>nav_bttn</em> represents a joystick push-button.</p>
 | ||
| <p><em>led</em> allows the transmitter to toggle an onboard LED and is used for status indication (e.g. pairing, battery warning, etc).</p>
 | ||
| <p><em>motor1_rpm_pwm</em> to <em>motor4_rpm_pwm</em> provide individual PWM signals to four DC motors.
 | ||
| This enables fine-grained speed control, supports differential drive configurations, and even allows for maneuvering in multi-directional platforms like omni-wheel robots.</p>
 | ||
| <section id="why-use-attribute-packed">
 | ||
| <h3><span class="section-number">3.1.1. </span>Why use __attribute((packed))?<a class="headerlink" href="#why-use-attribute-packed" title="Link to this heading">¶</a></h3>
 | ||
| <p>ESP-NOW uses fixed-size data packets (up to 250 bytes). The <em>__attribute__((packed))</em> removes compiler-added padding for precise byte alignment.</p>
 | ||
| <p>As <em>packed</em> attribute tells the compiler not to add any padding between fields in memory, this makes the struct:</p>
 | ||
| <blockquote>
 | ||
| <div><ul class="simple">
 | ||
| <li><p>Compact</p></li>
 | ||
| <li><p>Predictable for serialization over protocols like UART or ESP-NOW</p></li>
 | ||
| <li><p>Ideal for low-latency transmission in embedded systems</p></li>
 | ||
| </ul>
 | ||
| </div></blockquote>
 | ||
| <p>This ensures the receiver interprets the exact byte layout you expect, minimizing bandwidth and maximizing compatibility across platforms.</p>
 | ||
| </section>
 | ||
| </section>
 | ||
| </section>
 | ||
| 
 | ||
| 
 | ||
|           </div>
 | ||
|           
 | ||
|         </div>
 | ||
|       </div>
 | ||
|       <div class="sphinxsidebar" role="navigation" aria-label="Main">
 | ||
|         <div class="sphinxsidebarwrapper">
 | ||
| <h1 class="logo"><a href="index.html">Byte Rider</a></h1>
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| <search id="searchbox" style="display: none" role="search">
 | ||
|     <div class="searchformwrapper">
 | ||
|     <form class="search" action="search.html" method="get">
 | ||
|       <input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" placeholder="Search"/>
 | ||
|       <input type="submit" value="Go" />
 | ||
|     </form>
 | ||
|     </div>
 | ||
| </search>
 | ||
| <script>document.getElementById('searchbox').style.display = "block"</script><h3>Navigation</h3>
 | ||
| <ul class="current">
 | ||
| <li class="toctree-l1"><a class="reference internal" href="intro.html">1. OVERVIEW</a></li>
 | ||
| <li class="toctree-l1"><a class="reference internal" href="overview.html">2. HOW DOES IT WORK?</a></li>
 | ||
| <li class="toctree-l1 current"><a class="current reference internal" href="#">3. DATA STRUCTS</a><ul>
 | ||
| <li class="toctree-l2"><a class="reference internal" href="#data-payload">3.1. Data Payload</a><ul>
 | ||
| <li class="toctree-l3"><a class="reference internal" href="#why-use-attribute-packed">3.1.1. Why use __attribute((packed))?</a></li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| </ul>
 | ||
| </li>
 | ||
| <li class="toctree-l1"><a class="reference internal" href="transmitter.html">4. TRANSMITTER</a></li>
 | ||
| <li class="toctree-l1"><a class="reference internal" href="receiver.html">5. RECEIVER</a></li>
 | ||
| <li class="toctree-l1"><a class="reference internal" href="progress.html">6. WORK-IN-PROGRESS WALK THROUGH</a></li>
 | ||
| <li class="toctree-l1"><a class="reference internal" href="references.html">7. REFERENCES</a></li>
 | ||
| </ul>
 | ||
| 
 | ||
| <div class="relations">
 | ||
| <h3>Related Topics</h3>
 | ||
| <ul>
 | ||
|   <li><a href="index.html">Documentation overview</a><ul>
 | ||
|       <li>Previous: <a href="overview.html" title="previous chapter"><span class="section-number">2. </span>HOW DOES IT WORK?</a></li>
 | ||
|       <li>Next: <a href="transmitter.html" title="next chapter"><span class="section-number">4. </span>TRANSMITTER</a></li>
 | ||
|   </ul></li>
 | ||
| </ul>
 | ||
| </div>
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
| 
 | ||
|         </div>
 | ||
|       </div>
 | ||
|       <div class="clearer"></div>
 | ||
|     </div>
 | ||
|     <div class="footer">
 | ||
|       ©2025, Alexander B.
 | ||
|       
 | ||
|       |
 | ||
|       Powered by <a href="https://www.sphinx-doc.org/">Sphinx 8.2.3</a>
 | ||
|       & <a href="https://alabaster.readthedocs.io">Alabaster 1.0.0</a>
 | ||
|       
 | ||
|       |
 | ||
|       <a href="_sources/data.rst.txt"
 | ||
|           rel="nofollow">Page source</a>
 | ||
|     </div>
 | ||
| 
 | ||
|     
 | ||
| 
 | ||
|     
 | ||
|   </body>
 | ||
| </html> |