card_emu: Introduce new flush_rx_buffer() function and use it
diff --git a/firmware/src_simtrace/card_emu.c b/firmware/src_simtrace/card_emu.c
index 5418e3c..f1f7605 100644
--- a/firmware/src_simtrace/card_emu.c
+++ b/firmware/src_simtrace/card_emu.c
@@ -145,6 +145,26 @@
 static void set_tpdu_state(struct card_handle *ch, enum tpdu_state new_ts);
 static void set_pts_state(struct card_handle *ch, enum pts_state new_ptss);
 
+static void flush_rx_buffer(struct card_handle *ch)
+{
+	struct req_ctx *rctx;
+	struct cardemu_usb_msg_rx_data *rd;
+
+	rctx = ch->uart_rx_ctx;
+	if (!rctx)
+		return;
+
+	rd = (struct cardemu_usb_msg_rx_data *) ch->uart_rx_ctx->data;
+
+	/* store length of data payload fild in header */
+	rd->hdr.data_len = rctx->idx;
+	req_ctx_set_state(rctx, RCTX_S_USB_TX_PENDING);
+	ch->uart_rx_ctx = NULL;
+
+	/* FIXME: call into USB code to see if this buffer can
+	 * be transmitted now */
+}
+
 static void update_fidi(struct card_handle *ch)
 {
 	int rc;
@@ -359,7 +379,7 @@
 
 	/* ensure we have a buffer */
 	if (!ch->uart_rx_ctx) {
-		ch->uart_rx_ctx = req_ctx_find_get(1, RCTX_S_FREE, RCTX_S_UART_RX_BUSY);
+		rctx = ch->uart_rx_ctx = req_ctx_find_get(1, RCTX_S_FREE, RCTX_S_UART_RX_BUSY);
 		if (!ch->uart_rx_ctx)
 			return;
 		rd = (struct cardemu_usb_msg_rx_data *) ch->uart_rx_ctx->data;
@@ -375,14 +395,8 @@
 	rctx->tot_len++;
 
 	/* check if the buffer is full. If so, send it */
-	if (rctx->tot_len >= rctx->size) {
-		/* store length of data payload fild in header */
-		rd->hdr.data_len = rctx->idx;
-		req_ctx_set_state(rctx, RCTX_S_USB_TX_PENDING);
-		ch->uart_rx_ctx = NULL;
-		/* FIXME: call into USB code to see if this buffer can
-		 * be transmitted now */
-	}
+	if (rctx->tot_len >= rctx->size)
+		flush_rx_buffer(ch);
 }
 
 static void set_tpdu_state(struct card_handle *ch, enum tpdu_state new_ts)
@@ -441,10 +455,7 @@
 
 	/* if we already/still have a context, send it off */
 	if (ch->uart_rx_ctx && ch->uart_rx_ctx->idx) {
-		/* FIXME: do we need to initialize the USB protocol
-		 * header? .... */
-		req_ctx_set_state(ch->uart_rx_ctx, RCTX_S_USB_TX_PENDING);
-		ch->uart_rx_ctx = NULL;
+		flush_rx_buffer(ch);
 	}
 
 	/* ensure we have a new buffer */
@@ -462,9 +473,9 @@
 
 	/* copy TPDU header to data field */
 	memcpy(rd->data, ch->tpdu.hdr, sizeof(ch->tpdu.hdr));
-	rd->hdr.data_len = sizeof(ch->tpdu.hdr);
+	/* rd->data_len is set in flush_rx_buffer() */
 
-	req_ctx_set_state(rctx, RCTX_S_USB_TX_PENDING);
+	flush_rx_buffer(ch);
 }
 
 static enum iso7816_3_card_state