<spanclass="line"><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">user_config_t</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> user_config;</span></span></code></pre></div><p>This sets up a 32 bit structure that we can store settings with in memory, and write to the EEPROM. Using this removes the need to define variables, since they're defined in this structure. Remember that <code>bool</code> (boolean) values use 1 bit, <code>uint8_t</code> uses 8 bits, <code>uint16_t</code> uses up 16 bits. You can mix and match, but changing the order can cause issues, as it will change the values that are read and written.</p><p>We're using <code>rgb_layer_change</code>, for the <code>layer_state_set_*</code> function, and use <code>keyboard_post_init_user</code> and <code>process_record_user</code> to configure everything.</p><p>Now, using the <code>keyboard_post_init_user</code> code above, you want to add <code>eeconfig_read_user()</code> to it, to populate the structure you've just created. And you can then immediately use this structure to control functionality in your keymap. And It should look like:</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> keyboard_post_init_user</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Call the keymap level matrix init.</span></span>
<spanclass="line"></span>
<spanclass="line"><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Read the user config from EEPROM</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>The above function will use the EEPROM config immediately after reading it, to set the default layer's RGB color. The "raw" value of it is converted in a usable structure based on the "union" that you created above.</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">layer_state_t</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> layer_state_set_user</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">layer_state_t</span><spanstyle="--shiki-light:#E36209;--shiki-dark:#FFAB70;"> state</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> default</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">:</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // for any other layers, or the default layer</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>This will cause the RGB underglow to be changed ONLY if the value was enabled. Now to configure this value, create a new keycode for <code>process_record_user</code> called <code>RGB_LYR</code>. Additionally, we want to make sure that if you use the normal RGB codes, that it turns off Using the example above, make it look this:</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> false</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Skip all further processing of this key</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Let QMK send the enter press/release events</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> case</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> RGB_LYR:</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // This allows me to use underglow as layer indication, or as normal</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> user_config.rgb_layer_change </span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">^=</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> 1</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Toggles the status</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> eeconfig_update_user</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(user_config.raw);</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Writes the new status to EEPROM</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (user_config.rgb_layer_change) {</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // if layer state indication is enabled,</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> layer_state_set</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(layer_state);</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // then immediately update the layer color</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> case</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> RGB_MODE_FORWARD ... RGB_MODE_GRADIENT:</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // For any of the RGB codes (see quantum_keycodes.h, L400 for reference)</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (record</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">-></span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">event.pressed) {</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> //This disables layer indication, as it's assumed that if you're changing this ... you want that disabled</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> if</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> (user_config.rgb_layer_change) {</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // only if this is enabled</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> eeconfig_update_user</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(user_config.raw);</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // write the setings to EEPROM</span></span>
<spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;"> return</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Process all other keycodes normally</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>And lastly, you want to add the <code>eeconfig_init_user</code> function, so that when the EEPROM is reset, you can specify default values, and even custom actions. To force an EEPROM reset, use the <code>EE_CLR</code> keycode or <ahref="./features/bootmagic">Bootmagic Lite</a> functionallity. For example, if you want to set rgb layer indication by default, and save the default valued.</p><divclass="language-c vp-adaptive-theme"><buttontitle="Copy Code"class="copy"></button><spanclass="lang">c</span><preclass="shiki shiki-themes github-light github-dark vp-code"><code><spanclass="line"><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> eeconfig_init_user</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">void</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">) {</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // EEPROM is getting reset!</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;"> user_config.rgb_layer_change </span><spanstyle="--shiki-light:#D73A49;--shiki-dark:#F97583;">=</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;"> true</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">;</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // We want this enabled by default</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> eeconfig_update_user</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(user_config.raw);</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Write default value to EEPROM now</span></span>
<spanclass="line"></span>
<spanclass="line"><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // use the non noeeprom versions, to write these values to EEPROM too</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> rgblight_enable</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">();</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Enable RGB by default</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> rgblight_sethsv</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(HSV_CYAN);</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // Set it to CYAN by default</span></span>
<spanclass="line"><spanstyle="--shiki-light:#6F42C1;--shiki-dark:#B392F0;"> rgblight_mode</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">(</span><spanstyle="--shiki-light:#005CC5;--shiki-dark:#79B8FF;">1</span><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">);</span><spanstyle="--shiki-light:#6A737D;--shiki-dark:#6A737D;"> // set to solid by default</span></span>
<spanclass="line"><spanstyle="--shiki-light:#24292E;--shiki-dark:#E1E4E8;">}</span></span></code></pre></div><p>And you're done. The RGB layer indication will only work if you want it to. And it will be saved, even after unplugging the board. And if you use any of the RGB codes, it will disable the layer indication, so that it stays on the mode and color that you set it to.</p><h2id="eeconfig-function-documentation"tabindex="-1">'EECONFIG' Function Documentation <aclass="header-anchor"href="#eeconfig-function-documentation"aria-label="Permalink to "'EECONFIG' Function Documentation""></a></h2><ul><li>Keyboard/Revision: <code>void eeconfig_init_kb(void)</code>, <code>uint32_t eeconfig_read_kb(void)</code> and <code>void eeconfig_update_kb(uint32_t val)</code></li><li>Keymap: <code>void eeconfig_init_user(void)</code>, <code>uint32_t eeconfig_read_user(void)</code> and <code>void eeconfig_update_user(uint32_t val)</code></li></ul><p>The <code>val</code> is the value of the data that you want to write to EEPROM. And the <code>eeconfig_read_*</code> function return a 32 bit (DWORD) value from the EEPROM.</p></div></div></main><footerclass="VPDocFooter"data-v-39a288b8data-v-09de1c0f><!--[--><!--]--><!----><navclass="prev-next"data-v-09de1c0f><divclass="pager"data-v-09de1c0f><aclass="VPLink link pager-link prev"href="/features/digitizer"data-v-09de1c0f><!--[--><spanclass="desc"data-v-09de1c0f>Previous page</span><spanclass="title"data-v-09de1c0f>Digitizer</span><!--]--></a></div><divclass="pager"data-v-09de1c0f><aclass="VPLink link pager-link next"href="/features/key_lock"data-v-09de1c0f><!--[--><spanclass="desc"data-v-09de1c0f>Next page</span><spanclass="title"data-v-09de1c0f>Key Lock</span><!--]--></a></div></nav></footer><!--[--><!--]--></div></div></div><!--[--><!--]--></div></div><!----><!--[--><!--]--></div></div>