implement CEMU_USB_MSGT_DT_GET_STATUS

card_emu can now report its current satus upon request.
diff --git a/firmware/src_simtrace/card_emu.c b/firmware/src_simtrace/card_emu.c
index 8e9fef8..b08e919 100644
--- a/firmware/src_simtrace/card_emu.c
+++ b/firmware/src_simtrace/card_emu.c
@@ -822,6 +822,36 @@
 	}
 }
 
+void card_emu_report_status(struct card_handle *ch)
+{
+	struct req_ctx *rctx;
+	struct cardemu_usb_msg_status *sts;
+
+	rctx = req_ctx_find_get(0, RCTX_S_FREE, RCTX_S_UART_RX_BUSY);
+	if (!rctx)
+		return;
+	
+	rctx->tot_len = sizeof(*sts);
+	sts = (struct cardemu_usb_msg_status *)rctx->data;
+	sts->hdr.msg_type = CEMU_USB_MSGT_DO_STATUS;
+	sts->hdr.msg_len = sizeof(*sts);
+	sts->flags = 0;
+	if (ch->vcc_active)
+		sts->flags |= CEMU_STATUS_F_VCC_PRESENT;
+	if (ch->clocked)
+		sts->flags |= CEMU_STATUS_F_CLK_ACTIVE;
+	if (ch->in_reset)
+		sts->flags |= CEMU_STATUS_F_RESET_ACTIVE;
+	/* FIXME: voltage + card insert */
+	sts->fi = ch->fi;
+	sts->di = ch->di;
+	sts->wi = ch->wi;
+	sts->waiting_time = ch->waiting_time;
+
+	llist_add_tail(&rctx->list, &ch->usb_tx_queue);
+	req_ctx_set_state(rctx, RCTX_S_USB_TX_PENDING);
+}
+
 /* hardware driver informs us that a card I/O signal has changed */
 void card_emu_io_statechg(struct card_handle *ch, enum card_io io, int active)
 {
diff --git a/firmware/src_simtrace/card_emu.h b/firmware/src_simtrace/card_emu.h
index 95d2bae..2b2d3f1 100644
--- a/firmware/src_simtrace/card_emu.h
+++ b/firmware/src_simtrace/card_emu.h
@@ -27,6 +27,7 @@
 struct llist_head *card_emu_get_uart_tx_queue(struct card_handle *ch);
 struct llist_head *card_emu_get_usb_tx_queue(struct card_handle *ch);
 void card_emu_have_new_uart_tx(struct card_handle *ch);
+void card_emu_report_status(struct card_handle *ch);
 
 #define ENABLE_TX	0x01
 #define ENABLE_RX	0x02
diff --git a/firmware/src_simtrace/cardemu_prot.h b/firmware/src_simtrace/cardemu_prot.h
index 1a8c213..8b781bc 100644
--- a/firmware/src_simtrace/cardemu_prot.h
+++ b/firmware/src_simtrace/cardemu_prot.h
@@ -92,6 +92,7 @@
 #define CEMU_STATUS_F_CLK_ACTIVE	0x00000002
 #define CEMU_STATUS_F_RCEMU_ACTIVE	0x00000004
 #define CEMU_STATUS_F_CARD_INSERT	0x00000008
+#define CEMU_STATUS_F_RESET_ACTIVE	0x00000010
 
 /* CEMU_USB_MSGT_DO_STATUS */
 struct cardemu_usb_msg_status {
diff --git a/firmware/src_simtrace/mode_cardemu.c b/firmware/src_simtrace/mode_cardemu.c
index 165c32b..609b1ee 100644
--- a/firmware/src_simtrace/mode_cardemu.c
+++ b/firmware/src_simtrace/mode_cardemu.c
@@ -316,8 +316,10 @@
 			PIO_Clear(&ci->pin_insert);
 		req_ctx_put(rctx);
 		break;
-	case CEMU_USB_MSGT_DT_GET_STATS:
 	case CEMU_USB_MSGT_DT_GET_STATUS:
+		card_emu_report_status(ci->ch);
+		break;
+	case CEMU_USB_MSGT_DT_GET_STATS:
 	default:
 		/* FIXME */
 		req_ctx_put(rctx);