コード例 #1
0
        public void OnBroadcast(object sender, MesgBroadcastEventArgs e)
        {
            float[]     calibratedXYZ;
            int         count;
            List <Mesg> mesgs = e.mesgs;

            int[] rawXYZ = new int[NUM_AXIS];

            foreach (Mesg mesg in mesgs)
            {
                switch (mesg.Num)
                {
                case MesgNum.AccelerometerData:
                    if (haveAccelCal)
                    {
                        AccelerometerDataMesg accelData = new AccelerometerDataMesg(mesg);
                        count = accelData.GetNumAccelX();
                        for (int i = 0; i < count; i++)
                        {
                            //Extract the uncalibrated accel data from incoming message
                            rawXYZ[X_AXIS_OFFSET] = Convert.ToInt32(accelData.GetAccelX(i));
                            rawXYZ[Y_AXIS_OFFSET] = Convert.ToInt32(accelData.GetAccelY(i));
                            rawXYZ[Z_AXIS_OFFSET] = Convert.ToInt32(accelData.GetAccelZ(i));

                            // Apply calibration to the values
                            calibratedXYZ = AdjustSensorData(rawXYZ, accelCalParams);

                            // Update the message
                            ProcessCalibrationFactor(mesg, accelDataFieldNameXYZ, calibratedXYZ, accelDataFieldNum);
                        }
                    }
                    break;

                case MesgNum.GyroscopeData:
                    if (haveGyroCal)
                    {
                        GyroscopeDataMesg gyroData = new GyroscopeDataMesg(mesg);
                        count = gyroData.GetNumGyroX();
                        for (int i = 0; i < count; i++)
                        {
                            //Extract the uncalibrated gyro data from incoming message
                            rawXYZ[X_AXIS_OFFSET] = Convert.ToInt32(gyroData.GetGyroX(i));
                            rawXYZ[Y_AXIS_OFFSET] = Convert.ToInt32(gyroData.GetGyroY(i));
                            rawXYZ[Z_AXIS_OFFSET] = Convert.ToInt32(gyroData.GetGyroZ(i));

                            // Apply calibration to the values
                            calibratedXYZ = AdjustSensorData(rawXYZ, gyroCalParams);

                            // Update the message
                            ProcessCalibrationFactor(mesg, gyroDataFieldNameXYZ, calibratedXYZ, gyroDataFieldNum);
                        }
                    }
                    break;

                case MesgNum.MagnetometerData:
                    if (haveMagCal)
                    {
                        MagnetometerDataMesg magData = new MagnetometerDataMesg(mesg);
                        count = magData.GetNumMagX();
                        for (int i = 0; i < count; i++)
                        {
                            //Extract the uncalibrated mag data from incoming message
                            rawXYZ[X_AXIS_OFFSET] = Convert.ToInt32(magData.GetMagX(i));
                            rawXYZ[Y_AXIS_OFFSET] = Convert.ToInt32(magData.GetMagY(i));
                            rawXYZ[Z_AXIS_OFFSET] = Convert.ToInt32(magData.GetMagZ(i));

                            // Apply calibration to the values
                            calibratedXYZ = AdjustSensorData(rawXYZ, magCalParams);

                            // Update the message
                            ProcessCalibrationFactor(mesg, magDataFieldNameXYZ, calibratedXYZ, magDataFieldNum);
                        }
                    }
                    break;

                default:
                    break;
                } // switch
            }     // foreach
        }
コード例 #2
0
        public void OnBroadcast(object sender, MesgBroadcastEventArgs e)
        {
            List <Mesg> mesgs = e.mesgs;

            if (isActivityFile && (hr_start_index != HrToRecordMesgBroadcastPlugin.INVALID_INDEX))
            {
                float?   hr_anchor_event_timestamp = 0.0f;
                DateTime hr_anchor_timestamp       = new DateTime(0);
                bool     hr_anchor_set             = false;
                byte?    last_valid_hr             = 0;
                DateTime last_valid_hr_time        = new DateTime(0);

                for (int mesgCounter = 0; mesgCounter < mesgs.Count; mesgCounter++)
                {
                    Mesg mesg = mesgs[mesgCounter];

                    if (mesg.Num == MesgNum.Record)
                    {
                        long hrSum      = 0;
                        long hrSumCount = 0;

                        // Cast message to record message
                        RecordMesg recordMesg = new RecordMesg(mesg);

                        // Obtain the time for which the record message is valid
                        DateTime record_range_end_time = new DateTime(recordMesg.GetTimestamp());

                        // Need to determine timestamp range which applies to this record
                        bool findingInRangeHrMesgs = true;

                        // Start searching HR mesgs where we left off
                        int hr_mesg_counter     = hr_start_index;
                        int hr_sub_mesg_counter = hr_start_sub_index;

                        while (findingInRangeHrMesgs && (hr_mesg_counter < mesgs.Count))
                        {
                            // Skip over any non HR messages
                            if (mesgs[hr_mesg_counter].Num == MesgNum.Hr)
                            {
                                HrMesg hrMesg = new HrMesg(mesgs[hr_mesg_counter]);

                                // Update HR timestamp anchor, if present
                                if (hrMesg.GetTimestamp() != null && hrMesg.GetTimestamp().GetTimeStamp() != 0)
                                {
                                    hr_anchor_timestamp = new DateTime(hrMesg.GetTimestamp());
                                    hr_anchor_set       = true;

                                    if (hrMesg.GetFractionalTimestamp() != null)
                                    {
                                        hr_anchor_timestamp.Add((double)hrMesg.GetFractionalTimestamp());
                                    }

                                    if (hrMesg.GetNumEventTimestamp() == 1)
                                    {
                                        hr_anchor_event_timestamp = hrMesg.GetEventTimestamp(0);
                                    }
                                    else
                                    {
                                        throw new FitException("FIT HrToRecordMesgBroadcastPlugin Error: Anchor HR mesg must have 1 event_timestamp");
                                    }
                                }

                                if (hr_anchor_set == false)
                                {
                                    // We cannot process any HR messages if we have not received a timestamp anchor
                                    throw new FitException("FIT HrToRecordMesgBroadcastPlugin Error: No anchor timestamp received in a HR mesg before diff HR mesgs");
                                }
                                else if (hrMesg.GetNumEventTimestamp() != hrMesg.GetNumFilteredBpm())
                                {
                                    throw new FitException("FIT HrToRecordMesgBroadcastPlugin Error: HR mesg with mismatching event timestamp and filtered bpm");
                                }
                                for (int j = hr_sub_mesg_counter; j < hrMesg.GetNumEventTimestamp(); j++)
                                {
                                    // Build up timestamp for each message using the anchor and event_timestamp
                                    DateTime hrMesgTime      = new DateTime(hr_anchor_timestamp);
                                    float?   event_timestamp = hrMesg.GetEventTimestamp(j);

                                    // Deal with roll over case
                                    if (event_timestamp < hr_anchor_event_timestamp)
                                    {
                                        if ((hr_anchor_event_timestamp - event_timestamp) > (1 << 21))
                                        {
                                            event_timestamp += (1 << 22);
                                        }
                                        else
                                        {
                                            throw new FitException("FIT HrToRecordMesgBroadcastPlugin Error: Anchor event_timestamp is greater than subsequent event_timestamp. This does not allow for correct delta calculation.");
                                        }
                                    }
                                    hrMesgTime.Add((double)(event_timestamp - hr_anchor_event_timestamp));

                                    // Check if hrMesgTime is gt record start time
                                    // and if hrMesgTime is lte to record end time
                                    if ((hrMesgTime.CompareTo(record_range_start_time) > 0) &&
                                        (hrMesgTime.CompareTo(record_range_end_time) <= 0))
                                    {
                                        hrSum += (long)hrMesg.GetFilteredBpm(j);
                                        hrSumCount++;
                                        last_valid_hr_time = new DateTime(hrMesgTime);
                                    }
                                    // check if hrMesgTime exceeds the record time
                                    else if (hrMesgTime.CompareTo(record_range_end_time) > 0)
                                    {
                                        // Remember where we left off
                                        hr_start_index        = hr_mesg_counter;
                                        hr_start_sub_index    = j;
                                        findingInRangeHrMesgs = false;

                                        if (hrSumCount > 0)
                                        {
                                            // Update record heart rate
                                            last_valid_hr = (byte?)System.Math.Round((((float)hrSum) / hrSumCount), MidpointRounding.AwayFromZero);
                                            recordMesg.SetHeartRate(last_valid_hr);
                                            mesgs[mesgCounter] = (Mesg)recordMesg;
                                        }
                                        // If no stored HR is available, fill in record messages with the
                                        // last valid filtered hr for a maximum of 5 seconds
                                        else if ((record_range_start_time.CompareTo(last_valid_hr_time) > 0) &&
                                                 ((record_range_start_time.GetTimeStamp() - last_valid_hr_time.GetTimeStamp()) < 5))
                                        {
                                            recordMesg.SetHeartRate(last_valid_hr);
                                            mesgs[mesgCounter] = (Mesg)recordMesg;
                                        }

                                        // Reset HR average
                                        hrSum      = 0;
                                        hrSumCount = 0;

                                        record_range_start_time = new DateTime(record_range_end_time);

                                        // Breaks out of looping within the event_timestamp array
                                        break;
                                    }
                                }
                            }
                            hr_mesg_counter++;
                            hr_sub_mesg_counter = 0;
                        }
                    }
                }
            }
        }