📄 reader.c
字号:
#include "nucleus.h"
#include "uart_defs.h"
#include "Reader.h"
#include "Key.h"
#define HISR_STACK_SIZE 4096
//extern VOID ERC_System_Error(INT error_code);
NU_TIMER track2_show;
NU_TIMER track3_show;
extern NU_MEMORY_POOL System_Memory;
extern NU_TIMER Rekey_interval;
NU_HISR TRA2_HISR;
NU_HISR TRA3_HISR;
CHAR Track_2[60];
CHAR Track_3[120];
CHAR Track_2_Back[60];
CHAR Track_3_Back[120];
CHAR Show_Track2[40];
CHAR Show_Track3[120];
//INT Track2_Count=0;
//INT Track3_Count=0;
//INT Track2_Back_Count=0;
//INT Track3_Back_Count=0;
int a=0; //轨2buffer的计数器
int b=0; //轨3buffer的计数器
NU_EVENT_GROUP Event_Group_ReadCard;
NU_EVENT_GROUP Event_Group_KeyDown;
CHAR * ADD2, *ADD3,*track2,*track3,*KEYOUT;
INT LR_Track2=1;
INT LR_Track3=1;
VOID Demo_CardRead(VOID)
{
INT i=0;
CHAR temp1=0,temp2=0,temp3=0,temp4=0,flag_track2=0,flag_track3=0;
VOID *pointer;
STATUS status;
unsigned readcard_flags;
CHAR data1[20];
CHAR data2[20];
status =NU_Create_Timer(&track2_show,"show_track2",ShowTrack2,0,2000,2000,NU_DISABLE_TIMER);
status =NU_Create_Timer(&track3_show,"show_track3",ShowTrack3,0,2000,2000,NU_DISABLE_TIMER);
for(i=0;i<20;i++)
{
data1[i] = 0x00;
data2[i] = 0x00;
}
for(i=0;i<40;i++)
{
Show_Track2[i] = 0x00;
}
for(i=0;i<120;i++)
{
Show_Track3[i] = 0x00;
}
NU_Allocate_Memory(&System_Memory, &pointer,2048, NU_NO_SUSPEND);
track2 = (CHAR*)pointer;
NU_Allocate_Memory(&System_Memory, &pointer,2048, NU_NO_SUSPEND);
track3 = (CHAR*)pointer;
memset(track2,0,2048);
memset(track3,0,2048);
CardReader_Int();
for(i=0;i<70000;i++);
NU_Retrieve_Events(&Event_Group_ReadCard, 0x11, NU_OR_CONSUME, &readcard_flags, NU_SUSPEND);
while(!( *(RP)PORTC_DATA & ( CP_low ) ) );
for(i=0;i<70000;i++);
temp1 = BACKTRACK2(track2,a);
temp2 = BACKTRACK3(track3,b);
temp3 = FORWARDTRACK2(track2,a);
temp4 = FORWARDTRACK3(track3,b);
if((temp1!=ERROR)||(temp3!=ERROR))
flag_track2 = Track2();
else
flag_track2 = ERROR;
if((temp2!=ERROR)||(temp4!=ERROR))
flag_track3 = Track3();
else
flag_track3 = ERROR;
LcdClear();
switch(flag_track2)
{
case TRACK2FORWARD:
LcdTextString(0,0,"track2数据正确!");
ChangeTrack2(Track_2);
memcpy(data1,Show_Track2,20);
LcdTextString(0,13,data1);
NU_Control_Timer(&track2_show,NU_ENABLE_TIMER);
break;
case TRACK2BACK:
LcdTextString(0,0,"track2数据正确!");
ChangeTrack2(Track_2_Back);
memcpy(data1,Show_Track2,20);
LcdTextString(0,13,data1);
NU_Control_Timer(&track2_show,NU_ENABLE_TIMER);
break;
case ERROR:
LcdTextString(0,0,"track2数据错误!");
break;
default:
break;
}
switch(flag_track3)
{
case TRACK3FORWARD:
LcdTextString(0,26,"track3数据正确!");
ChangeTrack3(Track_3);
memcpy(data2,Show_Track3,20);
LcdTextString(0,39,data2);
NU_Control_Timer(&track3_show,NU_ENABLE_TIMER);
break;
case TRACK3BACK:
LcdTextString(0,26,"track3数据正确!");
ChangeTrack3(Track_3_Back);
memcpy(data2,Show_Track3,20);
LcdTextString(0,39,data2);
NU_Control_Timer(&track3_show,NU_ENABLE_TIMER);
break;
case ERROR:
LcdTextString(0,26,"track3数据错误!");
break;
default:
break;
}
status = NU_Deallocate_Memory(track2);
status = NU_Deallocate_Memory(track3);
}
CHAR ChangeData(CHAR data)
{
data &= (~0x10);
data = data + 0x30;
return data;
}
VOID ChangeTrack2(CHAR *track)
{
INT i=0;
CHAR data=0x00;
for(i=0;i<40;i++)
{
data = ChangeData(*(track+i));
Show_Track2[i] = data;
data = 0x00;
}
}
VOID ChangeTrack3(CHAR *track)
{
INT i=0;
CHAR data=0x00;
for(i=0;i<120;i++)
{
data = ChangeData(*(track+i));
Show_Track3[i] = data;
data = 0x00;
}
}
VOID ShowTrack2()
{
CHAR data[20];
//INT i=0;
if(LR_Track2==2)
LR_Track2 = 0;
memcpy(data,Show_Track2+LR_Track2*20,20);
LcdAreaClear(0,13,130,13);
LcdTextString(0,13,data);
LR_Track2 ++;
}
VOID ShowTrack3()
{
CHAR data[20];
//INT i=0;
if(LR_Track3==4)
LR_Track3 = 0;
memcpy(data,Show_Track3+LR_Track3*20,20);
LcdAreaClear(0,39,130,13);
LcdTextString(0,39,data);
LR_Track3 ++;
}
VOID CardReader_Int( VOID )
{
VOID (*old_lisr)(INT);
VOID *pointer;
STATUS status;
//unsigned readcard_flags;
//CHAR p=0,q=0;
INT i=0;
//CHAR m=0,n=0;
//mask_all_irq();
//*(RP)T1CR |= 0X04;
//*(RP)T1CR &= (~0X01);
NU_Create_Event_Group(&Event_Group_ReadCard,"BRUSH_CARD");
for(i=0;i<60;i++)
{
Track_2[i] = 0x00;
}
for(i=0;i<120;i++)
{
Track_3[i] = 0x00;
}
for(i=0;i<60;i++)
{
Track_2_Back[i] = 0x00;
}
for(i=0;i<120;i++)
{
Track_3_Back[i] = 0x00;
}
*(RP)PORTC_SEL |= 0X0E;
*(RP)PORTC_DIR |= 0X0E;
//*(RP)PORTC_DATA |= 0X00;
*(RP)PORTE_SEL |= 0x0060 ; //0x00F0 ;
*(RP)PORTE_DIR |= 0x0060 ; //1 stands for in
*(RP)PORTE_INTRCTL |= 0x3c000; //中断类型为低电平解发
*(RP)PORTE_INCTL |= 0x0060; //中断输入方式
*(RP)PORTE_INTRCLR |= 0x0060;
*(RP)PORTE_INTRCLR = 0x0000; //清除中断
mask_irq( Track2_irq );
mask_irq( Track3_irq );
status=NU_Register_LISR(Track3_irq, Track3_int, &old_lisr);
status=NU_Register_LISR(Track2_irq, Track2_int, &old_lisr);
NU_Allocate_Memory(&System_Memory, &pointer,HISR_STACK_SIZE, NU_NO_SUSPEND);
status = NU_Create_HISR(&TRA2_HISR,"HISR_TRA2",TRA2_HISR_ENTRY,2,pointer,400);
if (status != NU_SUCCESS)
{
ERC_System_Error(status);
}
NU_Allocate_Memory(&System_Memory, &pointer,HISR_STACK_SIZE, NU_NO_SUSPEND);
status = NU_Create_HISR(&TRA3_HISR,"HISR_TRA3",TRA3_HISR_ENTRY,2,pointer,400);
if (status != NU_SUCCESS)
{
ERC_System_Error(status);
}
//NU_Allocate_Memory(&System_Memory, &pointer,2048, NU_NO_SUSPEND);
//track2 = (CHAR*)pointer;
//NU_Allocate_Memory(&System_Memory, &pointer,2048, NU_NO_SUSPEND);
//track3 = (CHAR*)pointer;
//memset(track2,0,2048);
//memset(track3,0,2048);
ADD2 = track2;
ADD3 = track3;
irq_enable( Track2_irq );
irq_enable( Track3_irq );
unmask_irq( Track2_irq );
unmask_irq( Track3_irq );
for(i=0;i<70000;i++);
}
VOID TRA2_HISR_ENTRY ( VOID )
{
if(!( *(RP)PORTC_DATA & ( CP_low ) ) )
{
*ADD2=(CHAR)(*(RP)PORTC_DATA & 0x02 );
ADD2++;
a++;
NU_Set_Events(&Event_Group_ReadCard, 0x01, NU_OR );
}
}
VOID TRA3_HISR_ENTRY ( VOID )
{
if(!( *(RP)PORTC_DATA & ( CP_low ) ) )
{
*ADD3=(CHAR)(*(RP)PORTC_DATA & 0x04) ;
ADD3++;
b++;
NU_Set_Events(&Event_Group_ReadCard, 0x01, NU_OR );
}
}
VOID Track3_int ( INT Vector )
{
NU_Activate_HISR(&TRA3_HISR);
*(RP)PORTE_INTRCLR |= 0x0040;
*(RP)PORTE_INTRCLR = 0x0000;
}
VOID Track2_int ( INT Vector )
{
NU_Activate_HISR(&TRA2_HISR);
*(RP)PORTE_INTRCLR |= 0x0020;
*(RP)PORTE_INTRCLR = 0x0000;
}
CHAR Track2(VOID)
{
CHAR temp=0x00;
temp = Check_Track2_Forward();
if(temp!=ERROR)
return TRACK2FORWARD;
else
{
temp = Check_Track2_Back();
if(temp!=ERROR)
return TRACK2BACK;
}
if(temp==ERROR)
return ERROR;
}
CHAR Track3(VOID)
{
CHAR temp=0x00;
temp = Check_Track3_Forward();
if(temp!=ERROR)
return TRACK3FORWARD;
else
{
temp = Check_Track3_Back();
if(temp!=ERROR)
return TRACK3BACK;
}
if(temp==ERROR)
return ERROR;
}
CHAR Check_Track2_Forward(VOID)
{
INT i=0,num1=0,num=1;
CHAR check=0x00;
if(Track_2[0]==0x0b)
{
for(i=1;i<40;i++)
{
check = CHECK(Track_2[i]);
if(check==ERROR)
return ERROR;
//if((Track_2[i]==0x0b)&&(num1==0))
//return ERROR;
if(Track_2[i]!=0x00)
num ++;
if(Track_2[i]==0x1f)
{
num1 ++;
break;
}
}
if(num<23)
return ERROR;
if(num1<1)
return ERROR;
}
else
return ERROR;
return OK;
}
CHAR Check_Track2_Back(VOID)
{
INT i=0,num1=0,num=1;
CHAR check=0x00;
if(Track_2_Back[0]==0x0b)
{
for(i=1;i<40;i++)
{
check = CHECK(Track_2_Back[i]);
if(check==ERROR)
return ERROR;
//if((Track_2_Back[i]==0x0b)&&(num1==0))
//return ERROR;
if(Track_2_Back[i]!=0x00)
num ++;
if(Track_2_Back[i]==0x1f)
{
num1 ++;
break;
}
}
if(num<23)
return ERROR;
if(num1<1)
return ERROR;
}
else
return ERROR;
return OK;
}
CHAR Check_Track3_Forward(VOID)
{
INT i=0,num1=0,num=1;
CHAR check=0x00;
if(Track_3[0]==0x0b)
{
for(i=1;i<107;i++)
{
check = CHECK(Track_3[i]);
if(check==ERROR)
return ERROR;
//if((Track_3[i]==0x0b)&&(num1==0))
//return ERROR;
if(Track_3[i]!=0x00)
num ++;
if(Track_3[i]==0x1f)
{
num1 ++;
break;
}
}
if(num<66)
return ERROR;
if(num1<1)
return ERROR;
}
else
return ERROR;
return OK;
}
CHAR Check_Track3_Back(VOID)
{
INT i=0,num1=0,num=1;
CHAR check=0x00;
if(Track_3_Back[0]==0x0b)
{
for(i=1;i<107;i++)
{
check = CHECK(Track_3_Back[i]);
if(check==ERROR)
return ERROR;
//if((Track_3_Back[i]==0x0b)&&(num1==0))
//return ERROR;
if(Track_3_Back[i]!=0x00)
num ++;
if(Track_3_Back[i]==0x1f)
{
num1 ++;
break;
}
}
if(num<66)
return ERROR;
if(num1<1)
return ERROR;
}
else
return ERROR;
return OK;
}
CHAR CHECK(CHAR data)
{
INT num=0,i=0;
for(i=0;i<8;i++)
{
if(data&(0x01<<i))
num ++;
}
if(num%2)
return OK;
else
return ERROR;
}
CHAR BACKTRACK2(CHAR *data,INT len)
{
INT i=0,bitnum=0,num=0,tack2_back_num=0;
CHAR *temp;
CHAR check=0x00;
bitnum = len-1;
temp = data+bitnum;
while(1)
{
if(*(temp)&0x02)
{
temp --;
num++;
if(num>len)
return ERROR;
}
else
{
for(i=0;i<5;i++)
{
if((*temp)&0x02)
check |= (0x00<<i);
else
check |= (0x01<<i);
temp --;
num ++;
if(num>len)
return ERROR;
}
if(check==0x0b)
{
Track_2_Back[tack2_back_num] = check;
tack2_back_num ++;
i = 0;
check = 0x00;
while(1)
{
for(i=0;i<5;i++)
{
if((*temp)&0x02)
check |= (0x00<<i);
else
check |= (0x01<<i);
temp --;
num ++;
//if(num>len)
//return ERROR;
}
Track_2_Back[tack2_back_num] = check;
tack2_back_num ++;
i = 0;
check = 0x00;
if(num>len)
{
//Track2_Back_Count = tack2_back_num;
tack2_back_num = 0;
return OK;
}
}
}
else
{
tack2_back_num = 0;
return ERROR;
}
}
}
}
CHAR BACKTRACK3(CHAR *data,INT len)
{
INT i=0,bitnum=0,num=0,tack3_back_num=0;
CHAR *temp;
CHAR check=0x00;
bitnum = len-1;
temp = data+bitnum;
while(1)
{
if(*(temp)&0x04)
{
temp --;
num++;
if(num>len)
return ERROR;
}
else
{
for(i=0;i<5;i++)
{
if((*temp)&0x04)
check |= (0x00<<i);
else
check |= (0x01<<i);
temp --;
num ++;
if(num>len)
return ERROR;
}
if(check==0x0b)
{
Track_3_Back[tack3_back_num] = check;
tack3_back_num ++;
i = 0;
check = 0x00;
while(1)
{
for(i=0;i<5;i++)
{
if((*temp)&0x04)
check |= (0x00<<i);
else
check |= (0x01<<i);
temp --;
num ++;
//if(num>len)
//return ERROR;
}
Track_3_Back[tack3_back_num] = check;
tack3_back_num ++;
i = 0;
check = 0x00;
if(num>len)
{
//Track3_Back_Count = tack3_back_num;
tack3_back_num = 0;
return OK;
}
}
}
else
{
tack3_back_num = 0;
return ERROR;
}
}
}
}
CHAR FORWARDTRACK2(CHAR *data,INT len)
{
INT i=0;
INT num=0;
INT track2_forward_num=0;
CHAR *temp;
CHAR check=0x00;
temp = data;
while(1)
{
if(*temp==0x02)
{
temp ++;
num ++;
if(num>len)
return ERROR;
}
else
{
for(i=0;i<5;i++)
{
if(*(temp)&0x02)
check |= (0x00<<i);
else
check |= (0x01<<i);
num ++;
temp ++;
if(num>len)
return ERROR;
}
if(check==0x0b)
{
Track_2[track2_forward_num] = check;
track2_forward_num ++;
i = 0;
check = 0x00;
while(1)
{
for(i=0;i<5;i++)
{
if(*(temp)&0x02)
check |= (0x00<<i);
else
check |= (0x01<<i);
temp ++;
num ++;
}
Track_2[track2_forward_num] = check;
track2_forward_num ++;
i = 0;
check = 0x00;
if(num>len)
{
//Track2_Count = track2_forward_num;
track2_forward_num = 0;
return OK;
}
}
}
else
{
track2_forward_num = 0;
return ERROR;
}
}
}
}
CHAR FORWARDTRACK3(CHAR *data,INT len)
{
INT i=0;
INT num=0;
INT track3_forward_num=0;
CHAR *temp;
CHAR check=0x00;
temp = data;
while(1)
{
if(*temp==0x04)
{
temp ++;
num ++;
if(num>len)
return ERROR;
}
else
{
for(i=0;i<5;i++)
{
if(*(temp)&0x04)
check |= (0x00<<i);
else
check |= (0x01<<i);
num ++;
temp ++;
if(num>len)
return ERROR;
}
if(check==0x0b)
{
Track_3[track3_forward_num] = check;
track3_forward_num ++;
i = 0;
check = 0x00;
while(1)
{
for(i=0;i<5;i++)
{
if(*(temp)&0x04)
check |= (0x00<<i);
else
check |= (0x01<<i);
temp ++;
num ++;
}
Track_3[track3_forward_num] = check;
track3_forward_num ++;
i = 0;
check = 0x00;
if(num>len)
{
//Track3_Count = track3_forward_num;
track3_forward_num = 0;
return OK;
}
}
}
else
{
track3_forward_num = 0;
return ERROR;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -