Blame view

main.c 4.51 KB
1a2e5ee4   henyxia   Big revision
1
2
  #include <util/delay.h>
  #include <avr/io.h>
55af57c0   henyxia   Customized versio...
3
  #include "PN532.h"
1a2e5ee4   henyxia   Big revision
4
  #include <PN532_SPI/PN532_SPI.h>
55af57c0   henyxia   Customized versio...
5
  
18f21c2f   henyxia   Rev 1.1
6
7
8
9
10
11
12
13
14
15
16
17
  #define __SCREEN_DEBUG__
  
  #ifdef __SCREEN_DEBUG__
  #define	MODEL_QUERY			'A'
  #define	SERIAL_ERROR		'G'
  #define	NFC_TAGQUERY		'C'
  #define	NFC_TAGQUERY_UID	'H'
  #define	NFC_ARDUINO			'B'
  #define	NFC_NOTAG			'D'
  #define	NFC_TYPE_PROFESSOR	'E'
  #define	NFC_TYPE_STUDENT	'F'
  #else
25fb98d3   henyxia   Rev 1
18
19
20
21
22
23
  #define	MODEL_QUERY			0x80
  #define	SERIAL_ERROR		0x55
  #define	NFC_TAGQUERY		0x82
  #define	NFC_TAGQUERY_UID	0x84
  #define	NFC_ARDUINO			0x02
  #define	NFC_NOTAG			0x81
1a2e5ee4   henyxia   Big revision
24
  #define	NFC_TYPE_PROFESSOR	0x04
25fb98d3   henyxia   Rev 1
25
  #define	NFC_TYPE_STUDENT	0x01
18f21c2f   henyxia   Rev 1.1
26
27
  #endif
  
1a2e5ee4   henyxia   Big revision
28
  #define	CPU_FREQ			16000000L
18f21c2f   henyxia   Rev 1.1
29
  #define	SERIAL_SPEED		19200
25fb98d3   henyxia   Rev 1
30
  
18f21c2f   henyxia   Rev 1.1
31
  boolean	tagDetected = false;
25fb98d3   henyxia   Rev 1
32
33
  boolean	tagType;
  
55af57c0   henyxia   Customized versio...
34
35
36
  PN532_SPI pn532spi(SPI, 10);
  PN532 nfc(pn532spi);
  
1a2e5ee4   henyxia   Big revision
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
  void init_serial(int speed)
  {
  	UBRR0 = CPU_FREQ/(((unsigned long int)speed)<<4)-1;
  	UCSR0B = (1<<TXEN0 | 1<<RXEN0);
  	UCSR0C = (1<<UCSZ01 | 1<<UCSZ00);
  	UCSR0A &= ~(1 << U2X0);
  }
  
  void send_serial(unsigned char c)
  {
  	loop_until_bit_is_set(UCSR0A, UDRE0);
  	UDR0 = c;
  }
  
  unsigned char get_serial(void)
  {
  	loop_until_bit_is_set(UCSR0A, RXC0);
  	return UDR0;
  }
  
  
25fb98d3   henyxia   Rev 1
58
59
60
61
  void setup(void)
  {
  	int ser;
  
18f21c2f   henyxia   Rev 1.1
62
  	init_serial(SERIAL_SPEED);
55af57c0   henyxia   Customized versio...
63
  
55af57c0   henyxia   Customized versio...
64
65
  	nfc.begin();
  
55af57c0   henyxia   Customized versio...
66
  	uint32_t versiondata = nfc.getFirmwareVersion();
25fb98d3   henyxia   Rev 1
67
  	if(!versiondata)
55af57c0   henyxia   Customized versio...
68
  	{
1a2e5ee4   henyxia   Big revision
69
  		send_serial(SERIAL_ERROR);
55af57c0   henyxia   Customized versio...
70
  		while (1);
25fb98d3   henyxia   Rev 1
71
72
  	}  
  
55af57c0   henyxia   Customized versio...
73
74
  	nfc.SAMConfig();
    
25fb98d3   henyxia   Rev 1
75
76
  	do
  	{
1a2e5ee4   henyxia   Big revision
77
  		ser = get_serial();
25fb98d3   henyxia   Rev 1
78
  		if(ser == MODEL_QUERY)
1a2e5ee4   henyxia   Big revision
79
  			send_serial(NFC_ARDUINO);
25fb98d3   henyxia   Rev 1
80
  		else
1a2e5ee4   henyxia   Big revision
81
  			send_serial(SERIAL_ERROR);
25fb98d3   henyxia   Rev 1
82
  	}while(ser != MODEL_QUERY);
55af57c0   henyxia   Customized versio...
83
84
  }
  
18f21c2f   henyxia   Rev 1.1
85
86
87
88
89
90
91
92
  uint8_t success;
  uint8_t uid[] = { 0, 0, 0, 0, 0, 0, 0 };
  uint8_t uidLength;
  uint8_t data1[16];
  uint8_t data2[16];
  char  professorTag[7];
  char  studentTag[9] = {'0', '1', '2', '3', '4', '5', '6', '7'};
  int ser;
55af57c0   henyxia   Customized versio...
93
94
95
  
  void loop(void)
  {
55af57c0   henyxia   Customized versio...
96
      
55af57c0   henyxia   Customized versio...
97
  	success = nfc.readPassiveTargetID(PN532_MIFARE_ISO14443A, uid, &uidLength);
25fb98d3   henyxia   Rev 1
98
99
  
  	if(success && !tagDetected)
55af57c0   henyxia   Customized versio...
100
  	{
55af57c0   henyxia   Customized versio...
101
102
  		if(uidLength == 4)
  		{
55af57c0   henyxia   Customized versio...
103
  			uint8_t keya[6] = { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 };
25fb98d3   henyxia   Rev 1
104
  			success = nfc.mifareclassic_AuthenticateBlock(uid, uidLength, 44, 0, keya);  
55af57c0   henyxia   Customized versio...
105
106
  			if(success)
  			{
25fb98d3   henyxia   Rev 1
107
  				success = nfc.mifareclassic_ReadDataBlock(44, data1);
18f21c2f   henyxia   Rev 1.1
108
109
110
  
  				//_delay_ms(50);
  
55af57c0   henyxia   Customized versio...
111
112
  				if(success)
  				{
25fb98d3   henyxia   Rev 1
113
114
115
116
117
118
119
120
121
122
123
124
  					success = nfc.mifareclassic_ReadDataBlock(45, data2);
  
  					if(success)
  					{
  						tagDetected = true;
  						if(data1[4] == data1[15] &&
  						data1[5] == data2[0] &&
  						data1[6] == data2[1] &&
  						data1[7] == data2[2] &&
  						data1[8] == data2[3] &&
  						data1[9] == data2[4])
  						{
18f21c2f   henyxia   Rev 1.1
125
  							//send_serial('M');
25fb98d3   henyxia   Rev 1
126
  							tagType = NFC_TYPE_PROFESSOR;
18f21c2f   henyxia   Rev 1.1
127
128
129
130
131
132
  							professorTag[0] = data1[4];
  							professorTag[1] = data1[5];
  							professorTag[2] = data1[6];
  							professorTag[3] = data1[7];
  							professorTag[4] = data1[8];
  							professorTag[5] = data1[9];
25fb98d3   henyxia   Rev 1
133
134
135
  						}
  						else
  						{
18f21c2f   henyxia   Rev 1.1
136
  							//send_serial('N');
25fb98d3   henyxia   Rev 1
137
  							tagType = NFC_TYPE_STUDENT;
18f21c2f   henyxia   Rev 1.1
138
139
140
141
142
143
144
145
  							studentTag[0] = data1[15];
  							studentTag[1] = data2[0];
  							studentTag[2] = data2[1];
  							studentTag[3] = data2[2];
  							studentTag[4] = data2[3];
  							studentTag[5] = data2[4];
  							studentTag[6] = data2[5];
  							studentTag[7] = data2[6];
25fb98d3   henyxia   Rev 1
146
147
  						}
  					}
18f21c2f   henyxia   Rev 1.1
148
149
  					//else
  						//send_serial('L');
55af57c0   henyxia   Customized versio...
150
  				}
18f21c2f   henyxia   Rev 1.1
151
152
  				//else
  					//send_serial('K');
55af57c0   henyxia   Customized versio...
153
  			}
18f21c2f   henyxia   Rev 1.1
154
155
  			//else
  				//send_serial('J');
55af57c0   henyxia   Customized versio...
156
  		}
18f21c2f   henyxia   Rev 1.1
157
158
  		//else
  			//send_serial('I');
25fb98d3   henyxia   Rev 1
159
160
161
  	}
  	else if(tagDetected)
  	{
1a2e5ee4   henyxia   Big revision
162
  		ser = get_serial();
25fb98d3   henyxia   Rev 1
163
  		if(ser == NFC_TAGQUERY)
1a2e5ee4   henyxia   Big revision
164
  			send_serial(tagType);
25fb98d3   henyxia   Rev 1
165
  		else if(ser == NFC_TAGQUERY_UID)
55af57c0   henyxia   Customized versio...
166
  		{
1a2e5ee4   henyxia   Big revision
167
                      if(tagType == NFC_TYPE_STUDENT)
18f21c2f   henyxia   Rev 1.1
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
                      {
                          send_serial(studentTag[0]);
  						_delay_ms(50);
  						send_serial(studentTag[1]);
  						_delay_ms(50);
                          send_serial(studentTag[2]);
  						_delay_ms(50);
  						send_serial(studentTag[3]);
  						_delay_ms(50);
                          send_serial(studentTag[4]);
  						_delay_ms(50);
  						send_serial(studentTag[5]);
  						_delay_ms(50);
  	                    send_serial(studentTag[6]);
  						_delay_ms(50);
  						send_serial(studentTag[7]);
  						_delay_ms(50);
1a2e5ee4   henyxia   Big revision
185
186
187
188
                      }
                      else
                      {
                          send_serial(professorTag[0]);
18f21c2f   henyxia   Rev 1.1
189
190
191
192
193
                          send_serial(professorTag[1]);
                          send_serial(professorTag[2]);
                          send_serial(professorTag[3]);
                          send_serial(professorTag[4]);
                          send_serial(professorTag[5]);
1a2e5ee4   henyxia   Big revision
194
195
                      }
  		    tagDetected = false;
18f21c2f   henyxia   Rev 1.1
196
  			_delay_ms(5000);
55af57c0   henyxia   Customized versio...
197
  		}
25fb98d3   henyxia   Rev 1
198
  		else
18f21c2f   henyxia   Rev 1.1
199
  			send_serial(SERIAL_ERROR);
25fb98d3   henyxia   Rev 1
200
201
202
  	}
  	else
  	{
1a2e5ee4   henyxia   Big revision
203
204
  		if(get_serial() == NFC_TAGQUERY)
  			send_serial(NFC_NOTAG);
18f21c2f   henyxia   Rev 1.1
205
206
  		else
  			send_serial(SERIAL_ERROR);
55af57c0   henyxia   Customized versio...
207
208
  	}
  }
1a2e5ee4   henyxia   Big revision
209
210
211
212
213
214
  
  int main(void)
  {
  	setup();
  
  	while(1)
18f21c2f   henyxia   Rev 1.1
215
  		loop();
1a2e5ee4   henyxia   Big revision
216
217
218
  
  	return 0;
  }