예제 #1
0
        /// <summary>
        /// Creates a data report instance appropirate for the sensor.
        /// </summary>
        /// <param name="report">Underlying data report COM object.</param>
        /// <param name="sensor">Sensor COM object.</param>
        /// <returns></returns>
        internal SensorDataReport GetDataReport(ISensorDataReport report, ISensor sensor)
        {
            SensorDataReport sdr = CreateReport();

            sdr.InitializeReport(report, this);
            return(sdr);
        }
        internal static SensorReport FromNativeReport(Sensor originator, ISensorDataReport iReport)
        {
            SystemTime systemTimeStamp = new SystemTime();

            try
            {
                iReport.GetTimestamp(out systemTimeStamp);
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                System.Diagnostics.Trace.WriteLine(ex);
                return(null);
            }
            FILETIME ftTimeStamp = new FILETIME();

            SensorNativeMethods.SystemTimeToFileTime(ref systemTimeStamp, out ftTimeStamp);
            long     lTimeStamp = (((long)ftTimeStamp.dwHighDateTime) << 32) + (long)ftTimeStamp.dwLowDateTime;
            DateTime timeStamp  = DateTime.FromFileTime(lTimeStamp);

            SensorReport sensorReport = new SensorReport();

            sensorReport.originator = originator;
            sensorReport.timeStamp  = timeStamp;
            sensorReport.sensorData = SensorData.FromNativeReport(originator.internalObject, iReport);

            return(sensorReport);
        }
예제 #3
0
        /// <summary>
        /// Synchronously retrieves a data report from the sensor.
        /// </summary>
        /// <returns>Data report.</returns>
        public SensorDataReport GetDataReport()
        {
            ISensorDataReport iReport = null;

            _iSensor.GetData(out iReport);
            return(GetDataReport(iReport, _iSensor));
        }
예제 #4
0
 void ISensorEvents.OnDataUpdated(ISensor sensor, ISensorDataReport newData)
 {
     this.dataReport = SensorReport.FromNativeReport(this, newData);
     if (DataReportChanged != null)
     {
         DataReportChanged.Invoke(this, EventArgs.Empty);
     }
 }
예제 #5
0
 /// <summary>
 /// Handler for any event. Fires the <see cref="EventReceived"/> event.
 /// </summary>
 /// <param name="sensor">COM sensor object for which this event was fired.</param>
 /// <param name="eventID">Event GUID.</param>
 /// <param name="newData">COM data report object.</param>
 void ISensorEvents.OnEvent(ISensor sensor, Guid eventID, ISensorDataReport newData)
 {
     if (EventReceived != null)
     {
         SensorDataReport sdr = GetDataReport(newData, sensor);
         EventReceived(this, eventID, sdr);
     }
 }
예제 #6
0
 /// <summary>
 /// Handler of the data updated event. Fires the <see cref="DataUpdated"/> event.
 /// Creates an appropriate data report object.
 /// </summary>
 /// <param name="sensor">COM sensor object for which this event was fired.</param>
 /// <param name="newData">COM data report object.</param>
 void ISensorEvents.OnDataUpdated(ISensor sensor, ISensorDataReport newData)
 {
     _lastReport = newData;
     if (DataUpdated != null)
     {
         SensorDataReport sdr = GetDataReport(newData, sensor);
         DataUpdated(this, sdr);
     }
 }
예제 #7
0
        /// <summary>
        /// Retrieves the last data report asynchronously received from the sensor. Otherwise, returns null.
        /// </summary>
        /// <returns>Data report or null.</returns>
        public SensorDataReport GetLastAsyncDataReport()
        {
            ISensorDataReport lastRep = _lastReport;

            if (lastRep == null)
            {
                return(null);
            }
            return(GetDataReport(lastRep, _iSensor));
        }
예제 #8
0
        internal static SensorData FromNativeReport(ISensor iSensor, ISensorDataReport iReport)
        {
            SensorData data = new SensorData( );

            IPortableDeviceKeyCollection keyCollection;
            IPortableDeviceValues        valuesCollection;

            iSensor.GetSupportedDataFields(out keyCollection);
            iReport.GetSensorValues(keyCollection, out valuesCollection);

            uint items = 0;

            keyCollection.GetCount(out items);
            for (uint index = 0; index < items; index++)
            {
                PropertyKey key;
                PropVariant propValue;
                keyCollection.GetAt(index, out key);
                valuesCollection.GetValue(ref key, out propValue);
                try
                {
                    if (data.ContainsKey(key.FormatId))
                    {
                        data[key.FormatId].Add(propValue.Value);
                    }
                    else
                    {
                        data.Add(key.FormatId, new List <object> {
                            propValue.Value
                        });
                    }
                }
                finally
                {
                    propValue.Clear( );
                }
            }

            if (keyCollection != null)
            {
                Marshal.ReleaseComObject(keyCollection);
                keyCollection = null;
            }

            if (valuesCollection != null)
            {
                Marshal.ReleaseComObject(valuesCollection);
                valuesCollection = null;
            }


            return(data);
        }
예제 #9
0
        /// <summary>
        /// Handler of an event indicating cesation of sensor availability.
        /// </summary>
        /// <param name="sensorID">Sensor's instance GUID.</param>
        void ISensorEvents.OnLeave(Guid sensorID)
        {
            _iSensor    = null;
            _lastReport = null;

            if (SensorLeave != null)
            {
                SensorLeave(this, sensorID);
            }

            lock (_instances)
            {
                _instances.Remove(this);
            }
        }
예제 #10
0
        internal static SensorReport FromNativeReport( Sensor originator, ISensorDataReport iReport )
        {
            SYSTEMTIME systemTimeStamp = new SYSTEMTIME( );
            iReport.GetTimestamp( out systemTimeStamp );
            FILETIME ftTimeStamp = new FILETIME( );
            SensorNativeMethods.SystemTimeToFileTime( ref systemTimeStamp, out ftTimeStamp );
            long lTimeStamp = (((long)ftTimeStamp.dwHighDateTime) << 32) + (long)ftTimeStamp.dwLowDateTime;
            DateTime timeStamp = DateTime.FromFileTime( lTimeStamp );

            SensorReport sensorReport = new SensorReport( );
            sensorReport.originator = originator;
            sensorReport.timeStamp = timeStamp;
            sensorReport.sensorData = SensorData.FromNativeReport( originator.internalObject, iReport );

            return sensorReport;
        }
예제 #11
0
        internal static SensorReport FromNativeReport(Sensor originator, ISensorDataReport iReport)
        {
            SystemTime systemTimeStamp = new SystemTime();

            iReport.GetTimestamp(out systemTimeStamp);
            FILETIME ftTimeStamp = new FILETIME();

            SensorNativeMethods.SystemTimeToFileTime(ref systemTimeStamp, out ftTimeStamp);
            long     lTimeStamp = (((long)ftTimeStamp.dwHighDateTime) << 32) + (long)ftTimeStamp.dwLowDateTime;
            DateTime timeStamp  = DateTime.FromFileTime(lTimeStamp);

            SensorReport sensorReport = new SensorReport();

            sensorReport.originator = originator;
            sensorReport.timeStamp  = timeStamp;
            sensorReport.sensorData = SensorData.FromNativeReport(originator.internalObject, iReport);

            return(sensorReport);
        }
예제 #12
0
        internal HRESULT InternalUpdateData()
        {
            ISensorDataReport iReport = null;
            HRESULT           hr      = nativeISensor.GetData(out iReport);

            if (hr == HRESULT.S_OK)
            {
                try
                {
                    this.dataReport = SensorReport.FromNativeReport(this, iReport);
                    if (DataReportChanged != null)
                    {
                        DataReportChanged.Invoke(this, EventArgs.Empty);
                    }
                }
                finally
                {
                    Marshal.ReleaseComObject(iReport);
                }
            }
            return(hr);
        }
예제 #13
0
 void ISensorEvents.OnEvent(ISensor sensor, Guid eventID, ISensorDataReport newData)
 {
 }
예제 #14
0
 internal void InitializeReport(ISensorDataReport report, Sensor sensor)
 {
     _iSensorReport = report;
     _sensor        = sensor;
     Initialize();
 }