////////////////////////////////////////////////////////////////
// File - prvdrv_diag.c
//
// This is a diagnostics application for accessing the PRVDRV card.
// Code was generated by Driver Wizard.
// It accesses the hardware via WinDriver functions.
// 
////////////////////////////////////////////////////////////////

#include "prvdrv_lib.h"
#include <stdio.h>

// input of command from user
static char line[256];

char *PRVDRV_GetAddrSpaceName(PRVDRV_ADDR addrSpace)
{
    return
		addrSpace==PRVDRV_IORange1 ? "IORange1" :
        addrSpace==PRVDRV_IORange2 ? "IORange2" :
        addrSpace==PRVDRV_IORange3 ? "IORange3" :
        addrSpace==PRVDRV_IORange4 ? "IORange4" :
        "Invalid";
}

void PRVDRV_AccessRanges(PRVDRV_HANDLE hPRVDRV)
{
    int cmd, cmd2, i;
    DWORD addr, data;
    PRVDRV_ADDR ad_sp = 0;
    PRVDRV_MODE ad_mode = PRVDRV_MODE_DWORD;

    do
    {
        printf ("Access the board's memory and IO ranges\n");
        printf ("---------------------------------------\n");
        printf ("1. Change active memory space: %s\n",PRVDRV_GetAddrSpaceName(ad_sp));
        printf ("2. Toggle active mode: %s\n", 
            ad_mode==PRVDRV_MODE_BYTE ? "BYTE (8 bit)" :
            ad_mode==PRVDRV_MODE_WORD ? "WORD (16 bit)" : "DWORD (32 bit)");
        printf ("3. Read from board\n");
        printf ("4. Write to board\n");
        printf ("99. Back to main menu\n");
        printf ("\n");
        printf ("Enter option: ");
        cmd = 0;
        gets(line);
        sscanf(line, "%d",&cmd);
        switch (cmd)
        {
        case 1:
            printf ("Choose memory or IO space:\n");
            printf ("--------------------------\n");
            for (i=0; i<PRVDRV_ITEMS; i++)
            {
                printf ("%d. %s\n", i+1, PRVDRV_GetAddrSpaceName(i));
            }
            printf ("Enter option: ");
            cmd2 = 99;
            gets(line);
            sscanf(line, "%d",&cmd2);
            if (cmd2>=1 && cmd2<PRVDRV_ITEMS+1)
            {
                ad_sp = cmd2-1;
            }
            break;
        case 2:
            ad_mode = (ad_mode + 1) % 3;
            break;
        case 3:
            printf ("Enter offset to read from: ");
            gets(line);
            sscanf (line, "%x", &addr);
            switch (ad_mode)
            {
            case PRVDRV_MODE_BYTE:
                data = PRVDRV_ReadByte(hPRVDRV, ad_sp, addr);
                break;
            case PRVDRV_MODE_WORD:
                data = PRVDRV_ReadWord(hPRVDRV, ad_sp, addr);
                break;
            case PRVDRV_MODE_DWORD:
                data = PRVDRV_ReadDword(hPRVDRV, ad_sp, addr);
                break;
            }
            printf ("Value read: %x\n", data);
            break;
        case 4:
            printf ("Enter offset to write to: ");
            gets(line);
            sscanf (line,"%x", &addr);
            printf ("Enter data to write %s: ",
                ad_mode==PRVDRV_MODE_BYTE ? "BYTE (8 bit)" :
                ad_mode==PRVDRV_MODE_WORD ? "WORD (16 bit)" : "DWORD (32 bit)");
            gets(line);
            sscanf (line, "%x",&data);
            switch (ad_mode)
            {
            case PRVDRV_MODE_BYTE:
                PRVDRV_WriteByte(hPRVDRV, ad_sp, addr, (BYTE) data);
                break;
            case PRVDRV_MODE_WORD:
                PRVDRV_WriteWord(hPRVDRV, ad_sp, addr, (WORD) data);
                break;
            case PRVDRV_MODE_DWORD:
                PRVDRV_WriteDword(hPRVDRV, ad_sp, addr, data);
                break;
            }
            break;
        }
    } while (cmd!=99);
}

int main(int argc, char *argv[])
{
    int cmd;
    PRVDRV_HANDLE hPRVDRV = NULL;

    PRVDRV_RegisterWinDriver();

    printf ("PRVDRV diagnostic utility.\n");
    printf ("Application accesses hardware using WinDriver.\n");

    if (!PRVDRV_Open(&hPRVDRV))
    {
        printf("error while opening PRVDRV:\n");
        printf("%s", PRVDRV_ErrorString);
        return 0;
    }

    do
    {
        printf ("\n");
        printf ("PRVDRV main menu\n");
        printf ("-------------------\n");
        printf ("2. Access PRVDRV memory and IO ranges\n");
        printf ("99. Exit\n");
        printf ("Enter option: ");
        cmd = 0;
        gets(line);
        sscanf(line, "%d",&cmd);
        switch (cmd)
        {
        case 2: // Access PRVDRV memory and IO ranges
            PRVDRV_AccessRanges(hPRVDRV);
            break;
        }
    } while (cmd!=99);

    PRVDRV_Close(hPRVDRV);

    return 0;
}

