#ifndef SSD1322_H
#define SSD1322_H

#include "main.h"
#include <stdint.h>

// ⚡ ИСПРАВЛЕННЫЕ АДРЕСА для FSMC (A16 на PD11)
// Command: A16=0, Data: A16=1 (1<<16 = 0x20000)
#define SSD1322_COMMAND_ADDR    (*(volatile uint8_t*)0x60000000)  // A16=0
#define SSD1322_DATA_ADDR       (*(volatile uint8_t*)0x60020000)  // A16=1

// Параметры дисплея ER-OLEDM032-1
#define SSD1322_WIDTH           256    // Физическая ширина дисплея
#define SSD1322_HEIGHT          64     // Физическая высота дисплея

// Параметры контроллера SSD1322 (внутренняя память 480x128)
// Наша область 256x64 центрируется в 480x128
// Каждая колонка в SSD1322 = 4 пикселя (по 4 бита на пиксель)
#define SSD1322_TOTAL_COLS      120    // 480 пикселей / 4 = 120 колонок
#define SSD1322_TOTAL_ROWS      128    // Всего строк

// Смещение для центрирования 256x64 в 480x128
// (480 - 256) / 2 / 4 = 28 колонок смещение
// (128 - 64) / 2 = 32 строки смещение
#define SSD1322_COL_START     28      // Первая колонка
#define SSD1322_COL_END       91     // Последняя колонка (64 колонки)
#define SSD1322_ROW_START     32     // Центрирование: (128-64)/2 = 32
#define SSD1322_ROW_END       95     // 32 + 64 - 1 = 95

// Цвета (4-битные, 16 градаций серого)
#define SSD1322_BLACK           0x0
#define SSD1322_DARK_GRAY       0x4
#define SSD1322_GRAY            0x7
#define SSD1322_LIGHT_GRAY      0xB
#define SSD1322_WHITE           0xF

// Низкоуровневые функции
void SSD1322_WriteCommand(uint8_t cmd);
void SSD1322_WriteData(uint8_t data);
void SSD1322_Reset(void);

// Основные функции
void SSD1322_Init(void);
void SSD1322_SetContrast(uint8_t contrast);
void SSD1322_DisplayOn(void);
void SSD1322_DisplayOff(void);
void SSD1322_Clear(void);
void SSD1322_Update(void);
void SSD1322_UpdateArea(uint8_t x_start, uint8_t x_end, uint8_t y_start, uint8_t y_end);

// Функции рисования
void SSD1322_DrawPixel(int16_t x, int16_t y, uint8_t color);
void SSD1322_DrawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1, uint8_t color);
void SSD1322_DrawRect(int16_t x, int16_t y, int16_t w, int16_t h, uint8_t color);
void SSD1322_DrawFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint8_t color);
void SSD1322_DrawCircle(int16_t x0, int16_t y0, int16_t r, uint8_t color);
void SSD1322_DrawFillCircle(int16_t x0, int16_t y0, int16_t r, uint8_t color);

// Функции установки адресов
void SSD1322_SetColumnAddress(uint8_t start, uint8_t end);
void SSD1322_SetRowAddress(uint8_t start, uint8_t end);
void SSD1322_SetWindow(uint8_t col_start, uint8_t col_end, uint8_t row_start, uint8_t row_end);

// Работа с текстом
void SSD1322_SetCursor(int16_t x, int16_t y);
void SSD1322_SetTextColor(uint8_t color);
void SSD1322_WriteChar(char ch);
void SSD1322_WriteString(const char* str);
void SSD1322_WriteStringCentered(uint8_t y, const char* str);
void SSD1322_WriteStringAt(uint8_t x, uint8_t y, const char* str);

// Утилиты
uint16_t SSD1322_GetWidth(void);
uint8_t SSD1322_GetHeight(void);

// Буфер кадра
extern uint8_t SSD1322_frameBuffer[];

#endif
