TCX::parseExtensions()   A
last analyzed

Complexity

Conditions 2
Paths 2

Size

Total Lines 10
Code Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
cc 2
eloc 5
nc 2
nop 1
1
<?php
2
3
declare(strict_types = 1);
4
5
namespace SportTrackerConnector\Core\Workout\Loader;
6
7
use SportTrackerConnector\Core\Workout\Extension\ExtensionInterface;
8
use SportTrackerConnector\Core\Workout\Extension\HR;
9
use SportTrackerConnector\Core\Workout\SportGuesser;
10
use SportTrackerConnector\Core\Workout\SportMapperInterface;
11
use SportTrackerConnector\Core\Workout\Track;
12
use SportTrackerConnector\Core\Workout\TrackPoint;
13
use SportTrackerConnector\Core\Workout\Workout;
14
15
/**
16
 * Load a workout from TCX format.
17
 */
18
class TCX implements LoaderInterface
19
{
20
    /**
21
     * {@inheritdoc}
22
     */
23
    public function load(string $filePath): Workout
24
    {
25
        $simpleXML = new \SimpleXMLElement($filePath);
26
27
        $tracks = [];
28
        foreach ($simpleXML->Activities[0] as $simpleXMLActivity) {
29
            // Sport.
30
            $attributes = $simpleXMLActivity->attributes();
31
            $sport = SportMapperInterface::class;
32
            if (isset($attributes['Sport'])) {
33
                $sport = SportGuesser::guess((string)$attributes['Sport']);
34
            }
35
36
37
            // Track points.
38
            $trackPoints = [];
39
            foreach ($simpleXMLActivity->Lap as $lap) {
40
                foreach ($lap->Track as $track) {
41
                    foreach ($track->Trackpoint as $trackPoint) {
42
                        $dateTime = new \DateTimeImmutable((string)$trackPoint->Time);
43
                        $latitude = (float)$trackPoint->Position->LatitudeDegrees;
44
                        $longitude = (float)$trackPoint->Position->LongitudeDegrees;
45
46
                        $trackPoints[] = TrackPoint::with(
47
                            $latitude,
48
                            $longitude,
49
                            $dateTime,
50
                            round((float)$trackPoint->AltitudeMeters, 2),
51
                            $this->parseExtensions($trackPoint)
52
                        );
53
                    }
54
                }
55
                $tracks[] = new Track($trackPoints, $sport);
56
            }
57
58
        }
59
60
        return new Workout($tracks);
61
    }
62
63
    /**
64
     * Parse and return an array of extensions from the XML.
65
     *
66
     * @param \SimpleXMLElement $trackPoint The track point from the TCX to parse.
67
     * @return ExtensionInterface[]
68
     */
69
    protected function parseExtensions(\SimpleXMLElement $trackPoint): array
70
    {
71
        $return = array();
72
73
        if ($trackPoint->HeartRateBpm) {
74
            $return[] = HR::fromValue((string)$trackPoint->HeartRateBpm->Value);
75
        }
76
77
        return $return;
78
    }
79
}
80