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

📄 esam_cpu.c

📁 本公司的单相CPU卡表的源程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "include\macro.h"  
#include "include\HardConfig.h"
#include "include\SysConfig.h"
#include "include\SubConfig.h"
#include "include\data.h"
#include "include\bitdef.h"

#include "include\FunAnnounce.h"

void IC_ESAM_init(void);
uchar  MAC_ESAMtoCARD(uchar fileID,uchar adrESAM, uchar adrCARD,uchar len);
uchar  MAC_CARDtoESAM(uchar fileID,uchar adrCARD,uchar adrESAM, uchar len);
uchar NOMAC_Write(uchar fileID,uchar *s1, uchar s2, uchar len);
uchar NOMAC_Read(uchar fileID,uchar adr0, uchar *adr1,uchar len);
void Get_ISOHead(uchar suffix);
uchar IncEC_Card(void);
uchar IN_AUTHEN_all(void);
uchar EX_AUTHEN_Card(void);
uchar EX_AUTHEN_Esam(void);
void ADD_Buy_EC(ulong tmp_buyEC;);

/*******************************************************************
* 
********************************************************************/
void IC_ESAM_Opera(void)
{ 
    // card insert check!
    if( ICCard_Check() != true)    return;

    // initialization
    IC_ESAM_init();

    // reset ESAM
    if(ESAM_Reset()== false) 
    {
        Sram.IcErr_status = ERR_IC_00; 
        return;
    }

    // reset CPU card
    if(Card_Reset()== false) 
    {
        Sram.IcErr_status = ERR_IC_00; 
        return;
    }

    //card type judge  CardType=RecvBuffer[1]
    if(Judge_ICType() == false)
    {
        Sram.IcErr_status = ERR_IC_02; 
        return;
    }


    // card-type   
    Sram.IcErr_status = CPUCardAnalyse();


}

/********************************************************************************
CMDCode_TX:	01 Send Error	02 Recv Error	03 Course return Error
						04 have data send
						00 
********************************************************************************/
uchar CMD_Code_TX(uchar *C_Ptr)
{

    if( (*(C_Ptr+5) &0x01)== TYPE_CARD)
    {
        if(IC_Data_TX (C_Ptr,5)== false)  return false;   //Commadn Send
        if(IC_Data_RX (RecvBuffer,1)== false)  return false;//Recv data
        if(RecvBuffer[0] ==*(C_Ptr+1))	return true;//
        if(((RecvBuffer[0] &0xf0 )==0x60 )||((RecvBuffer[0] &0xf0 )==0x90 ))  IC_Data_RX (&RecvBuffer[1],1);
        return false;
	   }
    else
    {
        if(ESAM_Data_TX (C_Ptr,5)== false)  return false;   //Commadn Send
        if(ESAM_Data_RX (RecvBuffer,1)== false)  return false;//Recv data
        if(RecvBuffer[0] ==*(C_Ptr+1))	return true;//
        if(((RecvBuffer[0] &0xf0 )==0x60 )||((RecvBuffer[0] &0xf0 )==0x90 ))  ESAM_Data_RX (&RecvBuffer[1],1);
        return false;    
    }
    
    return false; 

}
/*******************************************************************
* increase energy CARD opeartion,
********************************************************************/
uchar ForeSet_Card(void)
{
uchar tmpData[70];
uchar tmpData0[6];
ulong tmp_MD=0, tmp_lg=0;
uchar *ptr;

    if( Flag.even &bitPGKen==0)
    {
        Sram.IcErr_status = ERR_IC_06; 
        return false;
    }

    if(IN_AUTHEN_all() == false)   return false;
    if(EX_AUTHEN_Card() == false)   return false;

    //  Binary #0001 
    if( NOMAC_Read(0x10+TYPE_CARD, 0x00,&tmpData[0x00], 0x39)==false)  return false;
    
    if(NOMAC_Write(0x10+TYPE_ESAM, &tmpData[0x03], 0x03, 0x34)==false) return false;
     
     MEM_Write(E2P_CMDTMR, &tmpData[0x32],1);
     MEM_Write(E2P_OMDTMR, &tmpData[0x31],1);
     MEM_Write(E2P_OFFCNTMAX, &tmpData[0x30],1);
     MEM_Write(E2P_MDTMR, &tmpData[0x2f],1);
     	
     Rev_Copy_Arry(&tmpData[0x2c], 3);
     ptr = &tmp_lg;
     *ptr = tmpData[0x2c];
     ptr++;
     *ptr = tmpData[0x2d];
     ptr++;
     *ptr = tmpData[0x2e];
     tmp_MD = (tmp_lg*60*10000)/((ulong)tmpData[0x2f]*100*CONS_METER);
     MEM_Write(E2P_LIMITMD, &tmp_MD,3);

     Rev_Copy_Arry(&tmpData[0x28], 4);
     MEM_Write(E2P_LIMITBUY, &tmpData[0x28],4);
     
     Rev_Copy_Arry(&tmpData[0x24], 4);
     ptr = &tmp_lg;
     *ptr = tmpData[0x24];
     ptr++;
     *ptr = tmpData[0x25];
     ptr++;
     *ptr = tmpData[0x26];     
     ptr++;
     *ptr = tmpData[0x27];  
     Long_BCD4(&tmpData0[0], tmp_lg)
     MEM_Write(E2P_ARML2, &tmpData0[0],4);
     
     Rev_Copy_Arry(&tmpData[0x20], 4);
     ptr = &tmp_lg;
     *ptr = tmpData[0x20];
     ptr++;
     *ptr = tmpData[0x21];
     ptr++;
     *ptr = tmpData[0x22];     
     ptr++;
     *ptr = tmpData[0x23];  
     Long_BCD4(&tmpData0[0], tmp_lg)
     MEM_Write(E2P_ARML1, &tmpData0[0],4);

     Rev_Copy_Arry(&tmpData[0x0a], 5);
     tmpData[0x0f] = 0;
     MEM_Write(E2P_ID, &tmpData0[0x0a],6);

     Rev_Copy_Arry(&tmpData[0x05], 5);
     tmpData[0x0a] = 0;
     MEM_Write(E2P_IDUSER, &tmpData0[0x05],6);

     // Binary #0002
     if( NOMAC_Read(0x20+TYPE_CARD, 0x03,&tmpData[3], 0x3c)==false)  return false;
     if(NOMAC_Write(0x20+TYPE_ESAM, &tmpData[3], 0x03, 0x3c)==false) return false;    

     MEM_Write(E2P_OFFCNT, &tmpData[0x3e],1);
     
     return true;
}

/*******************************************************************
* increase energy CARD opeartion,
********************************************************************/
uchar IncEC_Card(void)
{
 ulong dat00;
 uint cnt;
 
     if(IN_AUTHEN_all() == false)   return false;
     if(EX_AUTHEN_Card() == false)   return false;

     //增加电表内电能数据
     if( NOMAC_Read(0x10+TYPE_CARD, 0x08,&dat00, 4)==false)  return false;
     Rev_Copy_Arry(&dat00, 4);
     if(ADD_Buy_EC(dat00)==false)   return false;

    //增加购电次数后写入卡片对应位置
    MEM_Read(E2P_BUYCNT, &cnt, 0x02);
    Rev_Copy_Arry(&cnt, 2);
    cnt++;
    Rev_Copy_Arry(&cnt, 2);    
    if(NOMAC_Write(0x10+TYPE_CARD, &cnt, 0x0c, 2)==false) return false;
    return true;
}

/*******************************************************************
* Check Card  Operation		Read ESAM0001/0002/0003 Write to Card 0002(or not read esam??)
********************************************************************/
uchar CHK_Card(void)
{
    //if(MAC_ESAMtoCARD((0X10+0X02), 0X05, 0X05, 10)==false)  return false;
    //return true;
    
	   uchar i;

     // back write 
			if( NOMAC_Read(0x10+TYPE_ESAM, 0x03,&SendBuffer[10], 12)==false)  return false;
			if(NOMAC_Write(0x20+TYPE_CARD, &SendBuffer[10], 0x03, 12)==false) return false;
     //

     MEM_Read(E2P_LENINT, &SendBuffer[10], 0x04);
     SendBuffer[10]= Sram.L_ENdec;  
     BCD4_Long(&SendBuffer[10]);
     Rev_Copy_Arry(&SendBuffer[10], 4)
     
     MEM_Read(E2P_SUMBUY, &SendBuffer[14], 0x04);
     BCD4_Long(&SendBuffer[14]);
     Rev_Copy_Arry(&SendBuffer[14], 4)
     	
     MEM_Read(E2P_BUY1, &SendBuffer[18], 0x04);
     BCD4_Long(&SendBuffer[18]);
     Rev_Copy_Arry(&SendBuffer[18], 4)
     	
     MEM_Read(E2P_BUYCNT, &SendBuffer[20], 0x02);
     Rev_Copy_Arry(&SendBuffer[20], 2)     
     	
     MEM_Read(E2P_TENINT, &SendBuffer[22], 0x04);
     SendBuffer[22]= Sram.T_ENdec;
     BCD4_Long(&SendBuffer[22]);
     Rev_Copy_Arry(&SendBuffer[22], 4)
     	
     for(i=26;i<58;i++)
     	{
     	    SendBuffer[i] = 0;
     	}
     
     MEM_Read(E2P_ZENINT, &SendBuffer[58], 0x04);
     SendBuffer[58]= Sram.Z_ENdec;     
     BCD4_Long(&SendBuffer[58]);
     Rev_Copy_Arry(&SendBuffer[58], 4)
     	
     for(i=62;i<66;i++)
     	{
     	    SendBuffer[i] = 0;
     	}
     MEM_Read(E2P_ARML1, &SendBuffer[66], 0x04);
     BCD4_Long(&SendBuffer[66]);
     Rev_Copy_Arry(&SendBuffer[66], 4)
     	
     MEM_Read(E2P_ARML2, &SendBuffer[70], 0x04);  
     BCD4_Long(&SendBuffer[70]);
     Rev_Copy_Arry(&SendBuffer[70], 4)
     	
			if( NOMAC_Read(0x20+TYPE_ESAM, 0x39,&SendBuffer[74], 4)==false)  return false;  //最大功率负荷和最大负荷计算时间
			
			MEM_Read(E2P_OFFCNT, &SendBuffer[78], 0x01);
			SendBuffer[79] = Sys.status;

			 for(i=80;i<85;i++)
     	{
     	    SendBuffer[i] = 0;
     	}
			     
			if(NOMAC_Write(0x20+TYPE_CARD, &SendBuffer[10], 0x0f, 74)==false) return false;

     return true;

  
}

/*******************************************************************
* Relay Test Card  Operation		Read ESAM0001/0002/0003 Write to Card 0002(or not read esam??)
********************************************************************/
uchar RelayTst_Card(void)
{
		uchar i;
		
return true;
}
/*******************************************************************
* Relay Test Card  Operation		Read ESAM0001/0002/0003 Write to Card 0002(or not read esam??)
********************************************************************/
uchar MeterCHG_Card(void)
{
			uchar M_CHG_State,Old_MNum[5],New_MNum[5],i;

			return true;
}
/**********************************************************************************************
* Skey Card  Operation		Read ESAM0001/0002/0003 Write to Card 0002(or not read esam??)


**********************************************************************************************/

uchar SKey_Card(void)
{
		uchar KeyNum,i,j=0;


	return 0x00;
}
/**********************************************************************************************
* Skey Card  Operation		Read ESAM0001/0002/0003 Write to Card 0002(or not read esam??)


**********************************************************************************************/
uchar User_Card(void)
{

    
				return true;
}

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

   for(i=0;i<8;i++)
   {
     SpreadGene[i] = 0;
   }

		switch(RecvBuffer[0])
		{
				case 0x01:
						User_Card();
						break;
				case 0x0b:
						MeterCHG_Card();
							break;
				case 0x06:
						CHK_Card();
						//CheckCardProcess();
							break;
				case 0x08:
						RelayTst_Card();
							break;
				case 0x09:
		 				ForeSet_Card();
							break;
				case 0x10:
						SKey_Card();
						break;
				case 0x12:
						IncEC_Card();
							break;
				case 0x0d:
	//					CHGMNum_Card();
							break;
				default:
							return ERR_IC_00;

		}			

    NOP();
    NOP();

    return ERR_IC_OK;
    
}


/********************************************************
*
*  
*********************************************************/
uchar NOMAC_Read(uchar fileID,uchar adr0, uchar *adr1,uchar len)
{
 uchar i;
 
    Iso7816Head[0] = 0X00;
    Iso7816Head[1] = 0XB0;
    Iso7816Head[2] = 0X80+(fileID>>4);
    Iso7816Head[3] = adr0;
    Iso7816Head[4] = len;
    Iso7816Head[5] = TYPE_TX00+(fileID&0X01);
    if(ISO7816CMDAnalyse()==false)  return false;

    for(i=0;i<len;i++)
    {
        *adr1 = RecvBuffer[i];
        adr1++;
    }

    return true;
}


/********************************************************
* 
*  note:fileID  define
*          [B7:B4]  Binary file ID;
*          B0: type of object
*********************************************************/
uchar NOMAC_Write(uchar fileID,uchar *s1, uchar s2, uchar len)
{
 uchar i;

    for(i=0;i<len;i++)
    {
        SendBuffer[i] = *s1;
        s1++;
    }
        
    Iso7816Head[0] = 0X00;
    Iso7816Head[1] = 0XD6;
    Iso7816Head[2] = 0X80+(fileID>>4);
    Iso7816Head[3] = s2;
    Iso7816Head[4] = len;
    Iso7816Head[5] = TYPE_TX01+(fileID&0X01);
    if(ISO7816CMDAnalyse()==false)  return false;

    return true;
    
}


/********************************************************
*
*  NOTE:  fileID  define
*             [B7:B4]  Esam Binary file ID;
*             [B3:B0]  Card  Binary file ID;
*********************************************************/
uchar  MAC_ESAMtoCARD(uchar fileID,uchar adrESAM, uchar adrCARD,uchar len)
{
 uchar i;

    Get_ISOHead(IC_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] = adrCARD;
    SendBuffer[8] = len+4;
    for(i=0;i<8;i++)
    {
    	     SendBuffer[i+9]   = SpreadGene[i];
    }

    Iso7816Head[0] = 0X04;
    Iso7816Head[1] = 0Xb0;
    Iso7816Head[2] = 0X80+(fileID>>4);
    Iso7816Head[3] = adrESAM;
    Iso7816Head[4] = 0x11;
    Iso7816Head[5] = TYPE_TX01+TYPE_ESAM;
    if(ISO7816CMDAnalyse()==false)  return false;

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

    for(i=0;i<(len+4);i++)
    {
        SendBuffer[i] = RecvBuffer[i];
    }
    Iso7816Head[0] = 0X04;
    Iso7816Head[1] = 0XD6;
    Iso7816Head[2] = 0X80+(fileID&0x0f);
    Iso7816Head[3] = adrCARD;
    Iso7816Head[4] = 0x11;
    Iso7816Head[5] = TYPE_TX01+TYPE_CARD;        
    if(ISO7816CMDAnalyse()==false)  return false;

    return true;
}

/********************************************************
*
*  NOTE:  fileID  define
*             [B7:B4]  Card  Binary file ID;
*             [B3:B0]  Esam Binary file ID;
*********************************************************/

⌨️ 快捷键说明

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