/*
Demo for 8084 (Up/Down mode)

Software:
    Compiler: BC++ 3.1
    Compile mode: large
    Project: UpDown.c
             8084L.Lib
             8000L.Lib

Hardware: I-8000 MCU + 8084

Channel configurations:
    Xor=0 for Low Actived (signal from High to Low ==> change count)
    Low pass filters disabled
    all channel are set to Up/Down counter
    
Wiring:
    For Ch0, Ch1(A0,B0)
        A0 = Up counting
        B0 = Down counting
        
    For Ch2, Ch3(A1,B1)
        A1 = Up counting
        B1 = Down counting
        
    For Ch4, Ch5(A2,B2)
        A2 = Up counting
        B2 = Down counting
        
    For Ch6, Ch7(A3,B3)
        A3 = Up counting
        B3 = Down counting    
*/

/*              
[2004,Dec,23] by Kevin
    Use 8084 lib version 2.0.0
    
[2004,Mar,07] by Kevin
    Use 8084 lib version 2.0.1
    Clear all count at beginning.    
*/

#include "..\..\..\..\lib\vp2k.h"
#include "..\..\..\..\lib\8084W.h"
void main(void)
{
    int i,slot,channel,iRet;
    unsigned long T1,T2,T3;
    long Counter;
    int Overflow;
    unsigned int DIvalue;

    Print("/*********************************/\n\r");
    Print("/*   8084 demo (Up/Down mode)    */\n\r");
    Print("/*                               */\n\r");
    Print("/*   [2004,Dec,23]               */\n\r");
    Print("/*********************************/\n\r");
    Print("Press any key to clear counter (A0/B0).\n\r");
    Print("Press 'q' to quit.\n\r\n\r");
    
    Print("Slot number (0~7)=");
	Scanf("%d",&slot);
    iRet=i8084W_InitDriver(slot);
    if (iRet==(-1))
    {
		Print("Initiate 8084 on slot%d error!\n\r",slot);
		Print("  Cannot find 8084.");
	}
	else
	{
		Print("Initiate 8084 on slot%d ok.\n\r",slot);
        if(iRet>0)
        {
            Print("  Some Pulse/Dir channels have one count offset.\n\r");
            Print("  Return code:%02X\n\r",iRet);
        }
        
        for (channel=0; channel<8; channel++)
        {
            i8084W_SetXorRegister(slot,channel,0); // XOR=0 (Low Actived)
            i8084W_SetChannelMode(slot,channel,1); // Up/Down counter mode
                //mode 0: Pulse/Dir counter mode
                //     1: Up/Down counter mode
                //     2: frequency mode
                //     3: Up counter mode
            
            i8084W_SetLowPassFilter_Status(slot,channel,0); //Disable LPF
            i8084W_SetLowPassFilter_Us(slot,channel,1); //Set LPF width= 0.001 ms
        }
        
        //Clear all count at beginning.
        for (channel=0; channel<8; channel++)
        {
            i8084W_ClrCnt(slot,channel);
        }
        
        T1=*TimeTicks;
        T2=T1;
        for (;;)
        {
            T3=*TimeTicks;
            if ((T3-T1) >50) // Auto scan 8084 every 50 ms (one time one slot)
            {
                T1=T3;
                i8084W_AutoScan();
            }
            
            if ((T3-T2) >500) // Print frequency every 500 ms
            {
                T2=T3;

                i8084W_ReadCntUpDown(slot,0,&Counter,&Overflow);
                Print("[0]=%010ld ",Counter);
                                                
                i8084W_ReadCntUpDown(slot,1,&Counter,&Overflow);
                Print("[1]=%010ld ",Counter);
                
                i8084W_ReadCntUpDown(slot,2,&Counter,&Overflow);
                Print("[2]=%010ld ",Counter);
                
                i8084W_ReadCntUpDown(slot,3,&Counter,&Overflow);
                Print("[3]=%010ld ",Counter);
                
                i8084W_ReadCntUpDown(slot,4,&Counter,&Overflow);
                Print("[4]=%010ld ",Counter);
                
                i8084W_ReadCntUpDown(slot,5,&Counter,&Overflow);
                Print("[5]=%010ld ",Counter);
                
                i8084W_ReadCntUpDown(slot,6,&Counter,&Overflow);
                Print("[6]=%010ld ",Counter);
                
                i8084W_ReadCntUpDown(slot,7,&Counter,&Overflow);
                Print("[7]=%010ld ",Counter);  
                
                i8084W_ReadDI_Xor(slot,&DIvalue);
                Print("DI=%x\n",DIvalue);  
                                                           
            }
            
            if (Kbhit())
            {
                if(Getch()=='q') //Press 'q' to quit the program.
                {
                    return;
                }
                else //Press any key to clear counter 0.
                {
                    i8084W_ClrCnt_All(slot);
                    Print("Clear counter All.\n\r");
                }
            }
        }
    }
}

