#include <Adafruit_GFX.h>
#include <Adafruit_ILI9341.h>
#include <SPI.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include "driver/adc.h"
// --- Brochage (adapter si besoin) ---
#define TFT_CS 5
#define TFT_DC 2
#define TFT_RST 4 // Peut être -1 si RST cablé au 3V3
#define LINES 320
#define COLUMNS 240
bool **cells;
bool **nextCells;
uint32_t generation;
Adafruit_ILI9341 tft(TFT_CS, TFT_DC, TFT_RST);
void setup() {
// Init écran
tft.begin(); // auto-detect ILI9341
tft.setRotation(0); // 0 = portrait
tft.fillScreen(ILI9341_BLACK);
// // Carré contour (100x100) en vert
// uint16_t x = 20, y = 20, side = 100;
// tft.drawRect(x, y, side, side, ILI9341_GREEN);
// // Carré rempli (80x80) en bleu
// tft.fillRect(140, 40, 80, 80, ILI9341_BLUE);
Serial.begin(115200);
initRandomSeed(42);
createTab(&cells, LINES, COLUMNS);
createTab(&nextCells, LINES, COLUMNS);
fillTabRand(cells, LINES, COLUMNS);
drawCurrent();
}
void loop() {
// rien
}
void createTab(bool ***tab, int lines, int columns) {
*tab = (bool **)malloc(sizeof(bool*) * lines);
for (int i = 0; i < lines; i++) {
(*tab)[i] = (bool *)malloc(sizeof(bool) * columns);
}
}
void fillTabRand(bool **tab, int lines, int columns) {
for (int i = 0; i < lines; i++) {
for (int j = 0; j < columns; j++) {
tab[i][j] = getRandBool();
}
}
}
bool getRandBool() {
return rand() % 5 == 1;
}
void initRandomSeed(uint16_t preSeed) {
adc1_config_width(ADC_WIDTH_BIT_12);
adc1_config_channel_atten(ADC1_CHANNEL_7, ADC_ATTEN_DB_11); // GPIO 35
uint32_t entropy = 0;
for (int i = 0; i < 32; i++) {
entropy <<= 1;
entropy |= adc1_get_raw(ADC1_CHANNEL_7) & 1; // Prend le bit LSB
safeDelay(5);
}
uint32_t t = (uint32_t)time(NULL);
uint32_t seed = entropy ^ t ^ preSeed;
srand(seed);
Serial.printf("Seed initialisé : ADC=%u, time=%lu, final=%u\n", entropy, t, seed);
}
void drawCurrent() {
for (int i = 0; i < LINES; i++) {
for (int j = 0; j < COLUMNS; j++) {
tft.writePixel(j, i, cells[i][j] ? ILI9341_GREEN : ILI9341_BLACK);
Serial.printf("Cell [%d,%d] : %s\n", i, j, cells[i][j] ? "true" : "false");
}
}
}
void safeDelay(int ms)
{
for (int i = 0; i < ms; i++) {
delay(1);
}
}