#include <SPI.h>
#include <Ethernet.h>
#include <LedControl.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress ip(192, 168, 1, 100);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);

EthernetServer server(80);
LedControl matrix = LedControl(12, 11, 10, 1);

void setup() {
  Ethernet.begin(mac, ip, gateway, subnet);
  server.begin();
  matrix.shutdown(0, false);
  matrix.setIntensity(0, 8);
  matrix.clearDisplay(0);
}

void loop() {
  EthernetClient client = server.available();

  if (client) {
    String command = "";
    while (client.connected()) {
      if (client.available()) {
        char c = client.read();
        command += c;
      }
    }

    processCommand(command);
    client.stop();
  }
}

void processCommand(String cmd) {
  if (cmd == "HELLO") {
    displayText("HELLO");
  } else if (cmd == "SMILE") {
    displayImage(smileImage);
  }
}

void displayText(String text) {
  matrix.clearDisplay(0);
  int len = text.length();
  for (int i = 0; i < len; i++) {
    char c = text.charAt(i);
    int charIndex = c - ' ';
    if (charIndex >= 0 && charIndex < 96) {
      for (int row = 0; row < 8; row++) {
        byte rowData = pgm_read_byte_near(font[charIndex] + row);
        matrix.setRow(0, row, i * 8, rowData);
      }
    }
  }
}

byte smileImage[8] = {
  B00111100,
  B01000010,
  B10100101,
  B10000001,
  B10100101,
  B10011001,
  B01000010,
  B00111100
};

const byte font[][8] = {
  // Define your custom font here (ASCII characters)
  // Example: font data for characters ' ' to '~'
};
