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

📄 user0.c

📁 智能水表程序 来着互联网
💻 C
字号:
char User_Card_Deal( char * buf )
{
	pUICC c = ( pUICC ) buf;
	struct
	{
		char Factor;
		int  Fee;
		long LowLimit;
		long Water;
	} idata Dat;

			if ( memcmp ( f.Well, c->Block3C.Well, sizeof( f.Well ))) return Fail( Well_Err );
			memcpy ((char *) &Dat, (char *) &c->Block3C.User, sizeof( c->Block3C.User ));
			Dat.Factor   = c->Block3C.User.Pulse;
			Dat.Fee      = c->Block3C.User.Fee;
			Dat.LowLimit = Array_Long ( c->Block3C.User.LowLimit, 3 );
			if (( rtn = Access_Card_Module ( READ_BLOCK, BLOCK3D, buf )) != TRUE ) return rtn;
			if ( !Buffer_is_Zero ((char *) &c->Block3D.u.User.Water, sizeof( r.Remain )))
			{
				// correct
				Dat.Water = c->Block3D.u.User.Water;
				if (( rtn = Access_Card_Module ( READ_BLOCK, BLOCK3E, buf )) != TRUE )	return rtn;				
				if (( rtn = Card_Data_Valid ( buf )) != TRUE )	return rtn;
				if ( Dat.Water != c->Block3D.u.User.Water )
				{
					bc7281_Display_Dig ( Code2, DISP_DELAY1 );		return FALSE; 
				}
				if ( bDue == FALSE && r.Remain + c->Block3D.u.User.Water > RemainMax )
				{
					bc7281_Display_Dig ( Code5, DISP_DELAY1 );		return FALSE;
				}
				if ( bMem = x5045_Is_Busy ()) { bc7281_Display_Dig ( Code6, DISP_DELAY1 ); return FALSE; }
				// clear
				bFill  = CLEAR;
				r.Fill = CLEAR;
				x5045_Write ( Fill_memAddr, (char*) &r.Fill, sizeof( r.Fill ));
				memset ( buf, 0, BLOCK_LEN );
				if (( rtn = Access_Card_Module ( WRITE_BLOCK, BLOCK3D, buf )) != TRUE ) return rtn;
				if (( rtn = Access_Card_Module ( READ_BLOCK, BLOCK3D, buf )) != TRUE ) return rtn;
				if ( !Buffer_is_Zero ( buf, BLOCK_LEN )) return FALSE;		                                              
			}
			else
			{
				// zero
				if (( rtn = Access_Card_Module ( READ_BLOCK, BLOCK3E, buf )) != TRUE ) return rtn;				
				if (( rtn = Card_Data_Valid    ( buf )) != TRUE ) return rtn;
				if ( Buffer_is_Zero ((char *) &c->Block3D.u.User.Water, sizeof( r.Remain )))
				{
					User_Display_Item ();	return TRUE;
				}
				if ( bFill == TRUE )
				{
					memset ( buf, 0, BLOCK_LEN );
					if (( rtn = Access_Card_Module ( WRITE_BLOCK, BLOCK3E, buf )) != TRUE ) return rtn;
					User_Display_Item ();	return TRUE;
				} 
				Dat.Water = c->Block3D.u.User.Water;
				if ( bDue == FALSE && r.Remain + c->Block3D.u.User.Water > RemainMax )
				{
					bc7281_Display_Dig ( Code5, DISP_DELAY1 );		return FALSE;
				}				
			}
			// fill
			if ( bMem = x5045_Is_Busy ()) { bc7281_Display_Dig ( Code6, DISP_DELAY1 ); return FALSE; }
			if ( bDue == FALSE ) r.Remain += c->Block3D.u.User.Water;
			else if ( bDue == TRUE ) 
			{
				if ( r.Remain  > c->Block3D.u.User.Water )
					 r.Remain -= c->Block3D.u.User.Water;
				else
				{
					bDue = CLEAR;
					r.Remain = c->Block3D.u.User.Water - r.Remain;
				}
			}									
			bFill  = FILL;
			r.Fill = 0xFF;
			r.Factor   = Dat.Factor;
			r.Fee      = Dat.Fee;
			r.LowLimit = Dat.LowLimit;
			Fill_mem_Value ();

			memset ( buf, 0, BLOCK_LEN );
			if (( rtn = Access_Card_Module ( WRITE_BLOCK, BLOCK3E, buf )) != TRUE ) return rtn;
		 	return TRUE;
}//-----------------------------------------------------------------------------
// Check Card Sort Routine
//-----------------------------------------------------------------------------
char Check_Card_Type ( void )
{
	char  rtn;
	char  idata buf[2 * BLOCK_LEN];
	pSTICC c = ( pSTICC ) buf;

	memset ( buf, 0, BLOCK_LEN );
	if (( rtn = Access_Card_Module ( FIND_CARD, AWAKE_CARD, buf )) != TRUE ) return rtn;
	if (( rtn = Access_Card_Module ( READ_BLOCK, BLOCK3D, (char *) &c->Block3D )) != TRUE ) return rtn;
	if (( rtn = Card_Data_Valid ((char *) &c->Block3D )) != TRUE ) return rtn;
	Speaker_Beep ();

	switch ( c->Block3D.Type )
	{
		case CHECK_CARD:
			Check_Display_Item ();
			break;

		default:
		{
			if (( rtn = Access_Card_Module ( READ_BLOCK, BLOCK3C, (char *) &c->Block3C )) != TRUE ) return rtn;
			if (( rtn = Card_Data_Valid ((char *) &c->Block3C )) != TRUE ) return rtn;
			if ( memcmp ( f.City, c->Block3C.City, sizeof( f.City ))) return Fail( City_Err );

			switch ( c->Block3D.Type )
			{
				case CLOCK_CARD:
					Set_Clock ( &c->Block3D.u.Clock.t );
					Display_Clock ( DISP_DELAY2 );
					break;

				case USER_CARD:
					if ( memcmp ( f.Well, c->Block3C.Well, sizeof( f.Well ))) return Fail( Well_Err );
					User_Card_Deal ( buf );
					User_Display_Item ();
					break;		

				case CLEAR_CARD:
					if ( Shift_Run_Mode ( RUN ) == FALSE ) bc7281_Display_Dig ( Code6, DISP_DELAY1 );
					else	bc7281_Display_Dig ( Code7, DISP_DELAY1 );
					break;

				case TEST_CARD:
					if ( Shift_Run_Mode ( TEST ) == FALSE ) bc7281_Display_Dig ( Code6, DISP_DELAY1 );
					else bc7281_Display_Dig ( Code9, DISP_DELAY1 );
					break;

				case LOWLIMIT_CARD:
					r.LowLimit = Array_Long ( c->Block3C.User.LowLimit, 3 );
					if ( bMem = x5045_Is_Busy ())
						bc7281_Display_Dig ( Code6, DISP_DELAY1 );
					else
					{
						x5045_Write ( LowLimit_memAddr, (char *) &r.LowLimit, sizeof( r.LowLimit ));
						bc7281_Display_Dig ( CodeF | Hex_BCD ( r.LowLimit, 7 ), DISP_DELAY1 );
					}
					break;

				case RECORD_CARD:
					bc7281_Display_Dig ( CodeA, DISP_DELAY1 );
					if ( Write_Card_Record () != TRUE ) bc7281_Display_Dig ( Code4, DISP_DELAY1 );
					else  bc7281_Display_Dig ( Code8, DISP_DELAY1 );
					break;

				default:
					break;
			}
		}
	}
	return TRUE;
}

⌨️ 快捷键说明

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