Merge remote-tracking branch 'origin/dev' into release-candidate
This commit is contained in:
		
						commit
						0d7f305da1
					
				| @ -11,6 +11,12 @@ | |||||||
| 
 | 
 | ||||||
| #define VCP_IF_NUM 0 | #define VCP_IF_NUM 0 | ||||||
| 
 | 
 | ||||||
|  | #ifdef CLI_VCP_DEBUG | ||||||
|  | #define VCP_DEBUG(...) FURI_LOG_D(TAG, __VA_ARGS__) | ||||||
|  | #else | ||||||
|  | #define VCP_DEBUG(...) | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
| typedef enum { | typedef enum { | ||||||
|     VcpEvtStop = (1 << 0), |     VcpEvtStop = (1 << 0), | ||||||
|     VcpEvtConnect = (1 << 1), |     VcpEvtConnect = (1 << 1), | ||||||
| @ -104,9 +110,8 @@ static int32_t vcp_worker(void* context) { | |||||||
| 
 | 
 | ||||||
|         // VCP session opened
 |         // VCP session opened
 | ||||||
|         if(flags & VcpEvtConnect) { |         if(flags & VcpEvtConnect) { | ||||||
| #ifdef CLI_VCP_DEBUG |             VCP_DEBUG("Connect"); | ||||||
|             FURI_LOG_D(TAG, "Connect"); | 
 | ||||||
| #endif |  | ||||||
|             if(vcp->connected == false) { |             if(vcp->connected == false) { | ||||||
|                 vcp->connected = true; |                 vcp->connected = true; | ||||||
|                 furi_stream_buffer_send(vcp->rx_stream, &ascii_soh, 1, FuriWaitForever); |                 furi_stream_buffer_send(vcp->rx_stream, &ascii_soh, 1, FuriWaitForever); | ||||||
| @ -115,9 +120,8 @@ static int32_t vcp_worker(void* context) { | |||||||
| 
 | 
 | ||||||
|         // VCP session closed
 |         // VCP session closed
 | ||||||
|         if(flags & VcpEvtDisconnect) { |         if(flags & VcpEvtDisconnect) { | ||||||
| #ifdef CLI_VCP_DEBUG |             VCP_DEBUG("Disconnect"); | ||||||
|             FURI_LOG_D(TAG, "Disconnect"); | 
 | ||||||
| #endif |  | ||||||
|             if(vcp->connected == true) { |             if(vcp->connected == true) { | ||||||
|                 vcp->connected = false; |                 vcp->connected = false; | ||||||
|                 furi_stream_buffer_receive(vcp->tx_stream, vcp->data_buffer, USB_CDC_PKT_LEN, 0); |                 furi_stream_buffer_receive(vcp->tx_stream, vcp->data_buffer, USB_CDC_PKT_LEN, 0); | ||||||
| @ -127,9 +131,8 @@ static int32_t vcp_worker(void* context) { | |||||||
| 
 | 
 | ||||||
|         // Rx buffer was read, maybe there is enough space for new data?
 |         // Rx buffer was read, maybe there is enough space for new data?
 | ||||||
|         if((flags & VcpEvtStreamRx) && (missed_rx > 0)) { |         if((flags & VcpEvtStreamRx) && (missed_rx > 0)) { | ||||||
| #ifdef CLI_VCP_DEBUG |             VCP_DEBUG("StreamRx"); | ||||||
|             FURI_LOG_D(TAG, "StreamRx"); | 
 | ||||||
| #endif |  | ||||||
|             if(furi_stream_buffer_spaces_available(vcp->rx_stream) >= USB_CDC_PKT_LEN) { |             if(furi_stream_buffer_spaces_available(vcp->rx_stream) >= USB_CDC_PKT_LEN) { | ||||||
|                 flags |= VcpEvtRx; |                 flags |= VcpEvtRx; | ||||||
|                 missed_rx--; |                 missed_rx--; | ||||||
| @ -140,9 +143,8 @@ static int32_t vcp_worker(void* context) { | |||||||
|         if(flags & VcpEvtRx) { |         if(flags & VcpEvtRx) { | ||||||
|             if(furi_stream_buffer_spaces_available(vcp->rx_stream) >= USB_CDC_PKT_LEN) { |             if(furi_stream_buffer_spaces_available(vcp->rx_stream) >= USB_CDC_PKT_LEN) { | ||||||
|                 int32_t len = furi_hal_cdc_receive(VCP_IF_NUM, vcp->data_buffer, USB_CDC_PKT_LEN); |                 int32_t len = furi_hal_cdc_receive(VCP_IF_NUM, vcp->data_buffer, USB_CDC_PKT_LEN); | ||||||
| #ifdef CLI_VCP_DEBUG |                 VCP_DEBUG("Rx %ld", len); | ||||||
|                 FURI_LOG_D(TAG, "Rx %d", len); | 
 | ||||||
| #endif |  | ||||||
|                 if(len > 0) { |                 if(len > 0) { | ||||||
|                     furi_check( |                     furi_check( | ||||||
|                         furi_stream_buffer_send( |                         furi_stream_buffer_send( | ||||||
| @ -150,18 +152,15 @@ static int32_t vcp_worker(void* context) { | |||||||
|                         (size_t)len); |                         (size_t)len); | ||||||
|                 } |                 } | ||||||
|             } else { |             } else { | ||||||
| #ifdef CLI_VCP_DEBUG |                 VCP_DEBUG("Rx missed"); | ||||||
|                 FURI_LOG_D(TAG, "Rx missed"); |  | ||||||
| #endif |  | ||||||
|                 missed_rx++; |                 missed_rx++; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         // New data in Tx buffer
 |         // New data in Tx buffer
 | ||||||
|         if(flags & VcpEvtStreamTx) { |         if(flags & VcpEvtStreamTx) { | ||||||
| #ifdef CLI_VCP_DEBUG |             VCP_DEBUG("StreamTx"); | ||||||
|             FURI_LOG_D(TAG, "StreamTx"); | 
 | ||||||
| #endif |  | ||||||
|             if(tx_idle) { |             if(tx_idle) { | ||||||
|                 flags |= VcpEvtTx; |                 flags |= VcpEvtTx; | ||||||
|             } |             } | ||||||
| @ -171,9 +170,9 @@ static int32_t vcp_worker(void* context) { | |||||||
|         if(flags & VcpEvtTx) { |         if(flags & VcpEvtTx) { | ||||||
|             size_t len = |             size_t len = | ||||||
|                 furi_stream_buffer_receive(vcp->tx_stream, vcp->data_buffer, USB_CDC_PKT_LEN, 0); |                 furi_stream_buffer_receive(vcp->tx_stream, vcp->data_buffer, USB_CDC_PKT_LEN, 0); | ||||||
| #ifdef CLI_VCP_DEBUG | 
 | ||||||
|             FURI_LOG_D(TAG, "Tx %d", len); |             VCP_DEBUG("Tx %d", len); | ||||||
| #endif | 
 | ||||||
|             if(len > 0) { // Some data left in Tx buffer. Sending it now
 |             if(len > 0) { // Some data left in Tx buffer. Sending it now
 | ||||||
|                 tx_idle = false; |                 tx_idle = false; | ||||||
|                 furi_hal_cdc_send(VCP_IF_NUM, vcp->data_buffer, len); |                 furi_hal_cdc_send(VCP_IF_NUM, vcp->data_buffer, len); | ||||||
| @ -216,9 +215,7 @@ static size_t cli_vcp_rx(uint8_t* buffer, size_t size, uint32_t timeout) { | |||||||
|         return 0; |         return 0; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #ifdef CLI_VCP_DEBUG |     VCP_DEBUG("rx %u start", size); | ||||||
|     FURI_LOG_D(TAG, "rx %u start", size); |  | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
|     size_t rx_cnt = 0; |     size_t rx_cnt = 0; | ||||||
| 
 | 
 | ||||||
| @ -227,19 +224,21 @@ static size_t cli_vcp_rx(uint8_t* buffer, size_t size, uint32_t timeout) { | |||||||
|         if(batch_size > VCP_RX_BUF_SIZE) batch_size = VCP_RX_BUF_SIZE; |         if(batch_size > VCP_RX_BUF_SIZE) batch_size = VCP_RX_BUF_SIZE; | ||||||
| 
 | 
 | ||||||
|         size_t len = furi_stream_buffer_receive(vcp->rx_stream, buffer, batch_size, timeout); |         size_t len = furi_stream_buffer_receive(vcp->rx_stream, buffer, batch_size, timeout); | ||||||
| #ifdef CLI_VCP_DEBUG |         VCP_DEBUG("rx %u ", batch_size); | ||||||
|         FURI_LOG_D(TAG, "rx %u ", batch_size); | 
 | ||||||
| #endif |  | ||||||
|         if(len == 0) break; |         if(len == 0) break; | ||||||
|  |         if(vcp->running == false) { | ||||||
|  |             // EOT command is received after VCP session close
 | ||||||
|  |             rx_cnt += len; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|         furi_thread_flags_set(furi_thread_get_id(vcp->thread), VcpEvtStreamRx); |         furi_thread_flags_set(furi_thread_get_id(vcp->thread), VcpEvtStreamRx); | ||||||
|         size -= len; |         size -= len; | ||||||
|         buffer += len; |         buffer += len; | ||||||
|         rx_cnt += len; |         rx_cnt += len; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #ifdef CLI_VCP_DEBUG |     VCP_DEBUG("rx %u end", size); | ||||||
|     FURI_LOG_D(TAG, "rx %u end", size); |  | ||||||
| #endif |  | ||||||
|     return rx_cnt; |     return rx_cnt; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -251,9 +250,7 @@ static void cli_vcp_tx(const uint8_t* buffer, size_t size) { | |||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #ifdef CLI_VCP_DEBUG |     VCP_DEBUG("tx %u start", size); | ||||||
|     FURI_LOG_D(TAG, "tx %u start", size); |  | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
|     while(size > 0 && vcp->connected) { |     while(size > 0 && vcp->connected) { | ||||||
|         size_t batch_size = size; |         size_t batch_size = size; | ||||||
| @ -261,17 +258,13 @@ static void cli_vcp_tx(const uint8_t* buffer, size_t size) { | |||||||
| 
 | 
 | ||||||
|         furi_stream_buffer_send(vcp->tx_stream, buffer, batch_size, FuriWaitForever); |         furi_stream_buffer_send(vcp->tx_stream, buffer, batch_size, FuriWaitForever); | ||||||
|         furi_thread_flags_set(furi_thread_get_id(vcp->thread), VcpEvtStreamTx); |         furi_thread_flags_set(furi_thread_get_id(vcp->thread), VcpEvtStreamTx); | ||||||
| #ifdef CLI_VCP_DEBUG |         VCP_DEBUG("tx %u", batch_size); | ||||||
|         FURI_LOG_D(TAG, "tx %u", batch_size); |  | ||||||
| #endif |  | ||||||
| 
 | 
 | ||||||
|         size -= batch_size; |         size -= batch_size; | ||||||
|         buffer += batch_size; |         buffer += batch_size; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
| #ifdef CLI_VCP_DEBUG |     VCP_DEBUG("tx %u end", size); | ||||||
|     FURI_LOG_D(TAG, "tx %u end", size); |  | ||||||
| #endif |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static void cli_vcp_tx_stdout(const char* data, size_t size) { | static void cli_vcp_tx_stdout(const char* data, size_t size) { | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Aleksandr Kutuzov
						Aleksandr Kutuzov