| 257 | } |
| 258 | template <class TStream1, class TStream2> |
| 259 | static void DoStreamToStream(TStream1& stream1, TStream2& stream2, std::vector<uint8_t>& buffer, SERIAL_CONFIG* pCfg = nullptr) |
| 260 | { |
| 261 | stream1.async_read_some( |
| 262 | boost::asio::buffer(buffer.data(), buffer.size()), |
| 263 | [&stream1, &stream2, &buffer, pCfg](const boost::system::error_code& ec, std::size_t bytes_transferred) |
| 264 | { |
| 265 | if (ec) |
| 266 | { |
| 267 | std::cerr << "\033[31m" << "error : " << ec.message() << "\033[0m" << std::endl; |
| 268 | } |
| 269 | else |
| 270 | { |
| 271 | // 检查是否需要特殊处理键盘输入(仅当stream1是标准输入且有配置指针时) |
| 272 | bool skipWrite = false; |
| 273 | if (pCfg != nullptr) |
| 274 | { |
| 275 | for (size_t i = 0; i < bytes_transferred; i++) |
| 276 | { |
| 277 | uint8_t ch = buffer[i]; |
| 278 | |
| 279 | // 检查Ctrl+A (ASCII 1) |
| 280 | if (ch == 1) |
| 281 | { |
| 282 | g_isCtrlAPressed = true; |
| 283 | skipWrite = true; |
| 284 | break; |
| 285 | } |
| 286 | |
| 287 | // 如果Ctrl+A已按下,检查后续按键 |
| 288 | if (g_isCtrlAPressed) |
| 289 | { |
| 290 | g_isCtrlAPressed = false; // 重置标志 |
| 291 | skipWrite = true; |
| 292 | |
| 293 | // Ctrl+X: 退出程序 |
| 294 | if (ch == 24) // Ctrl+X |
| 295 | { |
| 296 | if (MessageBoxW(NULL, L"确定要退出程序吗?", L"退出确认", MB_YESNO | MB_ICONQUESTION) == IDYES) |
| 297 | { |
| 298 | g_shouldExit = true; |
| 299 | // 通过取消所有异步操作来退出io_service |
| 300 | stream1.cancel(); |
| 301 | stream2.cancel(); |
| 302 | exit(0); |
| 303 | } |
| 304 | } |
| 305 | // Ctrl+C: 切换编码格式 |
| 306 | else if (ch == 3) // Ctrl+C |
| 307 | { |
| 308 | ToggleEncodingFormat(*pCfg); |
| 309 | } |
| 310 | // Ctrl+E: 切换回显模式 |
| 311 | else if (ch == 5) // Ctrl+E |
| 312 | { |
| 313 | ToggleEchoMode(*pCfg); |
| 314 | } |
| 315 | break; |
| 316 | } |
no test coverage detected