Example #1
0
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;
}