// // Varous system includes #include // // Various library includes #include #include // // #include #include #include // Various local includes #include "serial_debugger_GSLC.h" // Battery level measurement #define VBATPIN A6 float measuredVBat; int batteryPercent; // TFT Setup #define TFT_CS 9 #define TFT_DC 10 Adafruit_ILI9341 tft(TFT_CS, TFT_DC); #include #define CHARS_HORIZONTAL 28 #define CHARS_ROWS 13 CircularBuffer textBuffer; // 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 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(); // GUI Slice gslc_tsElemRef* m_pElemBatteryLevel= NULL; gslc_tsElemRef* m_pElemStatusText = NULL; gslc_tsElemRef* m_pElemText = NULL; gslc_tsElemRef* m_pTextSlider = NULL; static int16_t DebugOut(char ch) { if (ch == (char)'\n') Serial.println(""); else Serial.write(ch); return 0; } bool CbSlidePos(void* pvGui,void* pvElemRef,int16_t nPos); void setup() { Serial.begin(115200); // 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_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_board.setPixelColor(0, pixels_board.Color(0, 0, 255)); pixels_board.show(); // Setup BBQ10Keyboard Wire.begin(); keyboard.begin(); keyboard.setBacklight(0.5f); // GUI Slice (TFT is setup through GUI Slice) gslc_InitDebug(&DebugOut); InitGUIslice_gen(); } // Main program via the Arduino standard methods void loop() { // Handle keyboard events handlerKeyboard(); // Update battery level as appropriate handlerBatteryLevel(); // Update UI gslc_Update(&m_gui); } // Keyboard handler void handlerKeyboard() { // Check if keys were pressed if (keyboard.keyCount()) { // Get keyboard event const BBQ10Keyboard::KeyEvent key = keyboard.keyEvent(); char output[28]; snprintf(output, 28, "key: '%c' (dec %d, hex %02x)", key.key, key.key, key.key); for (int i=0; i= 75) { pixels_board.setPixelColor(0, pixels_board.Color(0, 255, 0)); colorForHeaderElements = GSLC_COL_GREEN; } else if (batteryPercent >= 50) { colorForHeaderElements = GSLC_COL_YELLOW; pixels_board.setPixelColor(0, pixels_board.Color(255, 255, 0)); } else if (batteryPercent >= 25) { colorForHeaderElements = GSLC_COL_ORANGE; pixels_board.setPixelColor(0, pixels_board.Color(255, 128, 0)); } else { colorForHeaderElements = GSLC_COL_RED; pixels_board.setPixelColor(0, pixels_board.Color(255, 0, 0)); } gslc_ElemXProgressSetVal(&m_gui, m_pElemBatteryLevel, batteryPercent); gslc_tsXProgress* pGauge = (gslc_tsXProgress*)gslc_GetXDataFromRef(&m_gui,m_pElemBatteryLevel,GSLC_TYPEX_PROGRESS,__LINE__); pGauge->colGauge = colorForHeaderElements; gslc_ElemSetTxtCol(&m_gui, m_pElemBatteryLevel, colorForHeaderElements); gslc_ElemSetTxtCol(&m_gui, m_pElemStatusText, colorForHeaderElements); // Update GUI and NeoPixel with battery status information gslc_Update(&m_gui); pixels_board.show(); } // Slider callback function bool CbSlidePos(void* pvGui,void* pvElemRef,int16_t nPos) { gslc_tsGui* pGui = (gslc_tsGui*)(pvGui); gslc_tsElemRef* pElemRef = (gslc_tsElemRef*)(pvElemRef); gslc_tsElem* pElem = gslc_GetElemFromRef(pGui,pElemRef); int16_t nVal; // From the element's ID we can determine which slider was updated. switch (pElem->nId) { case E_TXTSCROLL: // Fetch the slider position nVal = gslc_ElemXSliderGetPos(pGui,m_pTextSlider); break; default: break; } return true; } // // // // // // // //