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); }
/* * 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); }