📄 esam_cpu.c
字号:
#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 + -