Example #1
0
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;
  }
}
Example #2
0
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;
  }
}
Example #3
0
static bool
ExpectXOff(Port &port, OperationEnvironment &env, unsigned timeout_ms)
{
  return port.WaitForChar(0x13, env, timeout_ms) == Port::WaitResult::READY;
}
Example #4
0
bool
Volkslogger::WaitForACK(Port &port, OperationEnvironment &env)
{
  return port.WaitForChar(ACK, env, 30000) == Port::WaitResult::READY;
}
Example #5
0
 static inline bool
 ExpectACK(Port &port, OperationEnvironment &env, unsigned timeout_ms=2000)
 {
   return port.WaitForChar(ACK, env, timeout_ms) == Port::WaitResult::READY;
 }
Example #6
0
bool
Volkslogger::WaitForACK(Port &port, OperationEnvironment &env)
{
  return port.WaitForChar(ACK, env, std::chrono::seconds(30)) == Port::WaitResult::READY;
}