47 lines
2.0 KiB
C++
47 lines
2.0 KiB
C++
#pragma once
|
|
|
|
namespace lidarlib {
|
|
|
|
// Result of open() and the sticky status behind last_error(). Ok == 0 so
|
|
// `if (err != ErrorCode::Ok)` reads naturally at call sites.
|
|
enum class ErrorCode {
|
|
Ok = 0,
|
|
|
|
// Lifecycle misuse — the call was refused, the instance state is unchanged.
|
|
AlreadyOpen, // open() called while already open
|
|
NotOpen, // recv_scan()/spin_once() called before open()
|
|
|
|
// open() failures
|
|
SocketError, // socket() creation failed
|
|
InvalidAddress, // ip string is not a valid IPv4 address
|
|
PortInUse, // bind: local port already taken (EADDRINUSE/EACCES)
|
|
BindFailed, // bind failed for another reason
|
|
ConnectionRefused, // TCP connect refused (device up, port closed)
|
|
ConnectionFailed, // TCP connect failed (unreachable, no route, ...)
|
|
HandshakeFailed, // connected, but the start-stream command failed
|
|
|
|
// Runtime failures
|
|
Timeout, // no (complete) scan within timeout_ms
|
|
DeviceDisconnected, // peer closed the connection / socket recv error
|
|
};
|
|
|
|
inline const char* to_string(ErrorCode e) {
|
|
switch (e) {
|
|
case ErrorCode::Ok: return "Ok";
|
|
case ErrorCode::AlreadyOpen: return "AlreadyOpen";
|
|
case ErrorCode::NotOpen: return "NotOpen";
|
|
case ErrorCode::SocketError: return "SocketError";
|
|
case ErrorCode::InvalidAddress: return "InvalidAddress";
|
|
case ErrorCode::PortInUse: return "PortInUse";
|
|
case ErrorCode::BindFailed: return "BindFailed";
|
|
case ErrorCode::ConnectionRefused: return "ConnectionRefused";
|
|
case ErrorCode::ConnectionFailed: return "ConnectionFailed";
|
|
case ErrorCode::HandshakeFailed: return "HandshakeFailed";
|
|
case ErrorCode::Timeout: return "Timeout";
|
|
case ErrorCode::DeviceDisconnected: return "DeviceDisconnected";
|
|
}
|
|
return "Unknown";
|
|
}
|
|
|
|
} // namespace lidarlib
|