bool Volkslogger::Handshake(Port &port, OperationEnvironment &env, unsigned timeout_ms) { TimeoutClock timeout(timeout_ms); while (true) { // Solange R's aussenden, bis ein L zurückkommt if (!port.Write('R')) return false; int remaining = timeout.GetRemainingSigned(); if (remaining < 0) return false; if (remaining > 500) remaining = 500; Port::WaitResult result = port.WaitForChar('L', env, remaining); if (result == Port::WaitResult::READY) break; if (result != Port::WaitResult::TIMEOUT) return false; /* timeout, try again */ } unsigned count = 1; while (true) { // Auf 4 hintereinanderfolgende L's warten int remaining = timeout.GetRemainingSigned(); if (remaining < 0) return false; if (port.WaitForChar('L', env, remaining) != Port::WaitResult::READY) return false; count++; if (count >= 4) return true; } }
bool Volkslogger::Handshake(Port &port, OperationEnvironment &env, std::chrono::steady_clock::duration _timeout) { TimeoutClock timeout(_timeout); while (true) { // Solange R's aussenden, bis ein L zurückkommt if (!port.Write('R')) return false; auto remaining = timeout.GetRemainingSigned(); if (remaining.count() < 0) return false; if (remaining > std::chrono::milliseconds(500)) remaining = std::chrono::milliseconds(500); Port::WaitResult result = port.WaitForChar('L', env, remaining); if (result == Port::WaitResult::READY) break; if (result != Port::WaitResult::TIMEOUT) return false; /* timeout, try again */ } unsigned count = 1; while (true) { // Auf 4 hintereinanderfolgende L's warten const auto remaining = timeout.GetRemainingSigned(); if (remaining.count() < 0) return false; if (port.WaitForChar('L', env, remaining) != Port::WaitResult::READY) return false; count++; if (count >= 4) return true; } }
static bool ExpectXOff(Port &port, OperationEnvironment &env, unsigned timeout_ms) { return port.WaitForChar(0x13, env, timeout_ms) == Port::WaitResult::READY; }
bool Volkslogger::WaitForACK(Port &port, OperationEnvironment &env) { return port.WaitForChar(ACK, env, 30000) == Port::WaitResult::READY; }
static inline bool ExpectACK(Port &port, OperationEnvironment &env, unsigned timeout_ms=2000) { return port.WaitForChar(ACK, env, timeout_ms) == Port::WaitResult::READY; }
bool Volkslogger::WaitForACK(Port &port, OperationEnvironment &env) { return port.WaitForChar(ACK, env, std::chrono::seconds(30)) == Port::WaitResult::READY; }