#include <MD_MAX72xx.h>
#include <SPI.h>
#include "StandbyAnimation.h"
#include "CoreGraphics.h"
#include "InvaderAnim.h"
// ====================================================================
// 2. HARDWARE CONFIG & FRAMEBUFFER
// ====================================================================
#define HARDWARE_TYPE MD_MAX72XX::PAROLA_HW
#define MAX_DEVICES 4 // Ubah sesuai jumlah modul (misal: 4 modul = 32 pixel)
#define DATA_PIN 23
#define CS_PIN 5
#define CLK_PIN 18
#define WIDTH (MAX_DEVICES * 8)
#define HEIGHT 8
MD_MAX72XX mx = MD_MAX72XX(HARDWARE_TYPE, DATA_PIN, CLK_PIN, CS_PIN, MAX_DEVICES);
uint8_t framebuffer[WIDTH * HEIGHT];
// Instansiasi Objek Animasi Invader
InvaderAnim invaderAnim(false);
void setup() {
mx.begin();
mx.control(MD_MAX72XX::INTENSITY, 8);
mx.clear();
}
void renderFBToMAX7219(uint8_t* fb, uint8_t w, uint8_t h) {
mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::OFF);
mx.clear();
for (int x = 0; x < w; x++) {
for (int y = 0; y < h; y++) {
if (fb[y * w + x] > 0) {
mx.setPoint(y, x, true);
}
}
}
mx.control(MD_MAX72XX::UPDATE, MD_MAX72XX::ON);
}
void loop() {
static uint32_t virtualTime = 0;
clearFB(framebuffer, WIDTH, HEIGHT);
invaderAnim.update(framebuffer, WIDTH, HEIGHT, virtualTime);
renderFBToMAX7219(framebuffer, WIDTH, HEIGHT);
virtualTime += 20;
delay(20);
}