#include <w5100.h>
#include <PCD8544.h>

PCD8544 lcd;

void printPaddedHex(uint8_t byte)
{
    char str[2];
    str[0] = (byte >> 4) & 0x0f;
    str[1] = byte & 0x0f;

    for (int i=0; i<2; i++) {
        // base for converting single digit numbers to ASCII is 48
        // base for 10-16 to become lower-case characters a-f is 87
        if (str[i] > 9) str[i] += 39;
        str[i] += 48;
        Serial.print(str[i]);
    }
}

void printMACAddress(const uint8_t address[6])
{
    for (uint8_t i = 0; i < 6; ++i) {
        printPaddedHex(address[i]);
        if (i < 5)
            Serial.print(':');
    }
    Serial.println();
}


int IPV4 = 0;
int IPV6 = 0;
int ARP = 0;
int PRO = 0;
int DOT1x = 0;
const byte mac_address[] = {
    0xae, 0x03, 0xf3, 0xc7, 0x08, 0x78
};

Wiznet5100 w5100;

void setup() {
    // Setup serial port for debugging
    Serial.begin(115200);
    lcd.begin(84, 48);
    w5100.begin(mac_address);
    lcd.setCursor(0, 1);
    lcd.print("   Network    ");
    lcd.setCursor(0, 2);
    lcd.print("  Ether Type   ");
    lcd.setCursor(0, 3);
    lcd.print("   Analysis   ");
    delay(1000);
    lcd.clear();
    delay(1000);
}


uint8_t buffer[800];
uint8_t send_count=0;

void loop() {

    uint16_t len = w5100.readFrame(buffer, sizeof(buffer));
    if ( len > 0 ) {
        
        if (buffer[12] == 0x08 && buffer[13] == 0x00) {
            IPV4 = IPV4 +1;
            }

        if (buffer[12] == 0x86 && buffer[13] == 0xDD) {
            IPV6 = IPV6 +1;
            }
            
        
        if (buffer[12] == 0x08 && buffer[13] == 0x06) {
            ARP = ARP +1;
            }
            
        if (buffer[12] == 0x88 && buffer[13] == 0x92) {
            PRO = PRO +1;
            }

        if (buffer[12] == 0x88 && buffer[13] == 0x8E) {
            DOT1x = DOT1x +1;
            }

            
    lcd.setCursor(0, 0);
    lcd.print("IPV4 pkts= ");
    lcd.println(IPV4);
    Serial.print("IPV4 packets = ");
    Serial.println(IPV4);
    lcd.setCursor(0, 1);
    lcd.print("IPV6 pkts= ");
    lcd.println(IPV6);
    Serial.print("IPV6 packets = ");
    Serial.println(IPV6);
    lcd.setCursor(0, 2);
    lcd.print("ARP pkts= ");
    lcd.println(ARP);
    Serial.print("ARP packets = ");
    Serial.println(ARP);
    lcd.setCursor(0, 3);
    lcd.print("Profinet= ");
    lcd.println(PRO);
    Serial.print("Profinet packets = ");
    Serial.println(PRO);    
    Serial.println();
    lcd.setCursor(0, 4);
    lcd.print("Dot-1x= ");
    lcd.println(DOT1x);
    Serial.print("Dot-1x= ");
    Serial.println(PRO);    
    Serial.println();
    }
}
