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

📄 user.c

📁 智能水表程序 来着互联网
💻 C
字号:
//-----------------------------------------------------------------------------
// user.c
//-----------------------------------------------------------------------------
//
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include <reg52.h>
#include <string.h>
#include "cpu/cpu.h"
#include "main/main.h"
#include "rfid/card.h"
#include "card/block.h"
#include "ext/x5045.h"
#include "ext/bc7281.h"
#include "misc/misc.h"
#include "misc/general.h"
//-----------------------------------------------------------------------------
// Functions Prototype
//-----------------------------------------------------------------------------
void Fill_mem_Value ( void );
char User_Card_Deal ( char * buf, char * key );
//-----------------------------------------------------------------------------
// User Card Deal Routine
//-----------------------------------------------------------------------------
char User_Card_Deal ( char * buf, char * key )
{
	pSTICC c = ( pSTICC ) buf;
	char *pkey = key;
	unsigned long Water;

	if ( !Buffer_is_Zero ( c->Block61.u.User.Water, sizeof( r.Remain )))
	{
		// unzero, correct
		Water = Array_Long ( c->Block61.u.User.Water, 4 );
		if (( rtn = Access_Card_Module ( READ_BLOCK, BLOCK62, (char *) &c->Block61 )) != TRUE )	return rtn;
		if (( rtn = Card_Data_Valid ((char *) &c->Block61 )) != TRUE )	return rtn;
		if ( Water != Array_Long ( c->Block61.u.User.Water, 4 ))
		{
			bc7281_Display_Dig ( Code2, DISP_DELAY1 );		return FALSE;
		}
		Water = BCD_Hex ( Water, 7 );
		if ( Water > RemainMax || ( bDue == FALSE && (long)( r.Remain + Water ) > RemainMax ))
		{
			bc7281_Display_Dig ( Code5, DISP_DELAY1 );		return FALSE;
		}
		if ( bMem = x5045_Is_Busy ()) return FALSE;
		// clear blcok61
		bFill  = CLEAR;		r.Flag = bFlag;
		x5045_Write_Enable ();
		x5045_Write ( Flag_memAddr, (char*) &r.Flag, sizeof( r.Flag ));
		memset ((char *) &c->Block61, 0, BLOCK_LEN );
		if (( rtn = Access_Card_Module ( WRITE_BLOCK, BLOCK61, (char *) &c->Block61 )) != TRUE ) return rtn;
		if (( rtn = Access_Card_Module ( READ_BLOCK, BLOCK61, (char *) &c->Block61 )) != TRUE ) return rtn;
		if ( !Buffer_is_Zero ((char *) &c->Block61, BLOCK_LEN )) return FALSE;		                                              
	}
	else
	{
		// zero, read backup, continue pause last
		if (( rtn = Access_Card_Module ( READ_BLOCK, BLOCK62, (char *) &c->Block61 )) != TRUE ) return rtn;			
		if (( rtn = Card_Data_Valid    ((char *) &c->Block61 )) != TRUE ) return rtn;
		if ( Buffer_is_Zero ( c->Block61.u.User.Water, sizeof( r.Remain )))
		{
			// User_Display_Item ();
			return TRUE;
		}
		if ( bFill == FILL )
		{
			memset ((char *) &c->Block61, 0, BLOCK_LEN );
				#ifndef  USE_JMY_MODULE
			if (( rtn = Access_Card_Module ( WRITE_KEY, BLOCK62, pkey )) != TRUE ) return rtn;
				#endif
			if (( rtn = Access_Card_Module ( WRITE_BLOCK, BLOCK62, (char *) &c->Block61)) != TRUE ) return rtn;
			// User_Display_Item ();
			return TRUE;
		}
		Water = Array_Long ( c->Block61.u.User.Water, 4 );
		Water = BCD_Hex ( Water, 7 );
		if ( Water > RemainMax || ( bDue == FALSE && (long)( r.Remain + Water ) > RemainMax ))
		{
			bc7281_Display_Dig ( Code5, DISP_DELAY1 );		return FALSE;
		}				
	}
	// fill memory remain
	if ( bMem = x5045_Is_Busy ()) return FALSE;
	if ( bDue == FALSE ) r.Remain += Water;
	else 
	{
		if ( r.Remain  > Water )
			 r.Remain -= Water;
		else
		{
			r.Remain = Water - r.Remain;
			bDue = FALSE;
		}
	}									
	bFill  = FILL;
	r.Factor   = c->Block60.User.Factor;
	r.Fee      = Array_Long ( c->Block60.User.Fee, 2 );                     
	r.LowLimit = Array_Long ( c->Block60.User.LowLimit, 3 );
	Fill_mem_Value ();
    r.LowLimit = BCD_Hex ( r.LowLimit, 7 );

	memset ((char *) &c->Block61, 0, BLOCK_LEN );
		#ifndef  USE_JMY_MODULE
	if (( rtn = Access_Card_Module ( WRITE_KEY, BLOCK62, pkey )) != TRUE ) return rtn;
		#endif
	if (( rtn = Access_Card_Module ( WRITE_BLOCK, BLOCK62, (char *) &c->Block61 )) != TRUE ) return rtn;
 	return TRUE;
}
//-----------------------------------------------------------------------------
// Fill Value And Switch Relay Routine
//-----------------------------------------------------------------------------
void Fill_mem_Value ( void )
{
	r.Remain   = Hex_BCD ( r.Remain, 7 );
	if ( bDue == TRUE ) r.Remain |= isDUE;
    r.LowLimit |= 0xFF000000 & ((long) r.Factor << 24 );

	x5045_Write_Enable ();
	x5045_Write ( stRemain_memAddr + sizeof( r.Total ),
					    (char*) &r + sizeof( r.Total ),
                sizeof( STRemain ) - sizeof( r.Total ));
    r.Remain   = BCD_Hex ( r.Remain & PAY, 7 );						
}

⌨️ 快捷键说明

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