#include <Adafruit_SSD1306.h>
#include <Wire.h>
#include <ArduinoJson.h>
#include "sprites.h"
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
#define OLED_RESET -1 // Reset pin # (or -1 if sharing Arduino reset pin)
#define SCREEN_ADDRESS 0x3C ///< See datasheet for Address; 0x3D for 128x64, 0x3C for 128x32
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
#define BUTTON_UP 5
#define BUTTON_SELECT 6
#define BUTTON_DOWN 7
#define BUTTON_UP_PIN 7
#define BUTTON_DOWN_PIN 5
#define BUTTON_SELECT_PIN 6
// Структура для предмета в инвентаре
struct Item {
int id;
String name;
int quantity;
void (*action)(void); // Указатель на функцию, связанную с предметом
};
// Пример функции, связанной с предметом
void exampleFunction() {
Serial.println("Action performed!");
}
// Максимальное количество предметов в инвентаре
const int maxItems = 10;
Item inventory[maxItems]; // Массив для хранения предметов
int itemCount = 0; // Текущее количество предметов в инвентаре
int subMenuSelection = 0; // Текущий выбор в подменю
const int subMenuItemsCount = 3; // Количество пунктов в подменю
void setup() {
// Инициализация пинов кнопок как входных
pinMode(BUTTON_UP_PIN, INPUT_PULLUP);
pinMode(BUTTON_DOWN_PIN, INPUT_PULLUP);
pinMode(BUTTON_SELECT_PIN, INPUT_PULLUP);
// Остальная часть setup()
Serial.begin(9600);
// Инициализация дисплея
if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;);
}
display.display();
delay(2000); // Pause for 2 seconds
display.clearDisplay();
// TODO: Настройка кнопок
// Инициализация системы
// Добавление тестовых предметов в инвентарь
addItem(1, "Sword", 1, exampleFunction);
addItem(2, "Potion", 5, exampleFunction);
addItem(3, "Key", 1, exampleFunction);
}
int currentSelection = 0; // Текущий выбранный предмет
bool inSubMenu = false; // Флаг, показывающий, находимся ли мы в подменю предмета
void loop() {
// Здесь будет код для чтения состояния кнопок и логика навигации
// Предположим, что функции readButtonUp(), readButtonDown(), readButtonSelect() уже реализованы
if (readButtonUp()) {
if (!inSubMenu) {
currentSelection = max(0, currentSelection - 1);
} else {
subMenuSelection = max(0, subMenuSelection - 1);
}
} else if (readButtonDown()) {
if (!inSubMenu) {
currentSelection = min(itemCount - 1, currentSelection + 1);
} else {
subMenuSelection = min(subMenuItemsCount - 1, subMenuSelection + 1);
}
} else if (readButtonSelect()) {
if (inSubMenu) {
// Выполнение выбранного действия
executeSubMenuAction(subMenuSelection);
inSubMenu = false; // Выход из подменю после выбора действия
} else {
inSubMenu = true; // Вход в подменю
subMenuSelection = 0; // Сброс выбора в подменю
}
}
displayInventory();
}
// Функция для добавления предмета в инвентарь
void addItem(int id, String name, int quantity, void (*action)(void)) {
if (itemCount < maxItems) {
inventory[itemCount++] = {id, name, quantity, action};
} else {
Serial.println("Inventory is full!");
}
}
void removeItem(int id) {
for (int i = 0; i < itemCount; i++) {
if (inventory[i].id == id) {
// Сдвигаем все элементы после удаляемого на одну позицию влево
for (int j = i; j < itemCount - 1; j++) {
inventory[j] = inventory[j + 1];
}
itemCount--; // Уменьшаем количество предметов в инвентаре
return;
}
}
Serial.println("Item not found!");
}
void displayInventory() {
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(SSD1306_WHITE);
display.setCursor(0,0);
if (!inSubMenu) {
// Отображение списка предметов
for (int i = 0; i < itemCount; i++) {
display.println((i == currentSelection ? "> " : " ") + inventory[i].name);
}
} else {
// Отображение подменю
String subMenuItems[] = {"Use", "Info", "Delete"};
for (int i = 0; i < subMenuItemsCount; i++) {
display.println((i == subMenuSelection ? "> " : " ") + subMenuItems[i]);
}
}
display.display();
}
bool readButtonUp() {
return digitalRead(BUTTON_UP_PIN) == LOW; // Предполагаем, что кнопка активна при низком уровне
}
bool readButtonDown() {
return digitalRead(BUTTON_DOWN_PIN) == LOW;
}
bool readButtonSelect() {
return digitalRead(BUTTON_SELECT_PIN) == LOW;
}
void executeSubMenuAction(int action) {
switch(action) {
case 0: // Use
Serial.println("Using item: " + inventory[currentSelection].name);
// Здесь может быть вызов функции, связанной с предметом
inventory[currentSelection].action();
break;
case 1: // Info
Serial.println("Item info: " + inventory[currentSelection].name);
// Здесь может быть отображение дополнительной информации о предмете
break;
case 2: // Delete
Serial.println("Deleting item: " + inventory[currentSelection].name);
removeItem(inventory[currentSelection].id);
if (currentSelection >= itemCount) { // Проверка на выход за границы после удаления
currentSelection = max(0, itemCount - 1);
}
break;
}
}