STATICDEF void xSysError:: xsyserror(rostring syscallName, rostring context) { // retrieve system error code int code = getSystemErrorCode(); // translate it into one of ours string sysMsg; Reason r = portablize(code, sysMsg); // construct an object to throw xSysError obj(r, code, sysMsg, syscallName, context); // toss it THROW(obj); }
bool InputDeviceHandle::updateStates(AxisStates* axisStates, ButtonStates* buttonStates, bool* updated) { *updated = false; while (m_state->handle.hasDataToRead()) { struct input_event event; size_t numRead; if (! m_state->handle.readBytes(&event, sizeof(event), &numRead)) { int64_t error = getSystemErrorCode(); if (error == ENODEV) { SURGSIM_LOG_SEVERE(m_state->logger) << "InputDeviceHandle: read failed; device has been disconnected! (stopping)"; return false; // stop updating this device! } else { SURGSIM_LOG_WARNING(m_state->logger) << "InputDeviceHandle: read failed with error " << error << ", " << getSystemErrorText(error); } } else if (numRead != sizeof(event)) { SURGSIM_LOG_WARNING(m_state->logger) << "InputDeviceHandle: reading produced " << numRead << " bytes (expected " << sizeof(event) << ")"; } else { if (event.type == EV_REL) { if (event.code >= REL_X && event.code < (REL_X+3)) // Assume that X, Y, Z are consecutive { (*axisStates)[0 + (event.code - REL_X)] = event.value; *updated = true; } else if (event.code >= REL_RX && event.code < (REL_RX+3)) // Assume that RX, RY, RZ are consecutive { (*axisStates)[3 + (event.code - REL_RX)] = event.value; *updated = true; } } else if (event.type == EV_ABS) { if (event.code >= ABS_X && event.code < (ABS_X+3)) // Assume that X, Y, Z are consecutive { (*axisStates)[0 + (event.code - ABS_X)] = event.value; *updated = true; } else if (event.code >= ABS_RX && event.code < (ABS_RX+3)) // Assume that RX, RY, RZ are consecutive { (*axisStates)[3 + (event.code - ABS_RX)] = event.value; *updated = true; } } else if (event.type == EV_KEY) { for (size_t i = 0; i < m_state->buttonCodes.size(); ++i) { if (event.code == m_state->buttonCodes[i]) { (*buttonStates)[i] = (event.value != 0); *updated = true; break; } } } } } return true; }