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

📄 comm.c

📁 本公司的单相CPU卡表的源程序代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
************************************************************************
* Comm.C   :DL645 communication programme
* 
********************************************************************
*/

#include "include\macro.h"  
#include "include\HardConfig.h"
#include "include\SysConfig.h"
#include "include\data.h"
#include "include\SubConfig.h"
#include "include\bitdef.h"

#include "include\FunAnnounce.h"




/*******************************************************************
* uchar MeteIDCheck():
********************************************************************/
uchar MeteIDCheck(void)
{
     register uchar i;
     uchar *ptr;
     uchar adr[6];
    
    
     MEM_Read(E2P_ID, &adr[0], 6);

     ptr = &Rs_Head0;
     //
     for(i=6; i>0; i--)
     {
         if( *(ptr-i) !=0x99)  break;
     }
     if(i==0)       return(1); 
 
     //
     for(i=6; i>0; i--)
     {
        if( ( *(ptr-i) != 0xaa ) && ( *(ptr-i) != adr[6-i] ) ) 
        {
            return(0);
        } 
     }   
     return(1); 
}

/*****************************************************************
 name:          uchar SecurityCK(uchar type)
 function:      operate  Security check
 input:         no            
 return:        SecurityCK()
                =mmok    succeed  precess 
                =mmerr   error passworsd
                =uferr   Security level illegal 
*****************************************************************/
uchar SecurityCK(uchar type)
{
    uchar userStatus;
    uchar ary[4];
    
    //super level control
    if (pin_KEYCHK==0)       return (mmok);

    //password check
    MEM_Read(E2P_MM0, &ary[0], 4);          //get level 0 password
    switch  (type)
    {
        case W_MM>>8:                              
            if ( Cmp_TwoArry( &Rs_Data, &ary[0], 4) !=0)  return(mmerr);
            break;
        case  W_HKEY>>8:   
            if((Flag.even & bitPGKen) != 1)   return(mmover); 
            if ( Cmp_TwoArry( &Rs_Data, &ary[0], 4) !=0)  return(mmerr);    
            break;	
			
        case  W_FCT>>8:                          
             return(uferr); 
					  			
        case 0x20:              
            if (Rs_IDL < Rs_Data3)    return(mmover); 
            if ( Cmp_TwoArry( &Rs_IDH, &ary[1], 3) != 0)    return(mmerr);
            break;            
  
        default:  
            Sys_err(); 
            break;
    }
    
    return (mmok);
}



/*****************************************************************
 name:          uchar  GetComVar( uchar* Addr, uint* Info )
 function:      get command information precess  
 input:         no            
 return:        GetComVar()
                =0    succeed  precess 
                =1    fail precess 
*****************************************************************/
uchar  GetComVar( uint* Addr, uint* Info )
{
    uint Tmp;
    uchar i;  

    Tmp = ((int)Rs_IDH<<8)+ (int)Rs_IDL;
    for( i = 0 ; i < ComDisNum ; i++ )
    {
        if( Tmp == ComDisTab[i].ComID )
        {
            *Addr = ComDisTab[i].Addr;
            *Info = ComDisTab[i].ComInfo;
            return 1;
	}
    }
    return 0;
}


/*****************************************************************
 name:          uchar Com_Read(void)
 function:      reading modul precess
 input:         no            
 return:        SecurityCK()
                =mmok    succeed  precess 
                =mmerr   error passworsd
                =uferr   Security level illegal 
*****************************************************************/
uchar Com_Read(void)
{
   uint    Addr;
   uint     Info;
   uint     commID;
   uchar    Len;
   uchar    i;

    commID = ((int)Rs_IDH<<8)+ (int)Rs_IDL;
    if( GetComVar( &Addr, &Info ) == 0 )   return(RS_State_IVID);   


    if( ( Info & EN_R ) == 0 )   return(RS_State_IVID);  

    Len =  *((char*)(&Info)) ;
    Len &=UR_LEN;                         
	

    for(i=0;i<Len;i++)
    {
        Comm.commBuff[RS_DPtr+i]= 0;
    }  
    Rs_Len = Len+2;
				
    switch ( Info & UR_TESHU )  
    {    
        case CM_GEN:                           
            MEM_Read(Addr, &Rs_Data, Len); 
            break; 
			
        case UR_TEC:                           
            MEM_Read(E2P_TENINT, &Rs_Data, 0x04);
            Comm.commBuff[RS_DPtr]= Sram.T_ENdec;   
            break;  

        case UR_REC:                           
            MEM_Read(E2P_RENINT, &Rs_Data, 0x04);
            Comm.commBuff[RS_DPtr]= Sram.R_ENdec;   
            break ;	

        case UR_LEC:                           
            MEM_Read(E2P_LENINT, &Rs_Data, 0x04);
            Comm.commBuff[RS_DPtr]= Sram.L_ENdec;   
            break;  

        case UR_POWER:                           
            Comm.commBuff[RS_DPtr]= MDLoad.mpower[0];   
            Comm.commBuff[RS_DPtr+1]= MDLoad.mpower[1];   
            Comm.commBuff[RS_DPtr+2]= MDLoad.mpower[2];   
            break;  

        case UR_DLYS:                          
            Comm.commBuff[RS_DPtr]= 0x0f;
            if(Flag.prepay&bitP_delayON)    Comm.commBuff[RS_DPtr]= 0x00;
            break ;

        case UR_MCER:                          
            Comm.commBuff[RS_DPtr]= Sram.SYSErr_status;
            break ;

        case UR_CONST:                           
            Comm.commBuff[RS_DPtr+1]= CONDIS_METER;   
            break  ;

        case UR_ZEC:                           
            MEM_Read(E2P_ZENINT, &Rs_Data, 0x04);
            Comm.commBuff[RS_DPtr]= Sram.Z_ENdec;   
            break;  

	case UR_TESHU:	
            if(commID==0xc712)              
           {
                for(i=0;i<16;i++)
               {
                      Comm.commBuff[RS_DPtr+i]= video[15-i];
                }       
                Rs_Len = Len+2;
                return(RS_State_OK);                               
            }

	    return(RS_State_IVID); 

        default:  
            return(RS_State_IVID);                           
    }     
		
    return(RS_State_OK); 
}



/*****************************************************************
 name:          uchar Com_Write(void)
 function:      program modul precess
 call:          SecurityCK()
                MEM_Write()
                Copy_Str_BNK0()
 by call:       RsCommSub()  
 input:         no            
 return:        Com_changeMM()
                =RS_State_OK       succeed opration
                =RS_State_NOres    no responsion
*****************************************************************/
uchar Com_Write(void)
{
  uint     commID; 
  uint    Addr;
  uint     Info;
  uchar	   Len;
  uchar    secType;
  uchar   tmp00;  
  uchar   tmp01;
  uchar   data[8];
  
    
    commID = ((uint)Rs_IDH<<8)+ (uint)Rs_IDL;
    if( GetComVar( &Addr, &Info ) == 0 )   return(RS_State_IVID);
    if( ( Info & EN_W ) == 0 )  return(RS_State_IVID);
    Len= *((char*)(&Info)) & UR_LEN;
    if(Rs_Len != (Len+6) )  return(RS_State_IVID);
    
    //security check program
    secType = (*((char*)(&Info)+1) & (W_FCT>>8));             //
    //secType = secType >>4;                                    //
    secType = SecurityCK(secType);

    if(secType == mmerr)   return(RS_State_PswE);
    if(secType != mmok)  return(RS_State_IVID);


    switch(Info & UR_TESHU)
    {
        case CM_GEN:
	     MEM_Write( Addr, &Rs_WData, Len);
	     break;

        case UW_ECINIT:
	     if(Comm.commBuff[16] != 0)    return(RS_State_IVData);
            if(Comm.commBuff[17] != 0)    return(RS_State_IVData);
            if(Comm.commBuff[18] != 0)    return(RS_State_IVData);
            if(Comm.commBuff[19] != 0)    return(RS_State_IVData);	

            MEM_Write( E2P_TENINT, &Rs_WData, 0x04);               // clear total use energy data
            MEM_Write( E2P_RENINT, &Rs_WData, 0x04);               // clear REV  energy data            
            MEM_Write( E2P_ZENINT, &Rs_WData, 0x04);               // clear OVER ZERO energy data
            data[0] = 0x00;
            data[1] = 0x10;
            data[2] = 0x00;
            data[3] = 0x00;
            MEM_Write( E2P_LENINT, &data[0], 0x04);                   // SET LEAVE energy data FOR 10.00kWh
            MEM_Write( E2P_SUMBUY, &data[0], 0x04);                 // SET total buy  energy data FOR 10.00kWh
            MEM_Write( E2P_BUY1, &data[0], 0x04);                    // SET last time buy energy data FOR 10.00kWh
 
            Sram.T_ENdec = 0;
            Sram.R_ENdec = 0;
            Sram.L_ENdec = 0;
            Sram.Z_ENdec = 0;
            Sram.PLFCnt= 0;
		   
            MEM_Write( E2P_CNTEIC, &data[0], 0x01);                   // SET card error use time is 0 
            data[0] = 0x01;
            data[1] = 0x00;
            MEM_Write( E2P_BUYCNT, &data[0], 0x02);                   // SET buy energy  times if 1

            break;

        default:
             return(RS_State_IVData);
    }
      
     return(RS_State_OK);  
}


/*****************************************************************
 name:          uchar Com_changeMM(void)
 function:      change meter password
 call:          SecurityCK()
                MEM_Write()
                Copy_Str_BNK0()
 by call:       RsCommSub()  
 input:         no            
 return:        Com_changeMM()
                =RS_State_OK       succeed opration
                =RS_State_NOres    no responsion                                          
*****************************************************************/
uchar Com_changeMM(void)
{     
    // judge data length

⌨️ 快捷键说明

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