blob: fcec1c1f0f9064e96ae61a62de7c8fff42f5336e [file] [log] [blame]
Christina Quast2b8a18b2015-04-12 09:31:36 +02001#include "board.h"
2
3static volatile bool write_to_host_in_progress = false;
Christina Quastbe235272015-05-02 17:56:32 +02004static struct iso7816_3_handle ih = {0};
5static bool check_for_pts = false;
6static enum pts_state state;
Christina Quast2b8a18b2015-04-12 09:31:36 +02007
8void USB_write_callback(uint8_t *pArg, uint8_t status, uint32_t transferred, uint32_t remaining)
9{
10 if (status != USBD_STATUS_SUCCESS) {
11 TRACE_ERROR("USB err status: %d (%s)\n", __FUNCTION__, status);
12 }
13 write_to_host_in_progress = false;
Christina Quast4bec8d82015-04-21 23:03:59 +020014 TRACE_DEBUG("WR_CB\n");
Christina Quast2b8a18b2015-04-12 09:31:36 +020015}
16
17int send_to_host()
18{
19 static uint8_t msg[RING_BUFLEN];
20 int ret = 0;
Christina Quastb595e7c2015-04-12 13:31:01 +020021 unsigned int i;
Christina Quast2b8a18b2015-04-12 09:31:36 +020022
23 for(i = 0; !rbuf_is_empty(&sim_rcv_buf) && i < sizeof(msg); i++) {
24 msg[i] = rbuf_read(&sim_rcv_buf);
25 }
Christina Quast4bec8d82015-04-21 23:03:59 +020026 TRACE_DEBUG("Wr %d\n", i);
Christina Quast2b8a18b2015-04-12 09:31:36 +020027 write_to_host_in_progress = true;
28 ret = USBD_Write( PHONE_DATAIN, msg, i, (TransferCallback)&USB_write_callback, 0 );
29 if (ret != USBD_STATUS_SUCCESS) {
30 TRACE_ERROR("Error sending to host (%x)\n", ret);
31 write_to_host_in_progress = false;
32 }
33 return ret;
34}
35
36int check_data_from_phone()
37{
38 int ret = 0;
39
40 if((rbuf_is_empty(&sim_rcv_buf) || write_to_host_in_progress == true)) {
41 return ret;
42 }
Christina Quastbe235272015-05-02 17:56:32 +020043 if ((check_for_pts == false) && (rbuf_peek(&sim_rcv_buf) == 0xff)) {
44// FIXME: set var to false
45 check_for_pts = true;
46 ih = (struct iso7816_3_handle){0};
47 }
48 if (check_for_pts == true) {
49 while (!rbuf_is_empty(&sim_rcv_buf) && (ih.pts_state != PTS_END)) {
50 state = process_byte_pts(&ih, rbuf_read(&sim_rcv_buf));
51 }
52 if (ih.pts_bytes_processed > 6 && ih.pts_state != PTS_END) {
53 int i;
54 for (i = 0; i < ih.pts_bytes_processed; i++)
55 printf("s: %x", ih.pts_req[i]);
56 check_for_pts = false;
57 rbuf_write(&sim_rcv_buf, ih.pts_req[i]);
58 } else {
59 printf("fin pts\n", ih.pts_state);
60 check_for_pts = false;
61 }
62 }
Christina Quast2b8a18b2015-04-12 09:31:36 +020063 ret = send_to_host();
64 return ret;
65}