public void Draw(Graphics g) { int lastColumnDrawn = 0; for (int i = 0; (i < this.wocketsController._Sensors.Count); i++) { int receiverID = this.wocketsController._Sensors[i]._Receiver._ID; int plottedPoints = 0; if (this.wocketsController._Receivers[receiverID]._Status == Wockets.Receivers.ReceiverStatus.Connected) { int currentHead = this.wocketsController._Sensors[i]._Decoder._Head; //int decoderID = this.wocketsController._Sensors[i]._Decoder._ID; //for (int j = this.plotFrom[decoderID]; (j < this.wocketsController._Decoders[decoderID]._Size); j++) int tail = this.decoderTails[i]; //while(tail<=this.wocketsController._Sensors[i]._Decoder._Head) AccelerationData data = ((AccelerationData)this.wocketsController._Sensors[i]._Decoder._Data[tail]); if (this.mode == PlottingMode.Delayed) //wait until 3 seconds are there then plot 5 pts max { int counter = 0; if ((tail < currentHead) && (currentHead < (this.wocketsController._Sensors[i]._Decoder._Data.Length - 1))) { counter = currentHead - tail; } else { counter = (this.wocketsController._Sensors[i]._Decoder._Data.Length - 1) - tail + currentHead; } if (counter > 360) { pointsToPlot[i] = 20; } else if (counter > 180) { pointsToPlot[i] = 10; } else { pointsToPlot[i] = 5; } } while ((tail != currentHead) && (data.UnixTimeStamp > 0) && (data.UnixTimeStamp >= this.lastUnixTimestamps[i])) { if (skippedPoints > 0) { if ((tail % skippedPoints) != 0) { if (tail >= (this.wocketsController._Sensors[i]._Decoder._Data.Length - 1)) { tail = 0; } else { tail++; } continue; } } //check the data comes from the sensor i if the decoder is used with multiple sensors if (data._SensorID == this.wocketsController._Sensors[i]._ID) { if (this.currentColumns[i] > lastColumnDrawn) { lastColumnDrawn = this.currentColumns[i]; } if (this.currentColumns[i] >= this.plotAreaSize.Width - 1) { g.FillRectangle(PlotBackgroundBrush, 0, 0, this.plotAreaSize.Width + 10, this.plotAreaSize.Height); requiresFullRedraw = true; this.currentColumns[i] = 0; } if ((this.wocketsController._Sensors[data._SensorID])._Class == Wockets.Sensors.SensorClasses.HTCDiamondTouch) { if (this.wocketsController._Sensors.Count != 1) { g.DrawEllipse(p[0], lastColumnDrawn, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._X), 2, 2); g.DrawEllipse(p[1], lastColumnDrawn, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._Y), 2, 2); g.DrawEllipse(p[2], lastColumnDrawn, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._Z), 2, 2); } else { g.DrawLine(p[0], this.currentColumns[i], axisOffset[i] - (int)Math.Floor(scaleFactors[i] * previousVals[i][0]), this.currentColumns[i] + 1, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._X)); g.DrawLine(p[1], this.currentColumns[i], axisOffset[i] - (int)Math.Floor(scaleFactors[i] * previousVals[i][1]), this.currentColumns[i] + 1, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._Y)); g.DrawLine(p[2], this.currentColumns[i], axisOffset[i] - (int)Math.Floor(scaleFactors[i] * previousVals[i][2]), this.currentColumns[i] + 1, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._Z)); } if (this.currentColumns[i] > lastColumn[data._SensorID]) { lastColumn[data._SensorID] = this.currentColumns[i]; } } else { g.DrawLine(p[0], this.currentColumns[i], axisOffset[i] - (int)Math.Floor(scaleFactors[i] * previousVals[i][0]), this.currentColumns[i] + 1, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._X)); g.DrawLine(p[1], this.currentColumns[i], axisOffset[i] - (int)Math.Floor(scaleFactors[i] * previousVals[i][1]), this.currentColumns[i] + 1, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._Y)); g.DrawLine(p[2], this.currentColumns[i], axisOffset[i] - (int)Math.Floor(scaleFactors[i] * previousVals[i][2]), this.currentColumns[i] + 1, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._Z)); if (this.currentColumns[i] > lastColumn[data._SensorID]) { lastColumn[data._SensorID] = this.currentColumns[i]; } } previousVals[i][0] = data._X; previousVals[i][1] = data._Y; previousVals[i][2] = data._Z; previousTimes[i] = data.UnixTimeStamp; this.currentColumns[i] = this.currentColumns[i] + 1; } this.lastUnixTimestamps[i] = data.UnixTimeStamp; if (tail >= (this.wocketsController._Sensors[i]._Decoder._Data.Length - 1)) { tail = 0; } else { tail++; } data = ((AccelerationData)this.wocketsController._Sensors[i]._Decoder._Data[tail]); plottedPoints++; if ((this.mode == PlottingMode.Delayed) && (plottedPoints == pointsToPlot[i])) { break; } else if (plottedPoints == 20) { break; } } this.decoderTails[i] = currentHead; } } if (requiresFullRedraw) { aPanel.Invalidate(); requiresFullRedraw = false; this.aPanel.Width = this.aPanel.Width; for (int k = 0; (k < this.wocketsController._Sensors.Count); k++) { this.currentColumns[k] = 0; lastColumn[k] = 0; firstColumn[k] = 999999; } } else { for (int k = 0; (k < this.wocketsController._Sensors.Count); k++) { aPanel.Invalidate(new System.Drawing.Rectangle(firstColumn[k], 0, lastColumn[k] - firstColumn[k], plotAreaSize.Height)); firstColumn[k] = lastColumn[k]; } } }
/// <summary> /// Saves data to a binary file /// </summary> public override void Save() { #if (PocketPC) if (_Saving) { #region Determine the head of the data buffer int currentHead = -1; currentHead = this._Decoder._Head; #endregion Determine the head of the data buffer #region Check if a new binary file need to be created DateTime now = DateTime.Now; if (presentHour != now.Hour) //((bw==null)||(presentHour != DateTime.Now.Hour)|| (presentMinute != DateTime.Now.Minute) || (presentSecond!= DateTime.Now.Second)) { if (bw != null) { bw.CloseFile(); } presentHour = now.Hour; presentMinute = now.Minute; presentSecond = now.Second; // Need to create a new directory and switch the file name dayPath = DirectoryStructure.DayDirectoryToUse(this._RootStorageDirectory); // Make sure hour directory exists currentDataFile = dayPath + "\\" + presentHour + "\\"; if (!System.IO.Directory.Exists(currentDataFile)) { System.IO.Directory.CreateDirectory(currentDataFile); } currentDataFile = currentDataFile + FILE_TYPE_PREFIX + "." + DirectoryStructure.GetDate() + "." + this._ID + "." + FILE_EXT; bw = new ByteWriter(currentDataFile, true); bw.OpenFile(32768); // Ensure that the first data point in the new file will start // with the full, rather than differential, timecode info. isForceTimestampSave = true; } #endregion Check if a new binary file need to be created // Write data as long as the tail is not equal to the head while (tail != currentHead) { #region Populate the acceleration data that need to be written data = ((AccelerationData)this._Decoder._Data[tail]); #endregion Populate the acceleration data that need to be written #region Check for timestamp errors aUnixTime = data.UnixTimeStamp; if (aUnixTime < lastUnixTime) { lastUnixTime = aUnixTime; Logger.Error("Accelerometer: Save: Data overwritten without saving Accelerometer.cs Save " + this._ID + " " + aUnixTime + " " + lastUnixTime); } #endregion Check for timestamp errors #region Write Data if (bw != null) { #region Write Timestamp diffMS = (int)(aUnixTime - lastUnixTime); if (isForceTimestampSave || (diffMS > 254) || (timeSaveCount == TIMESTAMP_AFTER_SAMPLES)) { bw.WriteByte((byte)255); WocketsTimer.GetUnixTimeBytes(aUnixTime, retBytes); bw.WriteBytes(retBytes, 6); timeSaveCount = 0; isForceTimestampSave = false; } else { bw.WriteByte((byte)diffMS); timeSaveCount++; } #endregion Write Timestamp #region Write Raw Data for (int j = 0; j < data._Length; j++) { bw.WriteByte(data.RawBytes[j]); } #endregion Write Raw Data } #endregion Write Data #region Update Pointers, statistics and time stamps lastUnixTime = aUnixTime; this.tailUnixTimestamp = aUnixTime; if (tail >= this._Decoder._BufferSize - 1) { tail = 0; } else { tail++; } this._SavedPackets++; #endregion Update Pointers, statistics and time stamps } if ((bw != null) && (this._Flush)) { bw.Flush(); } } #endif }
public void Draw(Graphics g) { int lastColumnDrawn = 0; for (int i = 0; (i < CurrentWockets._Controller._Sensors.Count); i++) { int tail = this.decoderTails[i]; int currentHead = tail; //Check if the decoder got reinitialized if ((CurrentWockets._Controller._Decoders[i].TotalSamples == 0) && (this.decoderTails[i] != 0)) { this.decoderTails[i] = 0; } currentHead = CurrentWockets._Controller._Sensors[i]._Decoder._Head; while (tail != currentHead) { try{ data = ((AccelerationData)CurrentWockets._Controller._Sensors[i]._Decoder._Data[tail]); if (!((data.UnixTimeStamp > 0) && (data.UnixTimeStamp >= this.lastUnixTimestamps[i]))) { break; } //check the data comes from the sensor i if the decoder is used with multiple sensors if (this.currentColumns[i] > lastColumnDrawn) { lastColumnDrawn = this.currentColumns[i]; } if (this.currentColumns[i] >= this.plotAreaSize.Width - 1) { g.FillRectangle(blueBrush, 0, 0, this.plotAreaSize.Width + 10, this.plotAreaSize.Height); requiresFullRedraw = true; this.currentColumns[i] = 0; } g.DrawLine(p[0], this.currentColumns[i], axisOffset[i] - (int)Math.Floor(scaleFactors[i] * previousVals[i][0]), this.currentColumns[i] + 1, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._X)); g.DrawLine(p[1], this.currentColumns[i], axisOffset[i] - (int)Math.Floor(scaleFactors[i] * previousVals[i][1]), this.currentColumns[i] + 1, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._Y)); g.DrawLine(p[2], this.currentColumns[i], axisOffset[i] - (int)Math.Floor(scaleFactors[i] * previousVals[i][2]), this.currentColumns[i] + 1, axisOffset[i] - (int)Math.Floor(scaleFactors[i] * data._Z)); if (this.currentColumns[i] > lastColumn[i]) { lastColumn[i] = this.currentColumns[i]; } previousVals[i][0] = data._X; previousVals[i][1] = data._Y; previousVals[i][2] = data._Z; previousTimes[i] = data.UnixTimeStamp; this.currentColumns[i] = this.currentColumns[i] + 1; this.lastUnixTimestamps[i] = data.UnixTimeStamp; if (tail >= (Wockets.Decoders.Accelerometers.WocketsDecoder.BUFFER_SIZE - 1)) { tail = 0; } else { tail++; } } catch (Exception e) { } } this.decoderTails[i] = currentHead; } if (requiresFullRedraw) { aPanel.Invalidate(); requiresFullRedraw = false; //aPanel.Width = this.aPanel.Width; for (int k = 0; (k < CurrentWockets._Controller._Sensors.Count); k++) { this.currentColumns[k] = 0; lastColumn[k] = 0; firstColumn[k] = 999999; } } else { for (int k = 0; (k < CurrentWockets._Controller._Sensors.Count); k++) { aPanel.Invalidate(new System.Drawing.Rectangle(firstColumn[k], 0, lastColumn[k] - firstColumn[k], plotAreaSize.Height)); firstColumn[k] = lastColumn[k]; } } }
private int get_wockets_decoded_data(int currentHead) { double tailUnixTimestamp = 0; double aUnixTime = 0; int DecodedPackets = 0; AccelerationData prevdata; AccelerationData data = ((AccelerationData)this.wocket_dc._Data[lastTail]); //initialize statistics int i=0; VMAG = 0.0; for (i = 0; i < 3; i++) { means[i] = 0; } while ((lastTail != currentHead) && (data.UnixTimeStamp > 0)) { //check that data is valid aUnixTime = data.UnixTimeStamp; if (aUnixTime < lastUnixTime) { status = "Data overwritten without decoding"; //Logger.Error(s); break; } #region commented /* //else if ((aUnixTime - lastUnixTime) > 2000) // Console.WriteLine(""); // Roughly once per second save full timestamp, no matter what if (isForceTimestampSave || (timeSaveCount == TIMESTAMP_AFTER_SAMPLES)) { WriteTimeDiff(aUnixTime, lastUnixTime, true); // Force save timeSaveCount = 0; } else { WriteTimeDiff(aUnixTime, lastUnixTime, false); timeSaveCount++; } isForceTimestampSave = false; // Save Raw Bytes if (bw != null) for (int j = 0; j < data.NumRawBytes; j++) bw.WriteByte(data.RawBytes[j]); */ #endregion lastUnixTime = aUnixTime; tailUnixTimestamp = aUnixTime; //if valid, get values for buffer means[0] = means[0] + data._X; means[1] = means[1] + data._Y; means[2] = means[2] + data._Z; //make updates of decoded data prevdata = data; if (lastTail >= this.wocket_dc._Data.Length - 1) lastTail= 0; else lastTail++; //get new value DecodedPackets++; data = ((AccelerationData)this.wocket_dc._Data[lastTail]); if (prev > -1) { VMAG = VMAG + System.Math.Sqrt(System.Math.Pow((double)(data._X - Rmeans[0]), 2.0) + System.Math.Pow((double)(data._Y - Rmeans[1]), 2.0) + System.Math.Pow((double)(data._Z - Rmeans[2]), 2.0)); } } //compute the final mean result if (DecodedPackets > 1) { for (i = 0; i < 3; i++) { Rmeans[i] = means[i] / DecodedPackets; } VMAG = VMAG / DecodedPackets; if(prev == -1) prev = 0; } return DecodedPackets; }