|
@@ -3,7 +3,7 @@
|
3
|
3
|
#include <SoftwareSerial.h>
|
4
|
4
|
#include <SCLib.h>
|
5
|
5
|
|
6
|
|
-#define ledPin 13
|
|
6
|
+#define STATUS_LED 13
|
7
|
7
|
|
8
|
8
|
#define READER_VCC
|
9
|
9
|
#define READER_RST 4
|
|
@@ -20,9 +20,9 @@
|
20
|
20
|
#define CARD_IO 10
|
21
|
21
|
#define CARD_PRE 12
|
22
|
22
|
|
23
|
|
-SmartCardReader cardReader(CARD_IO, CARD_RST, CARD_VCC, CARD_PRE, CARD_CLK, true);
|
24
|
|
-uint8_t atr[MAX_ATR_BYTES];
|
25
|
|
-int atr_size;
|
|
23
|
+SmartCardReader cardReader(CARD_IO, CARD_RST, CARD_VCC, CARD_PRE, CARD_CLK, false);
|
|
24
|
+uint8_t readerAtr[MAX_ATR_BYTES];
|
|
25
|
+int readerAtrSize = 0;
|
26
|
26
|
|
27
|
27
|
bool readerReset = false;
|
28
|
28
|
int baudRate = -1;
|
|
@@ -43,18 +43,13 @@ int digitalPinToInterrupt(int pin)
|
43
|
43
|
|
44
|
44
|
#endif
|
45
|
45
|
|
46
|
|
-void onReaderReset()
|
47
|
|
-{
|
48
|
|
- readerReset = true;
|
49
|
|
-}
|
50
|
|
-
|
51
|
|
-void computeEtu()
|
|
46
|
+void emulatorComputeEtu()
|
52
|
47
|
{
|
53
|
48
|
baudRate = 9600;
|
54
|
49
|
etu = 1000000 / baudRate;
|
55
|
50
|
}
|
56
|
51
|
|
57
|
|
-void sendAtrByte(char byte)
|
|
52
|
+void emulatorSendAtrByte(char byte)
|
58
|
53
|
{
|
59
|
54
|
unsigned long nextBitTime = micros() + (2 * etu);
|
60
|
55
|
digitalWrite(READER_IO, HIGH);
|
|
@@ -89,16 +84,25 @@ void sendAtrByte(char byte)
|
89
|
84
|
}
|
90
|
85
|
}
|
91
|
86
|
|
92
|
|
-void sendAtr(const uint8_t* atr, size_t size)
|
|
87
|
+void emulatorSendAtr(const uint8_t* atr, size_t size)
|
93
|
88
|
{
|
94
|
89
|
pinMode(READER_IO, OUTPUT);
|
95
|
90
|
for (int i = 0; i < size; ++i)
|
96
|
91
|
{
|
97
|
|
- sendAtrByte(atr[i]);
|
|
92
|
+ emulatorSendAtrByte(atr[i]);
|
98
|
93
|
delayMicroseconds(4*etu);
|
99
|
94
|
}
|
100
|
95
|
}
|
101
|
96
|
|
|
97
|
+void readerResetAtr()
|
|
98
|
+{
|
|
99
|
+ for (size_t i = 0; i < sizeof(readerAtr); ++i)
|
|
100
|
+ {
|
|
101
|
+ readerAtr[i] = 0;
|
|
102
|
+ }
|
|
103
|
+ readerAtrSize = 0;
|
|
104
|
+}
|
|
105
|
+
|
102
|
106
|
void setup() {
|
103
|
107
|
Serial.begin(9600);
|
104
|
108
|
Serial.println("Initializing...");
|
|
@@ -108,37 +112,47 @@ void setup() {
|
108
|
112
|
pinMode(READER_IO, OUTPUT);
|
109
|
113
|
digitalWrite(READER_IO, HIGH);
|
110
|
114
|
|
111
|
|
- pinMode(ledPin, OUTPUT);
|
112
|
|
- digitalWrite (ledPin, LOW);
|
|
115
|
+ pinMode(STATUS_LED, OUTPUT);
|
|
116
|
+ digitalWrite(STATUS_LED, LOW);
|
113
|
117
|
Serial.println("Initialized");
|
114
|
118
|
|
115
|
|
-
|
116
|
|
- atr_size = cardReader.activate(atr, sizeof(atr));
|
117
|
|
- cardReader.deactivate();
|
|
119
|
+ readerResetAtr();
|
118
|
120
|
}
|
119
|
121
|
|
120
|
122
|
void loop() {
|
121
|
123
|
|
122
|
|
- if (digitalRead(READER_RST))
|
|
124
|
+ if (readerAtrSize == 0)
|
123
|
125
|
{
|
124
|
|
- if (!readerReset)
|
|
126
|
+ if (cardReader.cardInserted())
|
125
|
127
|
{
|
126
|
|
-// atr_size = cardReader.activate(atr, sizeof(atr));
|
127
|
|
-
|
128
|
|
-// uint8_t atr[] = {0x3B, 0x65, 0x00, 0x00, 0x20, 0x63, 0xCB, 0x6C, 0x80};
|
129
|
|
-// int atr_size = sizeof(atr);
|
130
|
|
- computeEtu();
|
131
|
|
- sendAtr(atr, atr_size);
|
132
|
|
- readerReset = true;
|
133
|
|
- digitalWrite(ledPin, !digitalRead(ledPin));
|
134
|
|
-
|
135
|
|
-// cardReader.deactivate();
|
|
128
|
+ readerAtrSize = cardReader.activate(readerAtr, sizeof(readerAtr));
|
|
129
|
+ cardReader.dumpHEX(readerAtr, readerAtrSize);
|
|
130
|
+ cardReader.deactivate();
|
|
131
|
+ digitalWrite(STATUS_LED, HIGH);
|
136
|
132
|
}
|
137
|
133
|
}
|
138
|
134
|
else
|
139
|
135
|
{
|
140
|
|
- if (readerReset) {
|
141
|
|
- readerReset = false;
|
|
136
|
+ if (!cardReader.cardInserted())
|
|
137
|
+ {
|
|
138
|
+ readerResetAtr();
|
|
139
|
+ digitalWrite(STATUS_LED, LOW);
|
|
140
|
+ }
|
|
141
|
+ else if (digitalRead(READER_RST))
|
|
142
|
+ {
|
|
143
|
+ if (!readerReset)
|
|
144
|
+ {
|
|
145
|
+ emulatorComputeEtu();
|
|
146
|
+ emulatorSendAtr(readerAtr, readerAtrSize);
|
|
147
|
+ readerReset = true;
|
|
148
|
+ }
|
|
149
|
+ }
|
|
150
|
+ else
|
|
151
|
+ {
|
|
152
|
+ if (readerReset)
|
|
153
|
+ {
|
|
154
|
+ readerReset = false;
|
|
155
|
+ }
|
142
|
156
|
}
|
143
|
157
|
}
|
144
|
158
|
}
|