/**
  * Write the heart rate data for a lap.
  *
  * @param XMLWriter $xmlWriter The XML writer.
  * @param \SportTrackerConnector\Workout\Workout\Track $track The track to write.
  */
 private function writeLapHeartRateDate(XMLWriter $xmlWriter, Track $track)
 {
     $averageHeartRate = array();
     $maxHearRate = null;
     foreach ($track->getTrackPoints() as $trackPoint) {
         if ($trackPoint->hasExtension(HR::ID) === true) {
             $pointHearRate = $trackPoint->getExtension(HR::ID)->getValue();
             $maxHearRate = max($maxHearRate, $pointHearRate);
             $averageHeartRate[] = $pointHearRate;
         }
     }
     if ($averageHeartRate !== array()) {
         $xmlWriter->startElement('AverageHeartRateBpm');
         $xmlWriter->writeAttributeNs('xsi', 'type', null, 'HeartRateInBeatsPerMinute_t');
         $xmlWriter->writeElement('Value', array_sum($averageHeartRate) / count($averageHeartRate));
         $xmlWriter->endElement();
     }
     if ($maxHearRate !== null) {
         $xmlWriter->startElement('MaximumHeartRateBpm');
         $xmlWriter->writeAttributeNs('xsi', 'type', null, 'HeartRateInBeatsPerMinute_t');
         $xmlWriter->writeElement('Value', $maxHearRate);
         $xmlWriter->endElement();
     }
 }
 /**
  * Post one workout track to endomondo.
  *
  * @param Track $track
  * @return null|string
  * @throws \RuntimeException If the uploading stops at one point.
  */
 private function postTrack(Track $track)
 {
     $deviceWorkoutId = '-' . $this->bigRandomNumber(19);
     $sport = $this->sportMapper->getCodeFromSport($track->getSport());
     $duration = $track->getDuration()->getTotalSeconds();
     $workoutId = null;
     $previousPoint = null;
     $distance = 0;
     $speed = 0;
     // Split in chunks of 100 points like the mobile app.
     foreach (array_chunk($track->getTrackPoints(), 100) as $trackPoints) {
         $data = array();
         foreach ($trackPoints as $trackPoint) {
             /** @var \SportTrackerConnector\Workout\Workout\TrackPoint $trackPoint */
             if ($trackPoint->hasDistance() === true) {
                 $distance = $trackPoint->getDistance();
             } elseif ($previousPoint !== null) {
                 $distance += $trackPoint->distance($previousPoint);
             }
             if ($previousPoint !== null) {
                 $speed = $trackPoint->speed($previousPoint);
             }
             $data[] = $this->flattenTrackPoint($trackPoint, $distance, $speed);
             $previousPoint = $trackPoint;
         }
         $workoutId = $this->postWorkoutData($deviceWorkoutId, $sport, $duration, $data);
     }
     // End of workout data.
     //        $data = $this->flattenEndWorkoutTrackPoint($track, $speed);
     //        $workoutId = $this->postWorkoutData($deviceWorkoutId, $sport, $duration, array($data));
     return $workoutId;
 }