示例#1
0
        public override int Decode(int sensorID, byte[] data, int length)
        {
            int rawDataIndex      = 0;
            int numDecodedPackets = 0;


            if ((length != 0) && (data[0] == 0xff) && (data[15] == 0xff) && (length == HTCDiamondTouchAccelerationData.NUM_RAW_BYTES)) // Have some data
            {
                // if (decodedDataIndex >= this._Data.Length)
                //    throw new Exception("HTC Diamond Touch buffer too small " + this._Data.Length);

                HTCDiamondTouchAccelerationData datum = ((HTCDiamondTouchAccelerationData)this._Data[this.head]);
                datum.Reset();
                //copy raw bytes
                for (int i = 0; (i < HTCDiamondTouchAccelerationData.NUM_RAW_BYTES); i++)
                {
                    datum.RawBytes[i] = data[i];
                }
                datum._Type     = SensorDataType.UNCOMPRESSED_DATA_PDU;
                datum._SensorID = (byte)sensorID;
                datum._X        = (short)(BitConverter.ToInt16(data, 1) + 1024);
                datum._Y        = (short)(BitConverter.ToInt16(data, 3) + 1024);
                datum._Z        = (short)(BitConverter.ToInt16(data, 5) + 1024);
                //Set time stamps
                datum.UnixTimeStamp = WocketsTimer.GetUnixTime();

                //if (IsValid(datum))
                if (this.head >= (BUFFER_SIZE - 1))
                {
                    this.head = 0;
                }
                else
                {
                    this.head++;
                }

                numDecodedPackets++;
                this.headerSeen = false;
            }

            return(numDecodedPackets);
        }
示例#2
0
        /*
         * public override bool IsValid(SensorData data)
         * {
         *  //Check for valid HTC Channels
         *  if (data.Channel != HTCDIAMOND_CHANNEL)
         *      return false;
         *  return true;
         * }
         */

        public override int Decode(int sourceSensor, CircularBuffer data, int start, int end)
        {
            int rawDataIndex      = start;
            int numDecodedPackets = 0;

            //count number of packets to decode
            int dataLength = end - start; //((RFCOMMReceiver)currentReceiver).bluetoothStream._Tail - currentReceiver._Head;

            if (dataLength < 0)
            {
                dataLength = data._Bytes.Length - start + end;//((RFCOMMReceiver)currentReceiver).bluetoothStream._Buffer.Length - currentReceiver._Head + ((RFCOMMReceiver)currentReceiver).bluetoothStream._Tail;
            }
            int maxDecodedPackets = dataLength / HTCDiamondTouchAccelerationData.NUM_RAW_BYTES;

            while ((maxDecodedPackets > 0) && (rawDataIndex != end))
            {
                //lock (data._Bytes)
                //{
                int firstByte = rawDataIndex;
                int lastByte  = (rawDataIndex + HTCDiamondTouchAccelerationData.NUM_RAW_BYTES - 1) % data._Bytes.Length;


                if ((data._Bytes[firstByte] == 0xff) && ((data._Bytes[lastByte] == 0xff)))
                {
                    HTCDiamondTouchAccelerationData datum = ((HTCDiamondTouchAccelerationData)this._Data[this.head]);
                    datum.Reset();
                    //copy raw bytes
                    for (int i = 0; (i < HTCDiamondTouchAccelerationData.NUM_RAW_BYTES); i++)
                    {
                        datum.RawBytes[i] = data._Bytes[rawDataIndex];
                        rawDataIndex      = (rawDataIndex + 1) % data._Bytes.Length;
                    }
                    datum._Type         = SensorDataType.UNCOMPRESSED_DATA_PDU;
                    datum._SensorID     = (byte)sourceSensor;
                    datum._X            = (short)(BitConverter.ToInt16(datum.RawBytes, 1) + 1024);
                    datum._Y            = (short)(BitConverter.ToInt16(datum.RawBytes, 3) + 1024);
                    datum._Z            = (short)(BitConverter.ToInt16(datum.RawBytes, 5) + 1024);
                    datum.UnixTimeStamp = WocketsTimer.GetUnixTime();

                    if (this.head >= (BUFFER_SIZE - 1))
                    {
                        this.head = 0;
                    }
                    else
                    {
                        this.head++;
                    }

                    numDecodedPackets++;
                    data._Head = (data._Head + HTCDiamondTouchAccelerationData.NUM_RAW_BYTES) % data._Bytes.Length;

                    if (numDecodedPackets == maxDecodedPackets)
                    {
                        break;
                    }
                }
                else
                {
                    break;
                }
                //}
            }

            return(numDecodedPackets);
        }