diff --git a/serial_debugger.ino b/serial_debugger.ino index b4c5aa8..4d86565 100644 --- a/serial_debugger.ino +++ b/serial_debugger.ino @@ -5,6 +5,7 @@ #include #include #include +#include // Debugging via serial monitor (don't turn this on unless you're hacking on the firmware code) #define DEBUG true @@ -22,9 +23,28 @@ Adafruit_ILI9341 tft(TFT_CS, TFT_DC); #define CHARS_HORIZONTAL 28 #define CHARS_ROWS 13 +// Keyboard +BBQ10Keyboard keyboard; +#define KBD_BTN_1 0x06 +#define KBD_BTN_2 0x11 +#define KBD_BTN_3 0x07 +#define KBD_BTN_4 0x12 +#define KBD_SW_UP 0x01 +#define KBD_SW_DN 0x02 +#define KBD_SW_LF 0x03 +#define KBD_SW_RT 0x04 +#define KBD_SW_OK 0x05 + // NeoPixels -#define NUMPIXELS 1 -Adafruit_NeoPixel pixels(NUMPIXELS, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800); +#define PIXELS_NUM_BOARD 1 +#define PIXELS_NUM_WING 1 +#define PIXELS_WING_PIN 11 +Adafruit_NeoPixel pixels_board(PIXELS_NUM_BOARD, PIN_NEOPIXEL, NEO_GRB + NEO_KHZ800); +Adafruit_NeoPixel pixels_wing(PIXELS_NUM_WING, PIXELS_WING_PIN, NEO_GRB + NEO_KHZ800); + +// Various loop handlers +void handlerKeyboard(); +void handlerBatteryLevel(); // UI screens void screenClear(); @@ -34,22 +54,29 @@ uint16_t RGB565(uint8_t r, uint8_t g, uint8_t b) { return ((r & 0b11111000) << 8) | ((g & 0b11111100) << 3) | (b >> 3); } +// Various things that need to be setup via the Arduino standard methods void setup() { // Setup red LED to indicate device is on (in case we disable NeoPixel battery level later) pinMode(3, OUTPUT); digitalWrite(3, HIGH); // Setup NeoPixels - pixels.begin(); - pixels.clear(); - pixels.setBrightness(10); + pixels_board.begin(); + pixels_wing.begin(); + pixels_board.clear(); + pixels_wing.clear(); + pixels_board.setBrightness(10); + pixels_wing.setBrightness(5); + + // Start with blank wing indicator + pixels_wing.show(); // Green : pixels.Color(0, 255, 0) // Yellow : pixels.Color(255, 255, 0) // Orange : pixels.Color(255, 128, 0) // Red : pixels.Color(255, 0, 0) - pixels.setPixelColor(0, pixels.Color(0, 0, 0)); - pixels.show(); + pixels_board.setPixelColor(0, pixels_board.Color(0, 0, 255)); + pixels_board.show(); // Setup TFT tft.begin(); @@ -57,40 +84,66 @@ void setup() { screenClear(); tft.println(""); tft.setFont(&FreeMono9pt7b); + + // Setup BBQ10Keyboard + Wire.begin(); + keyboard.begin(); + keyboard.setBacklight(0.5f); +} + +// Main program via the Arduino standard methods +void loop() { + // Handle keyboard events + handlerKeyboard(); + + // Update battery level as appropriate + handlerBatteryLevel(); +} + +void handlerKeyboard() { + // Check if keys were pressed + if (keyboard.keyCount()) { + // Get keyboard event + const BBQ10Keyboard::KeyEvent key = keyboard.keyEvent(); + + // Pick color for signaling a key was pressed (short or long press) + uint32_t keyboard_pixel_color = pixels_wing.Color(0, 0, 255); + if (key.state == BBQ10Keyboard::StateLongPress) { + keyboard_pixel_color = pixels_wing.Color(0, 255, 255); + } + + // Display indicator accordingly + if (key.state == BBQ10Keyboard::StatePress || key.state == BBQ10Keyboard::StateLongPress) { + pixels_wing.setPixelColor(0, keyboard_pixel_color); + pixels_wing.show(); + } + else { + pixels_wing.clear(); + pixels_wing.show(); + } + } } // Measure battery level and change NeoPixel accordingly -void batteryLevel() { +void handlerBatteryLevel() { measuredVBat = analogRead(VBATPIN); measuredVBat *= 2; // we divided by 2, so multiply back measuredVBat *= 3.3; // Multiply by 3.3V, our reference voltage measuredVBat /= 1024; // convert to voltage batteryPercent = measuredVBat / 3.3; if (batteryPercent >= 0.75) { - pixels.setPixelColor(0, pixels.Color(0, 255, 0)); + pixels_board.setPixelColor(0, pixels_board.Color(0, 255, 0)); } else if (batteryPercent >= 0.50) { - pixels.setPixelColor(0, pixels.Color(255, 255, 0)); + pixels_board.setPixelColor(0, pixels_board.Color(255, 255, 0)); } else if (batteryPercent >= 0.25) { - pixels.setPixelColor(0, pixels.Color(255, 128, 0)); + pixels_board.setPixelColor(0, pixels_board.Color(255, 128, 0)); } else { - pixels.setPixelColor(0, pixels.Color(255, 0, 0)); + pixels_board.setPixelColor(0, pixels_board.Color(255, 0, 0)); } - pixels.show(); - - if (DEBUG) { - Serial.print("VBat: " ); Serial.println(measuredVBat); - Serial.print("Bat %: "); Serial.println(batteryPercent); - } -} - -void loop() { - // Update battery level as appropriate - batteryLevel(); - - delay(250); + pixels_board.show(); } // Clear the screen