<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.wowcube.com/index.php?action=history&amp;feed=atom&amp;title=SDK_6.3%2FRust%2Fcubios-sys</id>
	<title>SDK 6.3/Rust/cubios-sys - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.wowcube.com/index.php?action=history&amp;feed=atom&amp;title=SDK_6.3%2FRust%2Fcubios-sys"/>
	<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=SDK_6.3/Rust/cubios-sys&amp;action=history"/>
	<updated>2026-07-26T22:45:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.33.0</generator>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=SDK_6.3/Rust/cubios-sys&amp;diff=16980&amp;oldid=prev</id>
		<title>WowBot: Fix array-type signatures (WowBot)</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=SDK_6.3/Rust/cubios-sys&amp;diff=16980&amp;oldid=prev"/>
		<updated>2026-07-26T10:45:16Z</updated>

		<summary type="html">&lt;p&gt;Fix array-type signatures (WowBot)&lt;/p&gt;
&lt;table class=&quot;diff diff-contentalign-left&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: #222; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #222; text-align: center;&quot;&gt;Revision as of 10:45, 26 July 2026&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-l32&quot; &gt;Line 32:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 32:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;: Called every frame. `cur_time` is current time in ms, `delta_time` is ms since last tick.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;: Called every frame. `cur_time` is current time in ms, `delta_time` is ms since last tick.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; 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;; &amp;lt;code&amp;gt;Application::fn on_render(&amp;amp;mut self, screens: &amp;amp;mut [Screen&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;; &amp;lt;code&amp;gt;Application::fn on_render(&amp;amp;mut self, screens: &amp;amp;mut [Screen&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;; 3]) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&lt;/ins&gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;: Called to render the current frame. `screens` contains the 3 screens for this module.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;: Called to render the current frame. `screens` contains the 3 screens for this module.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; 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;; &amp;lt;code&amp;gt;Application::fn on_phys_tick(&amp;amp;mut self, screens: &amp;amp;[Screen&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;; &amp;lt;code&amp;gt;Application::fn on_phys_tick(&amp;amp;mut self, screens: &amp;amp;[Screen&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;; 3]) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&lt;/ins&gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;: Called on physics tick. `screens` contains the 3 screens for this module.&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;: Called on physics tick. `screens` contains the 3 screens for this module.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l93&quot; &gt;Line 93:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 93:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;code&amp;gt;Mappable::fn get_place( &amp;amp;self, module: u32, screen: u32, orientation: TopologyOrientation, ) -&amp;amp;gt; Result&amp;amp;lt;(u32, u32), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;code&amp;gt;Mappable::fn get_place( &amp;amp;self, module: u32, screen: u32, orientation: TopologyOrientation, ) -&amp;amp;gt; Result&amp;amp;lt;(u32, u32), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; 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;; &amp;lt;code&amp;gt;Packable::fn to_pkt(&amp;amp;self, module: u8, screen: u8) -&amp;amp;gt; [u8&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;; &amp;lt;code&amp;gt;Packable::fn to_pkt(&amp;amp;self, module: u8, screen: u8) -&amp;amp;gt; [u8&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;; 4]&lt;/ins&gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; 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;; &amp;lt;code&amp;gt;Packable::fn from_pkt(pkt: [u8&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;; &amp;lt;code&amp;gt;Packable::fn from_pkt(pkt: [u8&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;; 4]) -&amp;amp;gt; (Self, u8, u8)&lt;/ins&gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;code&amp;gt;fn new(val: T) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;code&amp;gt;fn new(val: T) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;/div&gt;&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-l103&quot; &gt;Line 103:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 103:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;code&amp;gt;Broadcastable::fn broadcast(&amp;amp;mut self, delay: usize) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;code&amp;gt;Broadcastable::fn broadcast(&amp;amp;mut self, delay: usize) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt;−&lt;/td&gt;&lt;td style=&quot;color: #222; 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;; &amp;lt;code&amp;gt;Broadcastable::fn recv(&amp;amp;mut self, pkt: [u8&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt;+&lt;/td&gt;&lt;td style=&quot;color: #222; 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;; &amp;lt;code&amp;gt;Broadcastable::fn recv(&amp;amp;mut self, pkt: [u8&lt;ins class=&quot;diffchange diffchange-inline&quot;&gt;; 4]) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&lt;/ins&gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;code&amp;gt;Shuffable::fn rotate(&amp;amp;mut self, dir: &amp;amp;RotationDir) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;td class='diff-marker'&gt; &lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #222; 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;code&amp;gt;Shuffable::fn rotate(&amp;amp;mut self, dir: &amp;amp;RotationDir) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key wiki:diff::1.12:old-16978:rev-16980 --&gt;
&lt;/table&gt;</summary>
		<author><name>WowBot</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.wowcube.com/index.php?title=SDK_6.3/Rust/cubios-sys&amp;diff=16978&amp;oldid=prev</id>
		<title>WowBot: Full Rust API reference: cubios-sys + cubios, every pub fn with docs (WowBot)</title>
		<link rel="alternate" type="text/html" href="https://wiki.wowcube.com/index.php?title=SDK_6.3/Rust/cubios-sys&amp;diff=16978&amp;oldid=prev"/>
		<updated>2026-07-26T10:44:42Z</updated>

		<summary type="html">&lt;p&gt;Full Rust API reference: cubios-sys + cubios, every pub fn with docs (WowBot)&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;{{notice|'''Official WOWCube SDK documentation.''' SDK 6.3, Rust API — '''EXPERIMENTAL''' (supported; APIs may change). Generated from the [https://github.com/wowcube/CubiOS_Rust_SDK CubiOS_Rust_SDK] sources — the repository is authoritative; do not edit by hand.}}&lt;br /&gt;
&lt;br /&gt;
{{SDK 6.3 nav}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
''← [[SDK 6.3]] · [[SDK 6.3/Rust|Rust]] / cubios-sys (raw layer)''&lt;br /&gt;
&lt;br /&gt;
Complete reference of the '''raw layer''' crate [https://github.com/wowcube/CubiOS_Rust_SDK/tree/main/crates/cubios-sys &amp;lt;code&amp;gt;cubios-sys&amp;lt;/code&amp;gt;]: FFI bindings to the CubiOS engine ABI, thin safe wrappers and the application event loop. Signatures and descriptions are extracted from the crate sources. Engine-function semantics match the [[SDK 6.3/C++/Native API|C++ native API]] one-to-one.&lt;br /&gt;
&lt;br /&gt;
== ffi::application ==&lt;br /&gt;
&lt;br /&gt;
The &amp;lt;code&amp;gt;Application&amp;lt;/code&amp;gt; trait (11 callbacks), &amp;lt;code&amp;gt;ApplicationContext&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TimerController&amp;lt;/code&amp;gt;, the event loop (&amp;lt;code&amp;gt;application_init&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;application_run&amp;lt;/code&amp;gt;), &amp;lt;code&amp;gt;Anim&amp;amp;lt;T&amp;amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;AppErr&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Types:''' &amp;lt;code&amp;gt;enum AppErr&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;enum AppPkt&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;enum RotationDir&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;struct Anim&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;struct Timer&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;trait Application&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;trait Assetable&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;trait Mappable&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;trait Packable&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;struct MapBase&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;struct SceneSwitch&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;trait Broadcastable&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;trait Shuffable&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;struct TimerController&amp;lt;/code&amp;gt; · &amp;lt;code&amp;gt;struct ApplicationContext&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
'''49 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn app_context_mut(&amp;amp;mut self) -&amp;amp;gt; &amp;amp;mut ApplicationContext&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn set_timer(&amp;amp;mut self, id: u8, delay: u32, suspended: bool) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn start_timer(&amp;amp;mut self, id: u8) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn stop_timer(&amp;amp;mut self, id: u8) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn kill_timer(&amp;amp;mut self, id: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn on_init(&amp;amp;mut self) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: Called once when the application initializes.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn on_tick(&amp;amp;mut self, cur_time: u32, delta_time: u32) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: Called every frame. `cur_time` is current time in ms, `delta_time` is ms since last tick.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn on_render(&amp;amp;mut self, screens: &amp;amp;mut [Screen&amp;lt;/code&amp;gt;&lt;br /&gt;
: Called to render the current frame. `screens` contains the 3 screens for this module.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn on_phys_tick(&amp;amp;mut self, screens: &amp;amp;[Screen&amp;lt;/code&amp;gt;&lt;br /&gt;
: Called on physics tick. `screens` contains the 3 screens for this module.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn on_twist(&amp;amp;mut self, twist: &amp;amp;TopologyTwistInfo) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: Called when a twist event occurs.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn on_tap(&amp;amp;mut self, count: u32) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: Called when a tap event occurs. `count` is the number of taps.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn on_pat(&amp;amp;mut self, count: u32) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: Called when a pat event occurs. `count` is the number of pats.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn on_message(&amp;amp;mut self, msg_type: u32, data: &amp;amp;[u8]) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: Called when a network message is received from another module.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn on_external_message(&amp;amp;mut self, data: &amp;amp;[u8]) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: Called when an external message is received via BLE.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn on_timer(&amp;amp;mut self, timer_id: u8) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: Called when a timer fires.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn on_close(&amp;amp;mut self) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
: Called when the application is closing.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn get_time(&amp;amp;self) -&amp;amp;gt; u32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Returns current time in milliseconds.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn get_time_seconds(&amp;amp;self) -&amp;amp;gt; u32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Returns current time in seconds.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn is_master_module(&amp;amp;self) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Returns true if this module is the master (module 0).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn send_network_message(&amp;amp;self, msg_type: u32, data: &amp;amp;[u8])&amp;lt;/code&amp;gt;&lt;br /&gt;
: Sends a network message to other modules.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn save_state(&amp;amp;self, data: &amp;amp;[u8])&amp;lt;/code&amp;gt;&lt;br /&gt;
: Saves game state to persistent storage.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn load_state(&amp;amp;self, id: &amp;amp;mut u32, data: &amp;amp;mut [u8]) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Loads game state from persistent storage. Returns the number of bytes read, or negative on error.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn send_external_message(&amp;amp;self, msg_type: u32, data: &amp;amp;mut [u8])&amp;lt;/code&amp;gt;&lt;br /&gt;
: Sends an external message via BLE.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn show_fps_counter(&amp;amp;self, show: bool)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Shows or hides the FPS counter overlay.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn get_image_assets_count(&amp;amp;self) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Returns the number of image assets available.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Application::fn get_sound_assets_count(&amp;amp;self) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Returns the number of sound assets available.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Assetable::fn get_asset_id(asset: &amp;amp;'static str) -&amp;amp;gt; Result&amp;amp;lt;u32, AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Mappable::fn get_place( &amp;amp;self, module: u32, screen: u32, orientation: TopologyOrientation, ) -&amp;amp;gt; Result&amp;amp;lt;(u32, u32), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Packable::fn to_pkt(&amp;amp;self, module: u8, screen: u8) -&amp;amp;gt; [u8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Packable::fn from_pkt(pkt: [u8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn new(val: T) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Broadcastable::fn broadcast_part(&amp;amp;mut self, _module: u8, _screen: u8, _delay: usize) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Broadcastable::fn broadcast(&amp;amp;mut self, delay: usize) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Broadcastable::fn recv(&amp;amp;mut self, pkt: [u8&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Shuffable::fn rotate(&amp;amp;mut self, dir: &amp;amp;RotationDir) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;Shuffable::fn shuffle(&amp;amp;mut self, algo: &amp;amp;[RotationDir]) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn new(scenes: &amp;amp;'static [usize], start_time: usize) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn next_scene(&amp;amp;mut self)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_scene(&amp;amp;mut self, id: u8) -&amp;amp;gt; Result&amp;amp;lt;(), AppErr&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn animate(&amp;amp;mut self)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn new() -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create a new TimerController with no active timers.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_timer(&amp;amp;mut self, id: u8, delay: u32, suspended: bool) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn start_timer(&amp;amp;mut self, id: u8) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn stop_timer(&amp;amp;mut self, id: u8) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn kill_timer(&amp;amp;mut self, id: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn delta_time(&amp;amp;self) -&amp;amp;gt; u32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn new() -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create a new ApplicationContext.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn application_init&amp;amp;lt;T: Application&amp;amp;gt;(app: &amp;amp;mut T, cid: u32)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn application_run&amp;amp;lt;T: Application&amp;amp;gt;(app: &amp;amp;mut T)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ffi::comm ==&lt;br /&gt;
&lt;br /&gt;
Inter-module packets and UART lines, BLE external data, time, user name, state save/load, RNG, logging (&amp;lt;code&amp;gt;log_a&amp;lt;/code&amp;gt;…&amp;lt;code&amp;gt;log_v&amp;lt;/code&amp;gt;), tap.&lt;br /&gt;
&lt;br /&gt;
'''22 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn send_message(line: u32, pkt: *const u8, size: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn send_message_to(line: u32, dest: u32, pkt: *const u8, size: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn recv_message( line: u32, size: u32, pkt_info: *mut u32, pkt: *mut u8, rx_size: *mut u32, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn send_packet(packet_type: u32, pkt: &amp;amp;[u8]) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Send a packet (new API in SDK 6.3)&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn recv_packet(size: u32, packet_type: *mut u32, pkt: *mut u8) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Receive a packet (new API in SDK 6.3)  Returns the number of bytes received, or negative on error. The packet type is written to `packet_type`.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_time() -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_user_name(buffer: &amp;amp;mut [u8]) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn toggle_debug_info() -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn save_state(data: &amp;amp;[u8]) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn load_state(id: &amp;amp;mut u32, data: &amp;amp;mut [u8]) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Load saved state  Returns the number of bytes loaded, or negative on error. The save ID is written to `id`.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn load_state_legacy(data: &amp;amp;mut [u8]) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Load saved state (legacy API without ID)  Note: This ignores the save ID. Use `load_state` for full functionality.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn random_range(min: u32, max: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_app_version() -&amp;amp;gt; AppVersion&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get the application version&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn log_a(text: &amp;amp;str) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn log_e(text: &amp;amp;str) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn log_w(text: &amp;amp;str) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn log_i(text: &amp;amp;str) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn log_d(text: &amp;amp;str) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn log_v(text: &amp;amp;str) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_tap() -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn send_ble_data(data_type: u32, pkt: &amp;amp;mut [u8]) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Send BLE data&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn recv_ble_data(pkt: &amp;amp;mut [u8]) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Receive BLE data&lt;br /&gt;
&lt;br /&gt;
== ffi::gfx ==&lt;br /&gt;
&lt;br /&gt;
Immediate-mode drawing: clear, primitives, text, images, baked images, sub-images, shaders, QR, render target, cache.&lt;br /&gt;
&lt;br /&gt;
'''26 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_asset_id(sprite_name: &amp;amp;str) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn clear(color: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_text( x: i32, y: i32, scale: u32, angle: u32, align: TextAlign, color: u32, text: &amp;amp;str, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_point(x: i32, y: i32, color: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_circle(x: u32, y: u32, radius: u32, width: u32, color: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_solid_circle(x: u32, y: u32, radius: u32, color: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Deprecated: use `set_fill_shader` + `draw_circle` instead&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_arc( x: i32, y: i32, radius: u32, width: u32, angle0: u32, angle1: u32, color: u32, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_sector(x: i32, y: i32, radius: u32, angle0: u32, angle1: u32, color: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_line(x0: i32, y0: i32, x1: i32, y1: i32, thickness: u32, color: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_rectangle(x: i32, y: i32, w: i32, h: i32, color: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn bake_image( id: SpriteId, width: u32, height: u32, format: GfxPixelFormat, overwrite: bool, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Bake an image to an offscreen buffer  # Arguments * `id` - Sprite ID to bake * `width` - Width of the baked image * `height` - Height of the baked image * `format` - Pixel format for the baked image * `overwrite` - Whether to overwrite existing baked image&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn remove_baked_image(id: SpriteId) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Remove a previously baked image&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_render_target(display: u8) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_image( id: SpriteId, x: i32, y: i32, opacity: u32, color_key: u32, scale_x: u32, scale_y: u32, angle: u32, mirror: GfxMirror, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_baked_image( x: i32, y: i32, opacity: u32, color_key: u32, scale_x: u32, scale_y: u32, angle: u32, mirror: GfxMirror, id: SpriteId, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_sub_image( id: SpriteId, x: i32, y: i32, rect_x: u32, rect_y: u32, rect_w: u32, rect_h: u32, opacity: u32, color_key: u32, scale_x: u32, scale_y: u32, angle: u32, mirror: GfxMirror, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Draw a sub-region of a sprite (for sprite atlases)&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn draw_qr_code( x: i32, y: i32, size: u32, color0: u32, color1: u32, angle: u32, id: u32, text: &amp;amp;str, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Draw a QR code&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn render() -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn clear_cache() -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn cache_images(sprite_ids: &amp;amp;[SpriteId]) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_assets_count() -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get the total number of image assets&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_fps_window(size: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set the FPS counter window size&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_fill_shader(color: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set a solid fill shader  When active, drawing operations will use this color to fill shapes.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_linear_gradient_shader( x0: u32, y0: u32, x1: u32, y1: u32, color0: u32, color1: u32, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set a linear gradient shader  # Arguments * `x0`, `y0` - Start point of the gradient * `x1`, `y1` - End point of the gradient * `color0` - Start color * `color1` - End color&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_radial_gradient_shader(x0: u32, y0: u32, radius: u32, color0: u32, color1: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set a radial gradient shader  # Arguments * `x0`, `y0` - Center point of the gradient * `radius` - Radius of the gradient * `color0` - Center color * `color1` - Edge color&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn remove_shader() -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Remove the active shader&lt;br /&gt;
&lt;br /&gt;
== ffi::topology ==&lt;br /&gt;
&lt;br /&gt;
Facelets, faces, places, orientation, twists, assembly check.&lt;br /&gt;
&lt;br /&gt;
'''15 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_cuben() -&amp;amp;gt; u32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_adjacent_facelet( module: u32, screen: u32, direction: TopologyNeighbour, result: *mut TopologyFaceletInfo, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_reversed_face(face: u32) -&amp;amp;gt; Option&amp;amp;lt;u32&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_facelet( face: u32, position: u32, mode: TopologyOrientation, result: *mut TopologyFaceletInfo, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_place( module: u32, screen: u32, mode: TopologyOrientation, result: *mut TopologyPlace, ) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_opposite_facelet(module: u32, screen: u32, result: *mut TopologyFaceletInfo) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_angle(module: u32, screen: u32, mode: TopologyOrientation) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_facelet_orientation(module: u32, screen: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_place_orientation(face: u32, position: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_face(orientation: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn is_assembled() -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_twist(twist: *mut TopologyTwistInfo) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn debug_get_face(module: u32, screen: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn debug_get_position(module: u32, screen: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn debug_get_horizontal() -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ffi::sound ==&lt;br /&gt;
&lt;br /&gt;
Sound asset id, play, cache, stop, status.&lt;br /&gt;
&lt;br /&gt;
'''6 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_asset_id(sound_name: &amp;amp;str) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn play(sound_id: SoundId, volume: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn cache_sounds(sound_ids: &amp;amp;[SoundId]) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn is_playing() -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Check if a sound is currently playing&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn stop() -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Stop the currently playing sound&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_assets_count() -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get the total number of sound assets&lt;br /&gt;
&lt;br /&gt;
== ffi::motion ==&lt;br /&gt;
&lt;br /&gt;
Per-display accelerometer and gyroscope.&lt;br /&gt;
&lt;br /&gt;
'''8 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_face_accel_x(display: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get raw accelerometer value along the screen-local X-axis (horizontal right).  At rest, this reads the X-component of gravity in the screen's coordinate frame. During motion, reads gravity + linear acceleration.  # Parameters - `display`: Screen index (0–23). All 3 screens on a module return the same physical measurement, transformed to screen-local coordinates.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_face_accel_y(display: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get raw accelerometer value along the screen-local Y-axis (vertical up).  See [`get_face_accel_x`] for details on data format and coordinate frame.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_face_accel_z(display: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get raw accelerometer value along the screen-local Z-axis (toward cube center).  When this screen faces up, Z reads approximately -1g (gravity pulls toward center). When this screen faces down, Z reads approximately +1g.  See [`get_face_accel_x`] for details on data format and coordinate frame.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_face_gyro_x(display: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get raw gyroscope value for rotation around the screen-local X-axis.  Measures angular velocity of the screen pitching up/down. At rest, reads approximately zero. Sign convention: positive = clockwise when looking along the positive X-axis direction (per SDK docs, unverified).  # Parameters - `display`: Screen index (0–23). Same sensor sharing as accelerometer.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_face_gyro_y(display: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get raw gyroscope value for rotation around the screen-local Y-axis.  Measures angular velocity of the screen yawing left/right. See [`get_face_gyro_x`] for details.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_face_gyro_z(display: u32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get raw gyroscope value for rotation around the screen-local Z-axis.  Measures angular velocity of the screen spinning in-plane (like a wheel). See [`get_face_gyro_x`] for details.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_face_accel(display: u32) -&amp;amp;gt; (i32, i32, i32)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get all 3 accelerometer axes for a screen in one call.  Returns `(x, y, z)` in screen-local coordinates. Equivalent to calling [`get_face_accel_x`], [`get_face_accel_y`], and [`get_face_accel_z`] separately.  # Parameters - `display`: Screen index (0–23).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_face_gyro(display: u32) -&amp;amp;gt; (i32, i32, i32)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get all 3 gyroscope axes for a screen in one call.  Returns `(x, y, z)` angular velocities in screen-local coordinates. Equivalent to calling [`get_face_gyro_x`], [`get_face_gyro_y`], and [`get_face_gyro_z`] separately.  # Parameters - `display`: Screen index (0–23).&lt;br /&gt;
&lt;br /&gt;
== ffi::leaderboard ==&lt;br /&gt;
&lt;br /&gt;
Leaderboard info and score table.&lt;br /&gt;
&lt;br /&gt;
'''3 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_info(info: *mut LbInfo) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_info_safe() -&amp;amp;gt; LbInfo&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get leaderboard info with safe interface&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_score(lead_table_bin: &amp;amp;mut [u8]) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ffi::event ==&lt;br /&gt;
&lt;br /&gt;
Pending-event mask (&amp;lt;code&amp;gt;Event&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;get_list&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
'''Types:''' &amp;lt;code&amp;gt;enum Event&amp;lt;/code&amp;gt; — Event flags returned by `get_list()`&lt;br /&gt;
&lt;br /&gt;
'''2 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_list() -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn has_event(event_list: i32, event: Event) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Check if a specific event is set in the event list&lt;br /&gt;
&lt;br /&gt;
== ffi::network_message ==&lt;br /&gt;
&lt;br /&gt;
Bit-packed serializer for inter-module messages.&lt;br /&gt;
&lt;br /&gt;
'''Types:''' &amp;lt;code&amp;gt;struct NetworkMessage&amp;lt;/code&amp;gt; — Bit-packed network message for inter-module communication.  Allows packing multiple values into a compact byte buffer using variable bit widths for efficient network transmission.&lt;br /&gt;
&lt;br /&gt;
'''17 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn new() -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create a new empty network message.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn from_data(data: &amp;amp;[u8]) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create a network message from existing data.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn reset(&amp;amp;mut self, zero: bool)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Reset the message position. If `zero` is true, also clear the buffer.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_data(&amp;amp;self) -&amp;amp;gt; &amp;amp;[u8]&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get the underlying data buffer and used length.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn can_read(&amp;amp;self, bits: usize) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Returns true if at least `bits` more bits can be read from the current position.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn write_int(&amp;amp;mut self, value: u32, bits: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Write an unsigned integer with specified bit width (1-32 bits).  This writes raw bits without sign handling. For signed values that need sign extension when read back, use [`write_signed_int`](Self::write_signed_int).  # Arguments * `value` - The unsigned value to write (only the lower `bits` bits are used) * `bits` - Number of bits to write (1-32, clamped if larger)  # Note on C++ SDK difference The C++ `WriteInt` uses `int` (signed), but performs unsigned bit operations. This Rust version uses `u32` to make the unsigned semantics explicit.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn write_byte(&amp;amp;mut self, value: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Write a single byte (8 bits).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn write_signed_int(&amp;amp;mut self, value: i32, bits: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Write a signed integer with specified bit width.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn write_bool(&amp;amp;mut self, value: bool)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Write a boolean (1 bit).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn write_float(&amp;amp;mut self, value: f32)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Write a 32-bit float.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn read_int(&amp;amp;mut self, bits: u8) -&amp;amp;gt; u32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Read an unsigned integer with specified bit width.  This reads raw bits without sign extension. For signed values that were written with [`write_signed_int`](Self::write_signed_int), use [`read_signed_int`](Self::read_signed_int) to properly sign-extend.  # Arguments * `bits` - Number of bits to read (1-32, clamped if larger)  # Returns The unsigned value read from the message buffer.  # Note on C++ SDK difference The C++ `ReadInt` returns `int` (signed), but performs unsigned bit operations. This Rust version returns `u32` to make the unsigned semantics explicit.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn read_byte(&amp;amp;mut self) -&amp;amp;gt; u8&amp;lt;/code&amp;gt;&lt;br /&gt;
: Read a single byte.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn read_signed_int(&amp;amp;mut self, bits: u8) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Read a signed integer with specified bit width.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn read_bool(&amp;amp;mut self) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Read a boolean.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn read_float(&amp;amp;mut self) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Read a 32-bit float.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn position(&amp;amp;self) -&amp;amp;gt; usize&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get current bit position.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn can_write(&amp;amp;self, bits: usize) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Check if there's enough space to write `bits` more bits.&lt;br /&gt;
&lt;br /&gt;
== ffi::save_message ==&lt;br /&gt;
&lt;br /&gt;
Bit-packed serializer for the persistent save buffer.&lt;br /&gt;
&lt;br /&gt;
'''Types:''' &amp;lt;code&amp;gt;struct SaveMessage&amp;lt;/code&amp;gt; — Bit-packed save message for game state persistence.  Allows packing multiple values into a compact byte buffer using variable bit widths for efficient save data storage.&lt;br /&gt;
&lt;br /&gt;
'''18 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn new() -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create a new empty save message.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn from_data(data: &amp;amp;[u8]) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create a save message from existing data.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn reset(&amp;amp;mut self, zero: bool)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Reset the message position. If `zero` is true, also clear the buffer.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_data(&amp;amp;self) -&amp;amp;gt; &amp;amp;[u8]&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get the underlying data buffer (only the used portion).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn get_buffer_mut(&amp;amp;mut self) -&amp;amp;gt; &amp;amp;mut [u8]&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get the full buffer for loading saved data.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn write_int(&amp;amp;mut self, value: u32, bits: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Write an unsigned integer with specified bit width (1-32 bits).  This writes raw bits without sign handling. For signed values that need sign extension when read back, use [`write_signed_int`](Self::write_signed_int).  # Arguments * `value` - The unsigned value to write (only the lower `bits` bits are used) * `bits` - Number of bits to write (1-32, clamped if larger)  # Note on C++ SDK difference The C++ `WriteInt` uses `int` (signed), but performs unsigned bit operations. This Rust version uses `u32` to make the unsigned semantics explicit.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn write_byte(&amp;amp;mut self, value: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Write a single byte (8 bits).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn write_signed_int(&amp;amp;mut self, value: i32, bits: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Write a signed integer with specified bit width.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn write_bool(&amp;amp;mut self, value: bool)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Write a boolean (1 bit).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn write_float(&amp;amp;mut self, value: f32)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Write a 32-bit float.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn read_int(&amp;amp;mut self, bits: u8) -&amp;amp;gt; u32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Read an unsigned integer with specified bit width.  This reads raw bits without sign extension. For signed values that were written with [`write_signed_int`](Self::write_signed_int), use [`read_signed_int`](Self::read_signed_int) to properly sign-extend.  # Arguments * `bits` - Number of bits to read (1-32, clamped if larger)  # Returns The unsigned value read from the save buffer.  # Note on C++ SDK difference The C++ `ReadInt` returns `int` (signed), but performs unsigned bit operations. This Rust version returns `u32` to make the unsigned semantics explicit.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn read_byte(&amp;amp;mut self) -&amp;amp;gt; u8&amp;lt;/code&amp;gt;&lt;br /&gt;
: Read a single byte.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn read_signed_int(&amp;amp;mut self, bits: u8) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Read a signed integer with specified bit width.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn read_bool(&amp;amp;mut self) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Read a boolean.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn read_float(&amp;amp;mut self) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Read a 32-bit float.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn position(&amp;amp;self) -&amp;amp;gt; usize&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get current bit position.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn can_write(&amp;amp;self, bits: usize) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Check if there's enough space to write `bits` more bits.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_used_bits(&amp;amp;mut self, bits: usize)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set the number of used bits (for after loading data).&lt;br /&gt;
&lt;br /&gt;
== ffi::screen ==&lt;br /&gt;
&lt;br /&gt;
Low-level screen descriptor (id, angle, face, position) + &amp;lt;code&amp;gt;create_screens()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
'''Types:''' &amp;lt;code&amp;gt;struct Screen&amp;lt;/code&amp;gt; — Represents a screen on a WOWCube module.  Each module has 3 screens. This struct provides access to screen properties like position, orientation, and display ID for rendering purposes.&lt;br /&gt;
&lt;br /&gt;
'''7 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn new(display_id: u8) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Creates a new Screen for the given display ID on this module.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn id(&amp;amp;self) -&amp;amp;gt; u8&amp;lt;/code&amp;gt;&lt;br /&gt;
: Returns the display ID (0-2).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn angle(&amp;amp;self) -&amp;amp;gt; u32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Returns the current rotation angle.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn position(&amp;amp;self) -&amp;amp;gt; u32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Returns the position in the topology.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn face(&amp;amp;self) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Returns the face this screen is on.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn update_from_topology(&amp;amp;mut self, module: u32, orientation: TopologyOrientation)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Updates screen topology information from the system.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn create_screens() -&amp;amp;gt; [Screen; 3]&amp;lt;/code&amp;gt;&lt;br /&gt;
: Creates an array of 3 screens for a module, initialized with display IDs 0, 1, 2.&lt;br /&gt;
&lt;br /&gt;
== ffi::math ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;Vec2&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Vec2i&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Color&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Transform&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Rect2&amp;lt;/code&amp;gt;, trigonometry and fixed-point helpers (no_std, libm).&lt;br /&gt;
&lt;br /&gt;
'''Types:''' &amp;lt;code&amp;gt;struct Vec2&amp;lt;/code&amp;gt; — 2D vector with floating-point components. · &amp;lt;code&amp;gt;struct Vec2i&amp;lt;/code&amp;gt; — 2D vector with integer components. · &amp;lt;code&amp;gt;struct Color&amp;lt;/code&amp;gt; — ARGB color with 8-bit components.  Stored as a packed u32 in ARGB format: 0xAARRGGBB · &amp;lt;code&amp;gt;struct Transform&amp;lt;/code&amp;gt; — Transform with position, rotation, scale, and mirroring. · &amp;lt;code&amp;gt;struct Rect2&amp;lt;/code&amp;gt; — 2D rectangle defined by top-left and dimensions.&lt;br /&gt;
&lt;br /&gt;
'''57 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn log2(f: f32) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Log base 2.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn iclamp(val: i32, min_val: i32, max_val: i32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Clamp an integer value between min and max.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn acos(x: f32) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Arc cosine with value clamping to [-1, 1].&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn asin(x: f32) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Arc sine with value clamping to [-1, 1].&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn sqrt(x: f32) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Safe square root (negative values return 0).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn fequal(f0: f32, f1: f32, tol: f32) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Fuzzy floating point equality check.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn fless(f0: f32, f1: f32, tol: f32) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Fuzzy floating point less-than check.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn fgreater(f0: f32, f1: f32, tol: f32) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Fuzzy floating point greater-than check.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn ftol(val: f32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Fast float to int conversion (truncates).  Note: This is a portable implementation that matches the C++ SDK behavior.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn smooth(new_val: f32, cur_val: f32, max_change: f32) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Smooth a value towards a target using max change per step.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn clamp(val: f32, lower: f32, upper: f32) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Clamp a float value between lower and upper bounds.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn saturate(val: f32) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Saturate a value (clamp between 0.0 and 1.0).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn deg2rad(d: f32) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Convert degrees to radians.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn rad2deg(r: f32) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Convert radians to degrees.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn n_abs(a: f32) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get the absolute value.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn n_sgn(a: f32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get the sign of a value (-1 or 1).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn n_max&amp;amp;lt;T: PartialOrd&amp;amp;gt;(a: T, b: T) -&amp;amp;gt; T&amp;lt;/code&amp;gt;&lt;br /&gt;
: Return the maximum of two values.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn n_min&amp;amp;lt;T: PartialOrd&amp;amp;gt;(a: T, b: T) -&amp;amp;gt; T&amp;lt;/code&amp;gt;&lt;br /&gt;
: Return the minimum of two values.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn lerp(x: f32, y: f32, l: f32) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Linearly interpolate between two values.  Returns `x + l * (y - x)`.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn rand_get_seed() -&amp;amp;gt; u32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get the current random seed.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn rand_set_seed(s: u32)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set the random seed.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn rand() -&amp;amp;gt; u32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Generate a random u32 using LCG algorithm.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn rand2() -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Return a pseudo random number between 0.0 and 1.0.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn rand_int(n: i32) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Return a random integer in range [0, n].&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn rand_real() -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Return a random float in [0.0, 1.0].&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn new(x: f32, y: f32) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create a new vector.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn zero() -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Zero vector.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set(&amp;amp;mut self, x: f32, y: f32)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set components.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn len(&amp;amp;self) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Calculate length.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn normalize(&amp;amp;mut self)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Normalize in place.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn normalized(&amp;amp;self) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Return normalized copy.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn dot(&amp;amp;self, other: &amp;amp;Self) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Dot product.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn new(x: i16, y: i16) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create a new vector.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn zero() -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Zero vector.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn rgb(r: u8, g: u8, b: u8) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create from RGB (alpha = 255).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn rgba(r: u8, g: u8, b: u8, a: u8) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create from RGBA.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn from_u32(value: u32) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create from packed u32 value (0xAARRGGBB format).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn value(&amp;amp;self) -&amp;amp;gt; u32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get the packed u32 value.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn r(&amp;amp;self) -&amp;amp;gt; u8&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get red component.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn g(&amp;amp;self) -&amp;amp;gt; u8&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get green component.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn b(&amp;amp;self) -&amp;amp;gt; u8&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get blue component.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn a(&amp;amp;self) -&amp;amp;gt; u8&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get alpha component.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn a_f32(&amp;amp;self) -&amp;amp;gt; f32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get alpha as float (0.0 - 1.0).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_r(&amp;amp;mut self, r: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set red component.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_g(&amp;amp;mut self, g: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set green component.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_b(&amp;amp;mut self, b: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set blue component.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_a(&amp;amp;mut self, a: u8)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set alpha component.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_a_f32(&amp;amp;mut self, a: f32)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set alpha from float (0.0 - 1.0).&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn new(x: f32, y: f32) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create a new transform at position.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn with_rotation(x: f32, y: f32, rotation: i32) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create with position and rotation.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn with_scale(x: f32, y: f32, rotation: i32, scale: u32) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create with position, rotation, and uniform scale.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn safe_rotation(&amp;amp;self) -&amp;amp;gt; i32&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get rotation normalized to 0-359.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn set_scale(&amp;amp;mut self, scale: u32)&amp;lt;/code&amp;gt;&lt;br /&gt;
: Set uniform scale.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn new(x: i16, y: i16, w: i16, h: i16) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Create a new rectangle.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn contains(&amp;amp;self, px: i16, py: i16) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Check if a point is inside the rectangle.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn contains_point(&amp;amp;self, p: Vec2i) -&amp;amp;gt; bool&amp;lt;/code&amp;gt;&lt;br /&gt;
: Check if point (as Vec2i) is inside.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn center(&amp;amp;self) -&amp;amp;gt; Vec2i&amp;lt;/code&amp;gt;&lt;br /&gt;
: Get the center point.&lt;br /&gt;
&lt;br /&gt;
== ffi::types ==&lt;br /&gt;
&lt;br /&gt;
ABI enums and structs (&amp;lt;code&amp;gt;TopologyFaceletInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TopologyTwistInfo&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;TextAlign&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;GfxMirror&amp;lt;/code&amp;gt;, …).&lt;br /&gt;
&lt;br /&gt;
'''Types:''' &amp;lt;code&amp;gt;enum UartId&amp;lt;/code&amp;gt; — UART line identifiers · &amp;lt;code&amp;gt;enum GfxPixelFormat&amp;lt;/code&amp;gt; — Pixel format for baked images · &amp;lt;code&amp;gt;enum GfxMirror&amp;lt;/code&amp;gt; — Mirror mode for sprites · &amp;lt;code&amp;gt;enum TopologyNeighbour&amp;lt;/code&amp;gt; — Topology neighbor direction · &amp;lt;code&amp;gt;enum TopologyOrientation&amp;lt;/code&amp;gt; — Topology orientation mode · &amp;lt;code&amp;gt;enum TopologyTwist&amp;lt;/code&amp;gt; — Twist direction for cube rotations · &amp;lt;code&amp;gt;enum TextAlign&amp;lt;/code&amp;gt; — Text alignment options · &amp;lt;code&amp;gt;enum TopologyLocation&amp;lt;/code&amp;gt; — Topology face location · &amp;lt;code&amp;gt;enum LogLevel&amp;lt;/code&amp;gt; — Log level for debug output · &amp;lt;code&amp;gt;struct TopologyFaceletInfo&amp;lt;/code&amp;gt; — Information about a facelet in the topology · &amp;lt;code&amp;gt;struct TopologyPlace&amp;lt;/code&amp;gt; — Place information (face and position) · &amp;lt;code&amp;gt;struct TopologyTwistInfo&amp;lt;/code&amp;gt; — Twist event information · &amp;lt;code&amp;gt;struct LbInfo&amp;lt;/code&amp;gt; — Leaderboard information · &amp;lt;code&amp;gt;struct GfxParticle&amp;lt;/code&amp;gt; — Particle effect parameters · &amp;lt;code&amp;gt;struct AppVersion&amp;lt;/code&amp;gt; — Application version (packed bitfield in C++)&lt;br /&gt;
&lt;br /&gt;
'''4 public functions:'''&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn from_u32(value: u32) -&amp;amp;gt; Self&amp;lt;/code&amp;gt;&lt;br /&gt;
: Converts a u32 value to a GfxMirror variant.  Returns `GfxMirror::None` for invalid values.&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn patch(&amp;amp;self) -&amp;amp;gt; u16&amp;lt;/code&amp;gt;&lt;br /&gt;
: Extract patch version (bits 0-15)&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn minor(&amp;amp;self) -&amp;amp;gt; u8&amp;lt;/code&amp;gt;&lt;br /&gt;
: Extract minor version (bits 16-19)&lt;br /&gt;
&lt;br /&gt;
; &amp;lt;code&amp;gt;fn major(&amp;amp;self) -&amp;amp;gt; u8&amp;lt;/code&amp;gt;&lt;br /&gt;
: Extract major version (bits 20-23)&lt;br /&gt;
&lt;br /&gt;
== ffi::constants ==&lt;br /&gt;
&lt;br /&gt;
Platform constants (screen size, module counts, buffer limits, &amp;lt;code&amp;gt;CUBE_N&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
[[Category:SDK 6.3]]&lt;br /&gt;
[[Category:Rust API]]&lt;/div&gt;</summary>
		<author><name>WowBot</name></author>
		
	</entry>
</feed>