nuclear@1: /************************************************************************************ nuclear@1: nuclear@1: PublicHeader: OVR.h nuclear@1: Filename : OVR_DeviceMessages.h nuclear@1: Content : Definition of messages generated by devices nuclear@1: Created : February 5, 2013 nuclear@1: Authors : Lee Cooper nuclear@1: nuclear@1: Copyright : Copyright 2013 Oculus VR, Inc. All Rights reserved. nuclear@1: nuclear@1: Use of this software is subject to the terms of the Oculus license nuclear@1: agreement provided at the time of installation or download, or which nuclear@1: otherwise accompanies this software in either electronic or hard copy form. nuclear@1: nuclear@1: *************************************************************************************/ nuclear@1: nuclear@1: #ifndef OVR_DeviceMessages_h nuclear@1: #define OVR_DeviceMessages_h nuclear@1: nuclear@1: #include "OVR_DeviceConstants.h" nuclear@1: #include "OVR_DeviceHandle.h" nuclear@1: nuclear@1: #include "Kernel/OVR_Math.h" nuclear@1: #include "Kernel/OVR_Array.h" nuclear@1: #include "Kernel/OVR_Color.h" nuclear@1: nuclear@1: namespace OVR { nuclear@1: nuclear@1: class DeviceBase; nuclear@1: class DeviceHandle; nuclear@1: nuclear@1: nuclear@1: #define OVR_MESSAGETYPE(devName, msgIndex) ((Device_##devName << 8) | msgIndex) nuclear@1: nuclear@1: // MessageType identifies the structure of the Message class; based on the message, nuclear@1: // casting can be used to obtain the exact value. nuclear@1: enum MessageType nuclear@1: { nuclear@1: // Used for unassigned message types. nuclear@1: Message_None = 0, nuclear@1: nuclear@1: // Device Manager Messages nuclear@1: Message_DeviceAdded = OVR_MESSAGETYPE(Manager, 0), // A new device is detected by manager. nuclear@1: Message_DeviceRemoved = OVR_MESSAGETYPE(Manager, 1), // Existing device has been plugged/unplugged. nuclear@1: // Sensor Messages nuclear@1: Message_BodyFrame = OVR_MESSAGETYPE(Sensor, 0), // Emitted by sensor at regular intervals. nuclear@1: // Latency Tester Messages nuclear@1: Message_LatencyTestSamples = OVR_MESSAGETYPE(LatencyTester, 0), nuclear@1: Message_LatencyTestColorDetected = OVR_MESSAGETYPE(LatencyTester, 1), nuclear@1: Message_LatencyTestStarted = OVR_MESSAGETYPE(LatencyTester, 2), nuclear@1: Message_LatencyTestButton = OVR_MESSAGETYPE(LatencyTester, 3), nuclear@1: nuclear@1: }; nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // Base class for all messages. nuclear@1: class Message nuclear@1: { nuclear@1: public: nuclear@1: Message(MessageType type = Message_None, nuclear@1: DeviceBase* pdev = 0) : Type(type), pDevice(pdev) nuclear@1: { } nuclear@1: nuclear@1: MessageType Type; // What kind of message this is. nuclear@1: DeviceBase* pDevice; // Device that emitted the message. nuclear@1: }; nuclear@1: nuclear@1: nuclear@1: // Sensor BodyFrame notification. nuclear@1: // Sensor uses Right-Handed coordinate system to return results, with the following nuclear@1: // axis definitions: nuclear@1: // - Y Up positive nuclear@1: // - X Right Positive nuclear@1: // - Z Back Positive nuclear@1: // Rotations a counter-clockwise (CCW) while looking in the negative direction nuclear@1: // of the axis. This means they are interpreted as follows: nuclear@1: // - Roll is rotation around Z, counter-clockwise (tilting left) in XY plane. nuclear@1: // - Yaw is rotation around Y, positive for turning left. nuclear@1: // - Pitch is rotation around X, positive for pitching up. nuclear@1: nuclear@1: class MessageBodyFrame : public Message nuclear@1: { nuclear@1: public: nuclear@1: MessageBodyFrame(DeviceBase* dev) nuclear@1: : Message(Message_BodyFrame, dev), Temperature(0.0f), TimeDelta(0.0f) nuclear@1: { nuclear@1: } nuclear@1: nuclear@1: Vector3f Acceleration; // Acceleration in m/s^2. nuclear@1: Vector3f RotationRate; // Angular velocity in rad/s^2. nuclear@1: Vector3f MagneticField; // Magnetic field strength in Gauss. nuclear@1: float Temperature; // Temperature reading on sensor surface, in degrees Celsius. nuclear@1: float TimeDelta; // Time passed since last Body Frame, in seconds. nuclear@1: }; nuclear@1: nuclear@1: // Sent when we receive a device status changes (e.g.: nuclear@1: // Message_DeviceAdded, Message_DeviceRemoved). nuclear@1: class MessageDeviceStatus : public Message nuclear@1: { nuclear@1: public: nuclear@1: MessageDeviceStatus(MessageType type, DeviceBase* dev, const DeviceHandle &hdev) nuclear@1: : Message(type, dev), Handle(hdev) { } nuclear@1: nuclear@1: DeviceHandle Handle; nuclear@1: }; nuclear@1: nuclear@1: //------------------------------------------------------------------------------------- nuclear@1: // ***** Latency Tester nuclear@1: nuclear@1: // Sent when we receive Latency Tester samples. nuclear@1: class MessageLatencyTestSamples : public Message nuclear@1: { nuclear@1: public: nuclear@1: MessageLatencyTestSamples(DeviceBase* dev) nuclear@1: : Message(Message_LatencyTestSamples, dev) nuclear@1: { nuclear@1: } nuclear@1: nuclear@1: Array Samples; nuclear@1: }; nuclear@1: nuclear@1: // Sent when a Latency Tester 'color detected' event occurs. nuclear@1: class MessageLatencyTestColorDetected : public Message nuclear@1: { nuclear@1: public: nuclear@1: MessageLatencyTestColorDetected(DeviceBase* dev) nuclear@1: : Message(Message_LatencyTestColorDetected, dev) nuclear@1: { nuclear@1: } nuclear@1: nuclear@1: UInt16 Elapsed; nuclear@1: Color DetectedValue; nuclear@1: Color TargetValue; nuclear@1: }; nuclear@1: nuclear@1: // Sent when a Latency Tester 'change color' event occurs. nuclear@1: class MessageLatencyTestStarted : public Message nuclear@1: { nuclear@1: public: nuclear@1: MessageLatencyTestStarted(DeviceBase* dev) nuclear@1: : Message(Message_LatencyTestStarted, dev) nuclear@1: { nuclear@1: } nuclear@1: nuclear@1: Color TargetValue; nuclear@1: }; nuclear@1: nuclear@1: // Sent when a Latency Tester 'button' event occurs. nuclear@1: class MessageLatencyTestButton : public Message nuclear@1: { nuclear@1: public: nuclear@1: MessageLatencyTestButton(DeviceBase* dev) nuclear@1: : Message(Message_LatencyTestButton, dev) nuclear@1: { nuclear@1: } nuclear@1: nuclear@1: }; nuclear@1: nuclear@1: nuclear@1: } // namespace OVR nuclear@1: nuclear@1: #endif