#include <MD_MAX72xx.h>

#define MAX_DEVICES 4

const int maxX = 32-1;
const int maxY = 8-1;

#define CLK_PIN 18   // ESP32 SCLK (根据你的实际连接修改)
#define DATA_PIN 23  // ESP32 MOSI (根据你的实际连接修改)
#define CS_PIN   21   // ESP32 CS (根据你的实际连接修改)

#define VERT_PIN 34  // 模拟输入,用于读取摇杆的垂直轴 (根据你的实际连接修改)
#define HORZ_PIN 35  // 模拟输入,用于读取摇杆的水平轴 (根据你的实际连接修改)
#define SEL_PIN  32  // 数字输入,用于读取摇杆按钮 (根据你的实际连接修改)

MD_MAX72XX mx = MD_MAX72XX(MD_MAX72XX::PAROLA_HW, CS_PIN, MAX_DEVICES);

int x = 0;
int y = 0;

void setup() {
  Serial.begin(115200);  // 初始化串口,波特率设置为115200
  mx.begin();
  mx.control(MD_MAX72XX::INTENSITY, MAX_INTENSITY / 2);
  mx.clear();

  pinMode(VERT_PIN, INPUT);
  pinMode(HORZ_PIN, INPUT);
  pinMode(SEL_PIN, INPUT_PULLUP);
}

void loop() {
  // 读取摇杆的水平和垂直轴
  int horz = analogRead(HORZ_PIN);
  int vert = analogRead(VERT_PIN);
  int sel = digitalRead(SEL_PIN);

  // 输出调试信息
  Serial.print("Horizontal: ");
  Serial.print(horz);
  Serial.print(" | Vertical: ");
  Serial.print(vert);
  Serial.print(" | Button: ");
  Serial.println(sel == LOW ? "Pressed" : "Released");

  // 根据摇杆输入更新位置
  if (vert < 1000) {
    y = min(y + 1, maxY);
  }
  if (vert > 2048) {
    y = max(y - 1, 0);
  }
  if (horz > 2048) {
    x = min(x + 1, maxX);
  }
  if (horz < 2048) {
    x = max(x - 1, 0);
  }

  // 如果按钮按下,清除显示
  if (sel == LOW) {
    mx.clear();
  }

  // 更新 LED 矩阵显示
  mx.setPoint(y, x, true);
  mx.update();

  delay(100);  // 设置延时,以便能更清晰地观察调试信息
}