#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_DEV_0 | U8G_I2C_OPT_NO_ACK | U8G_I2C_OPT_FAST);
bool useBuzzer = false;
// Joystick
float joystickX = 0.0;
float joystickY = 0.0;
bool joystickPressed = false;
bool joystickPressCheck = false;
bool joystickJustPressed = false;
// Cursor
int cursorX = 128 - 12;
int cursorY = 64 - 12;
// Menu
int selectedApp = 0;
bool appSelected = false;
// Keyboard App
const char* keyboardDisplay = "";
// Bitmaps
static unsigned char cursorBitmap[] = {
0x01, 0x00, 0x06, 0x00, 0x1e, 0x00, 0x7c, 0x00, 0xfc, 0x00, 0x78, 0x00,
0x38, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00 };
char *apps[] =
{
"Keyboard",
"Snake"
};
void setup()
{
// Joystick
pinMode(2, INPUT);
digitalWrite(2, HIGH);
Serial.begin(115200);
// Buzzer
if (useBuzzer)
Serial.begin(9600);
// Screen
u8g.setFont(u8g_font_tpssb);
u8g.setColorIndex(1);
}
void loop()
{
// Joystick
joystickX = getJoystickX();
joystickY = getJoystickY();
joystickPressed = getJoystickPressed();
// Cursor
cursorX += round(joystickX * 10);
cursorY -= round(joystickY * 10);
if (cursorX < 0) cursorX = 0;
if (cursorX > (128 - 10)) cursorX = (128 - 1);
if (cursorY < 0) cursorY = 0;
if (cursorY > (64 - 10)) cursorY = (64 - 1);
// Click
joystickJustPressed = checkForPress();
// Screen
u8g.firstPage();
do
{
if (!appSelected)
{
u8g.setPrintPos(5, 15);
for (int i = 0; i < (sizeof(apps) / sizeof(apps[0])); i++)
{
if (buttonPressed(2, (17 * i) + 2, 100, 15, apps[i]))
{
selectedApp = i;
appSelected = true;
}
}
}
else
{
if (selectedApp == 0)
{
if (buttonPressed(2, 2, 10, 13, "q")) keyboardDisplay = join(keyboardDisplay, "q");
if (buttonPressed(14, 2, 10, 13, "w")) keyboardDisplay = join(keyboardDisplay, "w");
if (buttonPressed(26, 2, 10, 13, "e")) keyboardDisplay = join(keyboardDisplay, "e");
if (buttonPressed(38, 2, 10, 13, "r")) keyboardDisplay = join(keyboardDisplay, "r");
if (buttonPressed(50, 2, 10, 13, "t")) keyboardDisplay = join(keyboardDisplay, "t");
if (buttonPressed(62, 2, 10, 13, "y")) keyboardDisplay = join(keyboardDisplay, "y");
if (buttonPressed(74, 2, 10, 13, "u")) keyboardDisplay = join(keyboardDisplay, "u");
if (buttonPressed(86, 2, 10, 13, "i")) keyboardDisplay = join(keyboardDisplay, "i");
if (buttonPressed(98, 2, 10, 13, "o")) keyboardDisplay = join(keyboardDisplay, "o");
if (buttonPressed(110, 2, 10, 13, "p")) keyboardDisplay = join(keyboardDisplay, "p");
if (buttonPressed(2, 17, 10, 13, "a")) keyboardDisplay = join(keyboardDisplay, "a");
if (buttonPressed(14, 17, 10, 13, "s")) keyboardDisplay = join(keyboardDisplay, "s");
if (buttonPressed(26, 17, 10, 13, "d")) keyboardDisplay = join(keyboardDisplay, "d");
if (buttonPressed(38, 17, 10, 13, "f")) keyboardDisplay = join(keyboardDisplay, "f");
if (buttonPressed(50, 17, 10, 13, "g")) keyboardDisplay = join(keyboardDisplay, "g");
if (buttonPressed(62, 17, 10, 13, "h")) keyboardDisplay = join(keyboardDisplay, "h");
if (buttonPressed(74, 17, 10, 13, "j")) keyboardDisplay = join(keyboardDisplay, "j");
if (buttonPressed(86, 17, 10, 13, "k")) keyboardDisplay = join(keyboardDisplay, "k");
if (buttonPressed(98, 17, 10, 13, "l")) keyboardDisplay = join(keyboardDisplay, "l");
if (buttonPressed(110, 17, 10, 13, "z")) keyboardDisplay = join(keyboardDisplay, "z");
if (buttonPressed(2, 32, 10, 13, "x")) keyboardDisplay = join(keyboardDisplay, "x");
if (buttonPressed(14, 32, 10, 13, "c")) keyboardDisplay = join(keyboardDisplay, "c");
if (buttonPressed(26, 32, 10, 13, "v")) keyboardDisplay = join(keyboardDisplay, "v");
if (buttonPressed(38, 32, 10, 13, "b")) keyboardDisplay = join(keyboardDisplay, "b");
if (buttonPressed(50, 32, 10, 13, "n")) keyboardDisplay = join(keyboardDisplay, "n");
if (buttonPressed(62, 32, 10, 13, "m")) keyboardDisplay = join(keyboardDisplay, "m");
if (buttonPressed(74, 32, 10, 13, " ")) keyboardDisplay = join(keyboardDisplay, " ");
if (buttonPressed(86, 32, 34, 13, "DEL")) keyboardDisplay = backspace(keyboardDisplay);
if (buttonPressed(116, 47, 10, 13, "<")) appSelected = false;
u8g.drawStr(3, 60, keyboardDisplay);
}
}
u8g.drawXBM(cursorX, cursorY, 10, 10, cursorBitmap);
joystickJustPressed = false;
}
while ( u8g.nextPage() );
}
bool checkForPress()
{
if (joystickPressCheck != joystickPressed)
{
bool returnWhat = false;
if (joystickPressCheck == false)
returnWhat = true;
joystickPressCheck = joystickPressed;
return returnWhat;
}
return false;
}
float getJoystickX() { return 0 - (analogRead(0) / 1023.0 * 2 - 1); }
float getJoystickY() { return analogRead(1) / 1023.0 * 2 - 1; }
bool getJoystickPressed() { return digitalRead(2) == 0 ? true : false; }
bool buttonPressed(int x, int y, int w, int h, const char* text)
{
u8g.drawBox(x, y, w, h);
u8g.setColorIndex(0);
u8g.drawStr(x + 1, y + 11, text);
u8g.setColorIndex(1);
if (cursorX > (x - 1) && cursorX < (x + (w + 1)) && cursorY > (y - 1) && cursorY < (y + (h + 1)) && joystickJustPressed)
return true;
return false;
}
char* join(char* str1, char* str2)
{
char* result = (char*)malloc(strlen(str1) + strlen(str2) + 1);
strcpy(result, str1);
strcat(result, str2);
return result;
}
char* backspace(char* str)
{
char* result = str;
result[strlen(result) - 1] = '\0';
return result;
}