MCPcopy Create free account
hub / github.com/Zhou-zhi-peng/SerialPortForWindowsTerminal / DoStreamToStream

Function DoStreamToStream

SerialForWindowsTerminal.cpp:259–397  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

257}
258template <class TStream1, class TStream2>
259static 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 }

Callers 1

DoWorkFunction · 0.85

Calls 2

ToggleEncodingFormatFunction · 0.85
ToggleEchoModeFunction · 0.85

Tested by

no test coverage detected