| 148 |
148 |
req,
|
| 149 |
149 |
press,
|
| 150 |
150 |
send,
|
|
151 |
ack,
|
| 151 |
152 |
rsp
|
| 152 |
153 |
} state_t;
|
| 153 |
154 |
|
| 154 |
155 |
|
| 155 |
156 |
int main(void) {
|
| 156 |
157 |
uint8_t mbuf[PROGD_PACKET_SIZE];
|
| 157 |
|
uint8_t cbuf[20];
|
|
158 |
uint8_t cbuf[21];
|
| 158 |
159 |
uint8_t clen;
|
| 159 |
|
int8_t cret;
|
| 160 |
160 |
uint8_t resp;
|
| 161 |
|
uint8_t c;
|
|
161 |
uint8_t c;
|
| 162 |
162 |
uint8_t len;
|
| 163 |
163 |
uint8_t retries = 0;
|
| 164 |
164 |
state_t state = req;
|
| ... | ... | |
| 169 |
169 |
card_reader_setup();
|
| 170 |
170 |
sei();
|
| 171 |
171 |
|
| 172 |
|
toggle_led(LED_GREEN|LED_YELLOW|LED_RED, OFF);
|
| 173 |
|
read_card = 0;
|
| 174 |
|
|
| 175 |
172 |
while(1) {
|
| 176 |
|
while(1) {
|
| 177 |
|
read_card = 1;
|
| 178 |
|
if (cr_flag != CR_NONE) {
|
| 179 |
|
read_card = 0;
|
| 180 |
|
if ((cret = parse_card(cbuf, &clen)) < 0) {
|
| 181 |
|
for(c=0;c < 4;c++) {
|
| 182 |
|
toggle_led(LED_RED,ON);
|
| 183 |
|
_delay_ms(250);
|
| 184 |
|
toggle_led(LED_RED,OFF);
|
| 185 |
|
_delay_ms(250);
|
| 186 |
|
}
|
|
173 |
switch(state) {
|
|
174 |
case req:
|
|
175 |
toggle_led(LED_RED|LED_GREEN|LED_YELLOW, OFF);
|
| 187 |
176 |
|
| 188 |
|
} else {
|
| 189 |
|
for (c = 0; c < clen; c++) {
|
| 190 |
|
rs485_send_byte(cbuf[c]);
|
| 191 |
|
}
|
| 192 |
|
}
|
| 193 |
|
cr_flag = CR_NONE;
|
| 194 |
|
}
|
| 195 |
|
}
|
|
177 |
// Start reading cards
|
|
178 |
read_card = 1;
|
| 196 |
179 |
|
|
180 |
// See if we have a card, otherwise check if we got
|
|
181 |
// a message
|
|
182 |
if (cr_flag != CR_NONE) {
|
|
183 |
read_card = 0;
|
| 197 |
184 |
|
|
185 |
// Reading failed
|
|
186 |
if (parse_card(&(cbuf[1]), &clen) < 0) {
|
|
187 |
for(c=0;c < 4;c++) {
|
|
188 |
toggle_led(LED_RED,ON);
|
|
189 |
_delay_ms(250);
|
|
190 |
toggle_led(LED_RED,OFF);
|
|
191 |
_delay_ms(250);
|
|
192 |
}
|
|
193 |
// Reading is good, wait for a key
|
|
194 |
} else {
|
|
195 |
start_timer();
|
|
196 |
reset_timer();
|
|
197 |
reset_timeout_flag();
|
|
198 |
state = press;
|
|
199 |
}
|
| 198 |
200 |
|
| 199 |
|
switch(state) {
|
| 200 |
|
case req:
|
| 201 |
|
toggle_led(LED_RED|LED_GREEN|LED_YELLOW, OFF);
|
| 202 |
|
|
| 203 |
|
// Wait for a packet
|
| 204 |
|
resp = parse_packet(mbuf, &len, ADDR);
|
|
201 |
// Reset the card reader flag
|
|
202 |
cr_flag = CR_NONE;
|
|
203 |
} else {
|
|
204 |
// Wait for a packet
|
|
205 |
resp = parse_packet(mbuf, &len, ADDR);
|
| 205 |
206 |
|
| 206 |
|
if (resp == TT_GET_KEY) {
|
| 207 |
|
_delay_ms(50);
|
| 208 |
|
send_packet(TT_ACK, ADDR, NULL, 0);
|
| 209 |
|
toggle_led(LED_YELLOW, ON);
|
| 210 |
|
reset_timer();
|
| 211 |
|
reset_timeout_flag();
|
| 212 |
|
start_timer();
|
| 213 |
|
c = ' ';
|
| 214 |
|
state = press;
|
| 215 |
|
} else if(resp == TT_PING){
|
| 216 |
|
_delay_ms(50);
|
| 217 |
|
send_packet(TT_ACK, ADDR, NULL, 0);
|
|
207 |
// Ping Request
|
|
208 |
if(resp == TT_PING){
|
|
209 |
_delay_ms(50);
|
|
210 |
send_packet(TT_ACK, ADDR, NULL, 0);
|
|
211 |
}
|
| 218 |
212 |
}
|
| 219 |
213 |
break;
|
| 220 |
214 |
case press:
|
| 221 |
|
c = get_button();
|
|
215 |
toggle_led(LED_YELLOW,ON);
|
|
216 |
cbuf[0] = get_button();
|
| 222 |
217 |
retries = 0;
|
| 223 |
218 |
|
| 224 |
219 |
if (seconds > TIMEOUT_SECONDS) {
|
| 225 |
220 |
set_timeout_flag();
|
| 226 |
221 |
state = send;
|
| 227 |
|
} else if (c != ' ') {
|
|
222 |
} else if (cbuf[0] != ' ') {
|
| 228 |
223 |
state = send;
|
| 229 |
224 |
} else {
|
| 230 |
225 |
_delay_ms(100);
|
| ... | ... | |
| 233 |
228 |
break;
|
| 234 |
229 |
case send:
|
| 235 |
230 |
if (get_timeout_flag() == 1) {
|
| 236 |
|
_delay_ms(50);
|
| 237 |
|
send_packet(TT_TIMEOUT, ADDR, NULL, 0);
|
|
231 |
toggle_led(LED_RED|LED_YELLOW,ON);
|
|
232 |
_delay_ms(500);
|
|
233 |
toggle_led(LED_RED|LED_YELLOW,OFF);
|
|
234 |
_delay_ms(500);
|
| 238 |
235 |
state = req;
|
| 239 |
|
break;
|
| 240 |
236 |
} else {
|
| 241 |
237 |
_delay_ms(50);
|
| 242 |
|
send_packet(TT_SEND_KEY, ADDR, &c, 1);
|
|
238 |
send_packet(TT_KC, ADDR, cbuf, 1 + clen);
|
|
239 |
state = ack;
|
| 243 |
240 |
}
|
| 244 |
241 |
|
| 245 |
|
state = rsp;
|
| 246 |
242 |
break;
|
| 247 |
|
case rsp:
|
| 248 |
|
resp = parse_packet(mbuf, &len, ADDR);
|
|
243 |
case ack:
|
|
244 |
resp = parse_packet(mbuf, &len, ADDR);
|
| 249 |
245 |
|
| 250 |
246 |
if (resp == TT_ACK) {
|
| 251 |
|
toggle_led(LED_GREEN, ON);
|
| 252 |
|
} else if ((resp == TT_NACK) || (retries == TT_MAX_RETRY)) {
|
|
247 |
state = rsp;
|
|
248 |
start_timer();
|
|
249 |
reset_timer();
|
|
250 |
state = rsp;
|
|
251 |
} else if (retries == TT_MAX_RETRY) {
|
| 253 |
252 |
toggle_led(LED_RED, ON);
|
|
253 |
_delay_ms(1000);
|
|
254 |
toggle_led(LED_RED, OFF);
|
|
255 |
state = req;
|
| 254 |
256 |
} else {
|
| 255 |
257 |
retries++;
|
| 256 |
258 |
state = send;
|
| 257 |
|
break;
|
| 258 |
259 |
}
|
|
260 |
break;
|
| 259 |
261 |
|
| 260 |
|
_delay_ms(1000);
|
| 261 |
|
toggle_led(LED_RED, OFF);
|
| 262 |
|
toggle_led(LED_GREEN, ON);
|
| 263 |
|
state = req;
|
|
262 |
case rsp:
|
|
263 |
resp = parse_packet(mbuf, &len, ADDR);
|
|
264 |
|
|
265 |
if (resp == TT_GRANT) {
|
|
266 |
toggle_led(LED_GREEN, ON);
|
|
267 |
_delay_ms(1000);
|
|
268 |
toggle_led(LED_GREEN, OFF);
|
|
269 |
state = req;
|
|
270 |
} else if (resp == TT_DENY) {
|
|
271 |
toggle_led(LED_RED, ON);
|
|
272 |
_delay_ms(1000);
|
|
273 |
toggle_led(LED_RED, OFF);
|
|
274 |
state = req;
|
|
275 |
} else if (seconds > TT_MAX_RETRY) {
|
|
276 |
toggle_led(LED_RED,ON);
|
|
277 |
_delay_ms(1000);
|
|
278 |
toggle_led(LED_RED, OFF);
|
|
279 |
state = req;
|
|
280 |
}
|
|
281 |
|
| 264 |
282 |
break;
|
| 265 |
283 |
default:
|
| 266 |
284 |
state = req;
|