⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 esam_cpu.c

📁 本公司的单相CPU卡表的源程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
uchar  MAC_CARDtoESAM(uchar fileID,uchar adrCARD,uchar adrESAM, uchar len)
{
 uchar i;

    Get_ISOHead(E_GET_4RAMDOM);
    if(ISO7816CMDAnalyse()==false)  return false;

    for(i=0;i<4;i++)
    {
        SendBuffer[i] = RecvBuffer[i];
    }
    SendBuffer[4] = 0x04;
    SendBuffer[5] = 0xD6;
    SendBuffer[6] = 0x80 +(fileID&0x0f);
    SendBuffer[7] = adrESAM;
    SendBuffer[8] = 0x0C+len;           // 8SpreadGene+4MAC+DATA 

    Iso7816Head[0] = 0X04;
    Iso7816Head[1] = 0XB0;
    Iso7816Head[2] = 0X80+(fileID>>4);
    Iso7816Head[3] = adrCARD;
    Iso7816Head[4] = 0x09;
    Iso7816Head[5] = TYPE_TX01+TYPE_CARD;
    if(ISO7816CMDAnalyse()==false)  return false;

    Get_ISOHead(IC_RX_RESPONS);
    ISOHEAD_LEN = len+4;
    if(ISO7816CMDAnalyse()==false)  return false;


     for(i=0;i<8;i++)
    {
    	     SendBuffer[i]   = SpreadGene[i];
    }
    for(i=0;i<(len+4);i++)
    {
        SendBuffer[8+i] = RecvBuffer[i];
    }
    Iso7816Head[0] = 0X04;
    Iso7816Head[1] = 0XD6;
    Iso7816Head[2] = 0X80+(fileID&0x0f);
    Iso7816Head[3] = adrESAM;
    Iso7816Head[4] = 0x0C+len;            // 8SpreadGene+4MAC+DATA 
    Iso7816Head[5] = TYPE_TX01+TYPE_ESAM;        
    if(ISO7816CMDAnalyse()==false)  return false;

    return true;
}


/********************************************************
*
*  
*********************************************************/
uchar IN_AUTHEN_all(void)
{
 uchar tmp_da0[8];
 uchar i;

    Get_ISOHead(E_DISP_01MM);
    for(i=0;i<8;i++)
    {
        SendBuffer[i] = SpreadGene[i];
    }
    if(ISO7816CMDAnalyse()==false)  return false;

    
    Get_ISOHead(IC_GET_8RAMDOM);
    if(ISO7816CMDAnalyse()==false)  return false;
    for(i=0;i<8;i++)
    {
        SendBuffer[i] = RecvBuffer[i];
    }

    Get_ISOHead(IC_IN_AUTHENT);
    if(ISO7816CMDAnalyse()==false)   return false;
    
    Get_ISOHead(IC_RX_RESPONS);
    ISOHEAD_LEN = 8;
    if(ISO7816CMDAnalyse()==false)  return false;
    
    for(i=0;i<8;i++)
    {
        tmp_da0[i] = RecvBuffer[i];
    }

    Get_ISOHead(E_MM_ENCRYPT);
    if(ISO7816CMDAnalyse()==false)  return false;

    Get_ISOHead(E_RX_RESPONS);
    ISOHEAD_LEN = 8;
    if(ISO7816CMDAnalyse()==false)  return false;

    
    if(Cmp_TwoArry(&tmp_da0[0], &RecvBuffer[0], 8) != 0)  
    {
        Sram.IcErr_status = ERR_IC_03;
        return false;
    }	
    return true;
    
}

/********************************************************
*
*  
*********************************************************/
uchar EX_AUTHEN_Card(void)
{
 uchar i;

    for(i=0;i<8;i++)
    {
        SendBuffer[i] = SpreadGene[i];
    }
    Get_ISOHead(E_DISP_02MM);
    if(ISO7816CMDAnalyse()==false)  return false;

    Get_ISOHead(IC_GET_8RAMDOM);
    if(ISO7816CMDAnalyse()==false)  return false;
    for(i=0;i<8;i++)
    {
        SendBuffer[i] = RecvBuffer[i];
    }
    
    Get_ISOHead(E_MM_ENCRYPT);
    if(ISO7816CMDAnalyse()==false)  return false;

    Get_ISOHead(E_RX_RESPONS);
    ISOHEAD_LEN = 8;
    if(ISO7816CMDAnalyse()==false)  return false;

    for(i=0;i<8;i++)
    {
        SendBuffer[i] = RecvBuffer[i];
    }
    Get_ISOHead(IC_EX_AUTHENT);
    if(ISO7816CMDAnalyse()==false) 
    {
        Sram.IcErr_status = ERR_IC_03;
        return false;
    }		
    
    return true;
}

/********************************************************
*
*  
*********************************************************/
uchar EX_AUTHEN_Esam(void)
{
 uchar i;

    Get_ISOHead(E_GET_8RAMDOM);
    if(ISO7816CMDAnalyse()==false)  return false;
    
    for(i=0;i<8;i++)
    {
        SendBuffer[i] = RecvBuffer[i];
    }
    Get_ISOHead(IC_IN_AUTHENT);
    if(ISO7816CMDAnalyse()==false)  return false;

     for(i=0;i<8;i++)
    {
        SendBuffer[i] = RecvBuffer[i];
    }
    for(i=0;i<8;i++)
    {
        SendBuffer[8+i] = SpreadGene[i];
    }
    Get_ISOHead(E_EX_AUTHENT);
    if(ISO7816CMDAnalyse()==false) 
    {
        Sram.IcErr_status = ERR_IC_03;
        return false;
    }	
    
    return true;
    
}

/********************************************************
*
*  
*********************************************************/
uchar EsamPurse_RD(void)
{
 uchar i;

    Get_ISOHead(IC_GET_4RAMDOM);
    if(ISO7816CMDAnalyse()==false)  return false;

    
    Get_ISOHead(E_GET_8RAMDOM);
    if(ISO7816CMDAnalyse()==false)  return false;
    
    for(i=0;i<8;i++)
    {
        SendBuffer[i] = RecvBuffer[i];
    }

    //??????????????????????????????????????????????
    	
    return true;
    
}

/********************************************************
*
*  
*********************************************************/
uchar CARDPurse_INC(void)
{
 uchar i;

    Get_ISOHead(E_GET_4RAMDOM);
    if(ISO7816CMDAnalyse()==false)  return false;


    
    Get_ISOHead(E_GET_8RAMDOM);
    if(ISO7816CMDAnalyse()==false)  return false;
    
    for(i=0;i<8;i++)
    {
        SendBuffer[i] = RecvBuffer[i];
    }

    //??????????????????????????????????????????????
    	
    return true;
    
}



/********************************************************
* FUNCTION:    get IS07816 Head data, lenth ,status.
* RENTURN:          NO
* CHANGE:            Iso7816Head[0].......Iso7816Head[5]   
*********************************************************/
void Get_ISOHead(uchar suffix)
{

    if(suffix>MAX_CMMOND_NUM)    SysReset();

    Iso7816Head[0] = (uchar)(IC_Apdu[suffix].Cmmond >>8);
    Iso7816Head[1] =  (uchar)(IC_Apdu[suffix].Cmmond);
    Iso7816Head[2] = (uchar)(IC_Apdu[suffix].Parameter>>8);
    Iso7816Head[3] =  (uchar)(IC_Apdu[suffix].Parameter);
    Iso7816Head[4] =  (uchar)(IC_Apdu[suffix].Len);
    Iso7816Head[5] =  (uchar)(IC_Apdu[suffix].status);
    
}

/*******************************************************************
* FUNCTION:      ISO7816 COMMAND TX and data rx
* RENTURN:          true or false
********************************************************************/
uchar ISO7816CMDAnalyse(void)
{

    if(CMD_Code_TX(&Iso7816Head[0]) == false)   return false;

    switch(Iso7816Head[5] & TYPE_TX11)
    {
        case  TYPE_TX00:                  //only rx DATA,SW1,SW2
            if(RX_Apdu(Iso7816Head[4]+2, Iso7816Head[5]) ==false)  return false;
        	   break;
        	   
        case  TYPE_TX01:                 // tx,and rx SW1,SW2
            if(Iso7816Head[5]&TYPE_ESAM)
            {
                if(	ESAM_Data_TX(&SendBuffer[0],Iso7816Head[4] )== false)   return false;
            }
            else
            {
                if(	IC_Data_TX(&SendBuffer[0],Iso7816Head[4] )== false)   return false;
            }
            if(	RX_Apdu(2,(Iso7816Head[5]&TYPE_ESAM))== false)   return false;
        	   break;

        case  TYPE_TX02:                // tx,and rx DATA,SW1,SW2
            if(Iso7816Head[5]&TYPE_ESAM)
            {
                if(	ESAM_Data_TX(&SendBuffer[0],Iso7816Head[4] )== false)   return false;
                if(	RX_Apdu(Iso7816Head[4]+2,TYPE_ESAM)== false)   return false;
            }
            else
            {
                if(	IC_Data_TX(&SendBuffer[0],Iso7816Head[4] )== false)   return false;
                if(	RX_Apdu(Iso7816Head[4]+2,TYPE_CARD)== false)   return false;
            }
        	   break;
        	   
        default:
            return false;	
    }

    return true;
}

/********************************************************
* FUNCTION:   recvice data from CARD OR ESAM
* RENTURN:          true or false
* CHANGE:            RecvBuffer[0].......RecvBuffer[lenth-1]  
*********************************************************/
uchar  RX_Apdu(uchar lenth, uchar type)
{

    if(type&TYPE_ESAM)
    {
        if(ESAM_Data_RX(&RecvBuffer[0],lenth)==false)  return false;
        if(RecvBuffer[lenth-2] == 0x90)
        {
            if(RecvBuffer[lenth-1] == 0x00)   return true;
            return false;
        }

        if(RecvBuffer[lenth-2] != 0x61)  return false;
       
        if(RecvBuffer[lenth-1] == 0x00)   return false;
           
    }
    else
    {
        if(IC_Data_RX(&RecvBuffer[0],lenth)==false)  return false;
        if(RecvBuffer[lenth-2] == 0x90)
        {
            if(RecvBuffer[lenth-1] == 0x00)   return true;
            return false;
        }

        if(RecvBuffer[lenth-2] != 0x61)  return false;
       
        if(RecvBuffer[lenth-1] == 0x00)   return false;
         
    }

    return true;
    
}

/********************************************************
*Select Card and Type Read
*   CardType=RecvBuffer[1];
*********************************************************/
uchar  Judge_ICType(void)
{
 uchar type;
 
    //Select Card
    SendBuffer[0] =0x3f;
    SendBuffer[1] =0x01;
    Get_ISOHead(CARD_SECLECT);
    if(ISO7816CMDAnalyse()==false)  return false;

    
    //Read Card Type
   if( NOMAC_Read(0x10+TYPE_CARD, 0x01 , &type,1)==false)  return false;
   
   RecvBuffer[0] = type;
   return true;  
}

/*******************************************************************
* 
********************************************************************/
uchar ICCard_Check(void)
{

    if(pin_ICKEY == 1) 
    {
        Delay_ms(1);
        if(pin_ICKEY == 0)    return false;
        Flag.even &= ~bitCardIn;
        return false;
    }
    else
    {
        Delay_ms(1);
        if(pin_ICKEY == 1)  return false;

        if(Flag.even & bitCardIn)   return false;
        Flag.even |=  bitCardIn;
    }
    
    Sram.IcErr_status = ERR_IC_OK;
    LCDStatus_Trig(DISTG_CARDIN);
    BLED_Open();
    
     dir_ICVCCCON = 0;
     pin_ICVCCCON =0;
     dir_ICDATA = 0;
     pin_ICDATA = 1;
     Delay_ms(5);

     dir_ICDATA = 1;
     NOP();
     NOP();
     if(pin_ICDATA == 1)   return true;
     pin_ICVCCCON =1;
     Sram.IcErr_status = ERR_IC_01;
     return false;  
}

/*******************************************************************
* 
********************************************************************/
void IC_ESAM_init(void)
{
    dir_ICRST = 0;
    pin_ICRST = 0;
    dir_ERST = 0;
    pin_ERST = 0;
    TM51_Init();
}


/*******************************************************************
* 购电后电能增加函数
********************************************************************/
uchar ADD_Buy_EC(ulong tmp_buyEC;)
{
 ulong tmp_ZEC;
 ulong tmp_LEC;
 ulong tmp_LIMITBUY;
 uchar tmp_dat[4];

    MEM_Read(E2P_LIMITBUY, &tmp_LIMITBUY, 0x04);
    
    if(Sram.creditSTU == USE_CREDIT)
    {
        MEM_Read(E2P_ZENINT, &tmp_ZEC, 0x04);
        (uchar*)(&tmp_ZEC)= Sram.Z_ENdec;  
        BCD4_Long(&tmp_ZEC);
        if(tmp_ZEC>tmp_buyEC)
        {
            tmp_ZEC -=  tmp_buyEC;
            Long_BCD4(&tmp_dat[0], tmp_ZEC);
            Sram.Z_ENdec = tmp_dat[0];
            MEM_Write(E2P_ZENINT, &tmp_dat[0],4);                 
        }
        else
        {
            tmp_buyEC  -=  tmp_ZEC;
            if( tmp_buyEC>tmp_LIMITBUY )  
            {      
                Sram.IcErr_status = ERR_IC_07;
                return false;  
            }
            Long_BCD4(&tmp_dat[0], tmp_buyEC);
            Sram.L_ENdec = tmp_dat[0];
            MEM_Write(E2P_LENINT, &tmp_dat[0],4); 
        }    
    }
    else
    {
        MEM_Read(E2P_LENINT, &tmp_LEC, 0x04);
        (uchar*)(&tmp_LEC)= Sram.L_ENdec;  
        BCD4_Long(&tmp_LEC);
        tmp_LEC += tmp_buyEC;
        if( tmp_LEC>tmp_LIMITBUY )  
        {      
            Sram.IcErr_status = ERR_IC_07;
            return false;  
        }
        Long_BCD4(&tmp_dat[0], tmp_LEC);
        Sram.L_ENdec = tmp_dat[0];
        MEM_Write(E2P_LENINT, &tmp_dat[0],4);    
    }

   return true;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -