📄 user.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 + -