/*
87K_DI.c :This demo program is for 87K Digital Input Module in Com0. 
          User must to know: 
              1.The com0's baudrate is 115200. User don't modify it.
              2.User need to know the module's location in the MCU.                           
                                                                           
Compiler: BC++ 3.1,                                                            
          Turbo C ++ 1.01(3.01) (free from http://community.borland.com/museum)
          MSC 6.0,                                                             
          MSVC 1.52.                                                           
                                                                               
Compile mode: large                                                            
                                                                               
Project: 87K_DI.c                                                               
         ..\Lib\(8000.Lib, 8000E.lib)   
                                                                               
Hardware: 8000

[24 May,2005] by Bill
*/
#include <stdio.h>
#include "..\..\lib\vp2k.h"

int Read87K_DI(int Slot,int TotalChannel,unsigned long *Value);

void main()
{
    int iSlot,iRet,TotalChannel;
    unsigned long iValue;
    unsigned char cTemp[10];   
    
    InitLib();
    
    Print("/*******************/\n\r"); 
    Print("/*    87K_DI demo  */\n\r"); 
    Print("/*                 */\n\r"); 
    Print("/*  [8 Nov,2004]   */\n\r");  
    Print("/*******************/\n\r"); 
    Print("\n");                        
    
    InstallCom_0(115200L,8,0,0);
    
    Print("Please Input Slot Number(0~3 or 0~7) =");
    LineInput(cTemp,10);
    sscanf(cTemp,"%d",&iSlot);
    
    Print("Please Input Total DI Channel Number(8,16,32) =");
    LineInput(cTemp,10);
    sscanf(cTemp,"%d",&TotalChannel);
    
    for(;;)
    {
        iRet=Read87K_DI(iSlot,TotalChannel,&iValue);	
                
        if(iRet==NoError)
        {
            Print("DI data = %-08lX\n\r",iValue);        
        }  
        else
        {
            Print("DI receive response error. Error Code = %d\n\r",iRet);
        }  
    }
    RestoreCom(0); 
}                               

//=====================================================================
//====== Following functions are used to read 87K DI modules        ===
//====== You can copy the functions to your own program.            ===
//=====================================================================
int Read87K_DI(int Slot,int TotalChannel,unsigned long *Value)
{
    /*
    DCON protocol to read DI value
     Command: @AA
     Response: >(DO Data)(DI Data)
     
     Slot: 0 ~ 8
     TotalChannel: 0 ~ 32
    */
    
    int iRet;
    unsigned char InBufCom0[20];
    
    ChangeToSlot(Slot);		
    SendCmdTo7000(0,"@00",0); //Com port=0, CheckSum=0 (0:disable 1:Enable)                             
    iRet=ReceiveResponseFrom7000_ms(0,InBufCom0,100,0); //Com port=0, TimeOut=100, CheckSum=0 (0:disable 1:Enable)                      

    if(iRet==NoError)
    {
        if(InBufCom0[0] == '>')
        {
            switch(TotalChannel)                                                                                                               
            {                                                                                                                          
                case 8: // 8 bit  
                    *Value=((ascii_to_hex(InBufCom0[1])<<4)&0xF0)
            	           +(ascii_to_hex(InBufCom0[2])&0xF);                     
            	    return NoError;
            	    
            	case 16://16 bit                                                                                                       
                    *Value=(((unsigned)(ascii_to_hex(InBufCom0[1]))<<12)&0xF000)
                           +((ascii_to_hex(InBufCom0[2])<<8)&0xF00)
                       +((ascii_to_hex(InBufCom0[3])<<4)&0xF0)
                       +(ascii_to_hex(InBufCom0[4])&0xF);                     
                    return NoError;
                case 32:
                    *Value=(((unsigned long)(ascii_to_hex(InBufCom0[1]))<<28)&0xF0000000)
            		       +(((unsigned long)(ascii_to_hex(InBufCom0[2]))<<24)&0xF000000)
                           +(((unsigned long)(ascii_to_hex(InBufCom0[3]))<<20)&0xF00000)
                           +(((unsigned long)(ascii_to_hex(InBufCom0[4]))<<16)&0xF0000)
                           +((unsigned long)(ascii_to_hex(InBufCom0[5])<<12)&0xF000)
                           +((unsigned long)(ascii_to_hex(InBufCom0[6])<<8)&0xF00)
                           +((unsigned long)(ascii_to_hex(InBufCom0[7])<<4)&0xF0)
                           +((unsigned long)(ascii_to_hex(InBufCom0[8]))&0xF);                    
		    return NoError;    
                default:
                    return NoError;
            }
        }
        else    
        {
           return -1;  //Response string error.
        } 
    }      
    else   
        return iRet;
}   


           
           
           
           