#include <string.h>
#include <stdio.h>
#include "cardinfo.h"
#include "errors.h"
#include "serial.h"
#include "sys_defs.h"

#define CARD_VAR_OUT   0
#define CARD_VAR_IN    1

#define INOUT_SHIFT 5

static char msg_buf[64];

int cardInfoAddVar(const char* name, unsigned char inout, CardInfo* card)
{   
    unsigned int len;
    
    if (name == NULL || card == NULL) {
        return ERR_FAILURE;
    }
    
    len = strlen(name);
    
    /* Make sure there's enough room */
    if (len + 2 >= CARDINFO_VAR_LEN)
    {
        return ERR_FAILURE;
    }
    
    strcpy(card->varNames + card->vnoff, name);
    card->vnoff += len;
    *(card->varNames + card->vnoff) = 0;
    card->vnoff++;
    
    *(card->varNames + card->vnoff) = inout;
    card->vnoff++;
    
    return ERR_SUCCESS;
}

void cardInfoDump(const CardInfo* card)
{
    unsigned int i;
    unsigned int offset = 0;
    unsigned int inout;
    char* nameBuf;
    char* varPtr;
    
    if (card == NULL)
    {
        return;
    }

    sprintf(msg_buf, "Card Type: %d\r\n", card->typeId);
    serPutString(SER_CONSOLE, msg_buf);
    
    sprintf(msg_buf, "Card Name: %s\r\n", card->name);
    serPutString(SER_CONSOLE, msg_buf);

    serPutString(SER_CONSOLE, "Variable Names:\r\n");
    for (i = 0; i < card->varCount; i++)
    {
        nameBuf = card->varNames + offset;
        serPutByte(SER_CONSOLE, '\t');
        serPutString(SER_CONSOLE, nameBuf);
        
        offset += strlen(nameBuf);
        inout = card->varNames[++offset];
        offset++;
        
        switch (inout)
        {
            case CARD_VAR_IN:
                serPutString(SER_CONSOLE, "(input)\r\n");
                break;
            case CARD_VAR_OUT:
                serPutString(SER_CONSOLE, "(output)\r\n");
                break;
            default:
                serPutString(SER_CONSOLE, "?\r\n");
        }
    }
}
