#include #include "128x64OLED.h" #include "MiniFont.h" #include "tahoma16.h" #include "protocol.h" #include "display.h" #include "pins.h" #include "BluetoothAbstract.h" #include "OLEDconsts.h" #include "BTCWifi.h" #include "BluetoothAbstract.h" #include "Screen1.h" #include "Screen2.h" #include "Screen3.h" #include "Screen4.h" #include "KeyPad.h" #include "helpers.h" #include "clock.h" #define MAXIFONT tahoma_16ptFontInfo #define MINIFONT miniFontInfo #define X_BATT_ICON 95 #define Y_BATT_ICON 0 #define X_WIFI_ICON 22 #define Y_WIFI_ICON 0 #define X_BT_ICON 12 #define Y_BT_ICON 0 #define MINI_BATTLABEL void showBTicon(C128x64_OLED& display); void showWifiIcon(C128x64_OLED& display); void showBatteryIcon(C128x64_OLED& display, float voltage); void switchScreen(); static int currentScreen = 0; const int maxScreens = 4; // // **** NOTE: There are two very lame libaries conspiring to make life difficult **** // A/ The ESP32 SPI.cpp library instatiates an instance of SPI, using the VSPI port (and pins) // B/ The Adfruit_SH1106 library has hard coded "SPI" as the SPI port instance // // As an ESP32 has a pin multiplexer, this is very bad form. // The design uses the defacto HSPI pins (and port), // You **MUST comment out the SPIClass SPI(VSPI);** at the end of the ESP32 SPI library // then we declare "SPI" here, which will use HSPI!!!! // 128 x 64 OLED support SPIClass SPI; // default constructor opens HSPI on standard pins : MOSI=13,CLK=14,MISO=12(unused) C128x64_OLED display(OLED_DC_pin, -1, OLED_CS_pin); void initOLED() { currentScreen = 1; SPI.setFrequency(8000000); // SH1106_SWITCHCAPVCC = generate display voltage from 3.3V internally display.begin(SH1106_SWITCHCAPVCC, 0, false); // Show initial display buffer contents on the screen -- display.display(); switchScreen(); } void animateOLED() { switch(currentScreen) { case 0: animateScreen1(display); break; case 1: animateScreen2(display); break; case 2: animateScreen3(display); break; case 3: animateScreen4(display); break; } } void updateOLED(const CProtocol& CtlFrame, const CProtocol& HtrFrame) { display.clearDisplay(); // standard header items //Bluetooth if(getBluetoothClient().isConnected()) showBTicon(display); // WiFi if(isWifiConnected()) { showWifiIcon(display); #ifdef DEMO_AP_MODE display.fillRect(X_WIFI_ICON + 8, Y_WIFI_ICON + 5, 10, 7, BLACK); display.setFontInfo(&MINIFONT); // select Mini Font display.setCursor(X_WIFI_ICON+9, Y_WIFI_ICON+6); display.print("AP"); display.setFontInfo(NULL); #endif } // battery float voltage = HtrFrame.getVoltage_Supply() * 0.1f; showBatteryIcon(display, voltage); showTime(display); switch(currentScreen) { case 0: showScreen1(display, CtlFrame, HtrFrame); break; case 1: showScreen2(display, CtlFrame, HtrFrame); break; case 2: showScreen3(display); break; case 3: showScreen4(display); break; } } void showBTicon(C128x64_OLED& display) { display.drawBitmap(X_BT_ICON, Y_BT_ICON, BTicon, W_BT_ICON, H_BT_ICON, WHITE); } void showWifiIcon(C128x64_OLED& display) { display.drawBitmap(X_WIFI_ICON, Y_WIFI_ICON, wifiIcon, W_WIFI_ICON, H_WIFI_ICON, WHITE); } void showBatteryIcon(C128x64_OLED& display, float voltage) { display.drawBitmap(X_BATT_ICON, Y_BATT_ICON, BatteryIcon, W_BATT_ICON, H_BATT_ICON, WHITE); #ifdef MINI_BATTLABEL char msg[16]; sprintf(msg, "%.1fV", voltage); int xPos = X_BATT_ICON + 7 - strlen(msg) * 2; display.setCursor(xPos, Y_BATT_ICON+H_BATT_ICON+2); display.setFontInfo(&MINIFONT); // select Mini Font display.print(msg); display.setFontInfo(NULL); #else display.setCursor(85, 12); display.setTextColor(WHITE); display.print(voltage, 1); display.print("V"); #endif // nominal 10.5 -> 13.5V bargraph int Capacity = (voltage - 10.7) * 4; if(Capacity < 0) Capacity = 0; if(Capacity > 11) Capacity = 11; display.fillRect(X_BATT_ICON+2 + Capacity, Y_BATT_ICON+2, W_BATT_ICON-4-Capacity, 6, BLACK); } void nextScreen() { currentScreen++; if(currentScreen >= maxScreens) { currentScreen = 0; } switchScreen(); } void prevScreen() { currentScreen--; if(currentScreen < 0) { currentScreen = maxScreens-1; } switchScreen(); } void switchScreen() { switch(currentScreen) { case 0: KeyPad.setCallback(keyhandlerScreen1); break; case 1: KeyPad.setCallback(keyhandlerScreen2); break; case 2: KeyPad.setCallback(keyhandlerScreen3); break; case 3: KeyPad.setCallback(keyhandlerScreen4); break; } reqDisplayUpdate(); }