kopia lustrzana https://github.com/pimoroni/pimoroni-pico
Rewrite this code for #158
Rewrites the cursed Pico RGB Keypad code so that it can't hurt anyone else. Turns out the whole loop could have been a bitwise operator. The true lesson was the people we met along the way.pull/160/head
rodzic
32277ff8c5
commit
8015ffdb95
|
@ -5,71 +5,70 @@
|
|||
|
||||
#include "pico_rgb_keypad.hpp"
|
||||
|
||||
/*
|
||||
Test buttons/lights by lighting them up in a sequence of colors.
|
||||
|
||||
Press each button in turn, it will light up green.
|
||||
Once all buttons are lit, they will turn off.
|
||||
Press them again to light them in the next color.
|
||||
*/
|
||||
|
||||
using namespace pimoroni;
|
||||
|
||||
PicoRGBKeypad pico_keypad;
|
||||
|
||||
int main() {
|
||||
constexpr uint8_t num_colors = 6;
|
||||
|
||||
// Simple struct to pair r/g/b together as a color
|
||||
struct color {uint8_t r, g, b;};
|
||||
|
||||
color colors[num_colors] = {
|
||||
{0x00, 0x20, 0x00}, // Green
|
||||
{0x20, 0x20, 0x00}, // Yellow
|
||||
{0x20, 0x00, 0x00}, // Red
|
||||
{0x20, 0x00, 0x20}, // Pink
|
||||
{0x00, 0x00, 0x20}, // Blue
|
||||
{0x00, 0x20, 0x20} // Teal
|
||||
};
|
||||
|
||||
int main() {
|
||||
pico_keypad.init();
|
||||
pico_keypad.set_brightness(1.0f);
|
||||
|
||||
uint16_t lit = 0;
|
||||
uint16_t last_button_states = 0;
|
||||
uint8_t colour_index = 0;
|
||||
uint16_t lit_buttons = 0;
|
||||
uint8_t color_index = 0;
|
||||
color current_color = colors[color_index];
|
||||
|
||||
while(true) {
|
||||
// read button states from i2c expander
|
||||
uint16_t button_states = pico_keypad.get_button_states();
|
||||
// Read button states from i2c expander
|
||||
// for any pressed buttons set the corresponding bit in "lit_buttons"
|
||||
lit_buttons |= pico_keypad.get_button_states();
|
||||
|
||||
if(last_button_states != button_states && button_states) {
|
||||
last_button_states = button_states;
|
||||
if(button_states) {
|
||||
if(lit == 0xffff) {
|
||||
// all buttons are already lit, reset the test
|
||||
lit = 0;
|
||||
colour_index++;
|
||||
if(colour_index >= 6) {
|
||||
colour_index = 0;
|
||||
}
|
||||
}else{
|
||||
uint8_t button = 0;
|
||||
for(uint8_t find = 0; find < pico_keypad.NUM_PADS; find++) {
|
||||
// check if this button is pressed and no other buttons are pressed
|
||||
if(button_states & 0x01) {
|
||||
if(!(button_states & (~0x01))) {
|
||||
lit |= 1 << button;
|
||||
}
|
||||
break;
|
||||
}
|
||||
button_states >>= 1;
|
||||
button++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// You could use a bitwise OR (^) to make the buttons toggle their respective "lit" bits on and off:
|
||||
// lit_buttons ^= pico_keypad.get_button_states();
|
||||
|
||||
last_button_states = button_states;
|
||||
|
||||
for(uint8_t i = 0; i < PicoRGBKeypad::NUM_PADS; i++) {
|
||||
if((lit >> i) & 0x01) {
|
||||
switch(colour_index)
|
||||
{
|
||||
case 0: pico_keypad.illuminate(i, 0x00, 0x20, 0x00); break;
|
||||
case 1: pico_keypad.illuminate(i, 0x20, 0x20, 0x00); break;
|
||||
case 2: pico_keypad.illuminate(i, 0x20, 0x00, 0x00); break;
|
||||
case 3: pico_keypad.illuminate(i, 0x20, 0x00, 0x20); break;
|
||||
case 4: pico_keypad.illuminate(i, 0x00, 0x00, 0x20); break;
|
||||
case 5: pico_keypad.illuminate(i, 0x00, 0x20, 0x20); break;
|
||||
}
|
||||
// Iterate through the lights
|
||||
for(auto i = 0u; i < PicoRGBKeypad::NUM_PADS; i++) {
|
||||
if(lit_buttons & (0b1 << i)) {
|
||||
pico_keypad.illuminate(i, current_color.r, current_color.g, current_color.b);
|
||||
}else{
|
||||
// Kinda dim white-ish
|
||||
pico_keypad.illuminate(i, 0x05, 0x05, 0x05);
|
||||
}
|
||||
}
|
||||
|
||||
// Display the LED changes
|
||||
pico_keypad.update();
|
||||
|
||||
sleep_ms(100);
|
||||
|
||||
if (lit_buttons == 0xffff) {
|
||||
sleep_ms(500); // Wait a little so the last button can be seen
|
||||
lit_buttons = 0; // Reset lit buttons
|
||||
color_index += 1; // Proceed to the next color
|
||||
if(color_index == num_colors) color_index = 0; // Wrap at last color
|
||||
current_color = colors[color_index]; // Update the current color
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
Ładowanie…
Reference in New Issue