/*
 * Copyright 2017, Data61
 * Commonwealth Scientific and Industrial Research Organisation (CSIRO)
 * ABN 41 687 119 230.
 *
 * This software may be distributed and modified according to the terms of
 * the GNU General Public License version 2. Note that NO WARRANTY is provided.
 * See "LICENSE_GPLv2.txt" for details.
 *
 * @TAG(DATA61_GPL)
 */

#pragma once

#include <stdint.h>
#include <utils/util.h>
//#define DBG_MAP
//#define DBG_PKT
//#define DBG_PRINT_PAYLOAD
//#define DBG_REG
//#define DBG_FEC
//#define DBG_BUF
//#define DBG_NET
//#define DBG_CLK

#ifdef DBG_MAP
#  define MAP_DEBUG(x) do{x;}while(0)
#else
#  define MAP_DEBUG(x) do{;}while(0)
#endif

#ifdef DBG_PKT
#  define PKT_DEBUG(x) do{x;}while(0)
#  ifdef DBG_PRINT_PAYLOAD
#    define DEBUG_PRINT_PAYLOAD(DEBUG_PRINT_PAYLOAD)
#  endif
#else
#  define PKT_DEBUG(x) do{;}while(0)
#endif

#ifdef DBG_FEC
#define FEC_DEBUG(x) do{x;}while(0)
#else
#define FEC_DEBUG(x) do{;}while(0)
#endif

#ifdef DBG_BUF
#define BUF_DEBUG(x) do{x;}while(0)
#else
#define BUF_DEBUG(x) do{;}while(0)
#endif

#ifdef DBG_REG
#define REG_DEBUG(x) do{x;}while(0)
#else
#define REG_DEBUG(x) do{;}while(0)
#endif

#ifdef DBG_NET
#define NET_DEBUG(x) do{x;}while(0)
#else
#define NET_DEBUG(x) do{;}while(0)
#endif

#ifdef DBG_CLK
#define CLK_DEBUG(x) do{x;} while(0)
#else
#define CLK_DEBUG(x) do{;} while(0)
#endif

#include <stdio.h>
#include <stdint.h>

#define COL_NET "\e[1;34m"
#define COL_IMP "\e[1;31m"
#define COL_FEC "\e[1;32m"
#define COL_RX  "\e[42;30m"
#define COL_TX  "\e[43;30m"
#define COL_ARP "\e[1;28m"
#define COL_PKT "\e[1;36m"
#define COL_DEF "\e[0;0m"

#define set_colour(x) printf(x);

#define cprintf(col, ...) do { \
        set_colour(col);       \
        ZF_LOGD(__VA_ARGS__);  \
        set_colour(COL_DEF);   \
        printf("\n");          \
    }while(0)

#define UNIMPLEMENTED() \
    do{\
        ZF_LOGF("unimplemented"); \
        while(1); \
    } while(0)

#ifdef DBG_PKT

static inline void print_mac(uint8_t* mac){
    int i;
    printf("%02x", *mac++);
    for(i = 0; i < 5; i++){
        printf(":%02x", *mac++);
    }
}

static inline void
print_type(uint8_t* p){
    uint32_t type = 0;
    int i;
    p += 6*2;
    for(i = 0; i < 2; i++){
        type = type << 8  | *p++;
    }
    switch(type){
    case 0x0806: printf("ARP"); break;
    case 0x0800: printf(" IP"); break;
    default: printf("UNKNOWN");
    }
    printf(" (0x%04x)", type);
}

static inline void print_val(uint8_t* p, int len){
    uint32_t val = 0;
    int i;
    for(i = 0; i < len; i++){
        val = val << 8 | *p++;
    }
    printf("%d", val);
}

static inline void print_packet(const char* col, void* packet, int length){
    cprintf(col, "packet 0x%x (%d bytes)", (uint32_t)packet, length);
    unsigned char* p = packet;
    printf(" dst MAC : ");  print_mac(p + 0);
    printf(" src MAC : ");  print_mac(p + 6); printf("\n");
    printf(" src port: ");  print_val(p +0x22, 2);
    printf(" dst port: ");  print_val(p +0x24, 2); printf("\n");
    printf(" type    : "); print_type(p + 0); printf("\n");
#if defined(DBG_PRINT_PAYLOAD)
    int i,j;
    for(i=0;i<length;i+=32){
        for(j=0;j<32 && length > i+j;j++){
            printf("%02x", *p++);
        }
        printf("\n");
    }
#endif
    printf("\n");
}
#endif

