Skip to content
This repository was archived by the owner on May 8, 2025. It is now read-only.

Commit e36bc7d

Browse files
committed
setUnits() generic to session, lap, record
1 parent 1f07eaa commit e36bc7d

File tree

1 file changed

+162
-97
lines changed

1 file changed

+162
-97
lines changed

src/phpFITFileAnalysis.php

Lines changed: 162 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,123 +1333,188 @@ private function setUnits($options)
13331333
}
13341334
}
13351335

1336-
switch ($units) {
1337-
case 'statute':
1338-
if (isset($this->data_mesgs['record']['speed'])) { // convert meters per second to miles per hour
1339-
if (is_array($this->data_mesgs['record']['speed'])) {
1340-
foreach ($this->data_mesgs['record']['speed'] as &$value) {
1341-
if ($bPace) {
1342-
$value = round(60 / 2.23693629 / $value, 3);
1336+
// Set units for all messages
1337+
$messages = ['session', 'lap', 'record'];
1338+
$c_fields = [
1339+
'avg_temperature',
1340+
'max_temperature',
1341+
'temperature'
1342+
];
1343+
$m_fields = [
1344+
'distance',
1345+
'total_distance'
1346+
];
1347+
$m_ft_fields = [
1348+
'altitude',
1349+
'avg_altitude',
1350+
'enhanced_avg_altitude',
1351+
'enhanced_max_altitude',
1352+
'enhanced_min_altitude',
1353+
'max_altitude',
1354+
'min_altitude',
1355+
'total_ascent',
1356+
'total_descent'
1357+
];
1358+
$ms_fields = [
1359+
'avg_neg_vertical_speed',
1360+
'avg_pos_vertical_speed',
1361+
'avg_speed',
1362+
'enhanced_avg_speed',
1363+
'enhanced_max_speed',
1364+
'max_neg_vertical_speed',
1365+
'max_pos_vertical_speed',
1366+
'max_speed',
1367+
'speed'
1368+
];
1369+
$semi_fields = [
1370+
'end_position_lat',
1371+
'end_position_long',
1372+
'nec_lat',
1373+
'nec_long',
1374+
'position_lat',
1375+
'position_long',
1376+
'start_position_lat',
1377+
'start_position_long',
1378+
'swc_lat',
1379+
'swc_long'
1380+
];
1381+
1382+
foreach ($messages as $message) {
1383+
switch ($units) {
1384+
case 'statute':
1385+
1386+
// convert from celsius to fahrenheit
1387+
foreach ($c_fields as $field) {
1388+
if (isset($this->data_mesgs[$message][$field])) {
1389+
if (is_array($this->data_mesgs[$message][$field])) {
1390+
foreach ($this->data_mesgs[$message][$field] as &$value) {
1391+
$value = round((($value * 9) / 5) + 32, 2);
1392+
}
13431393
} else {
1344-
$value = round($value * 2.23693629, 3);
1394+
$this->data_mesgs[$message][$field] = round((($this->data_mesgs[$message][$field] * 9) / 5) + 32, 2);
13451395
}
13461396
}
1347-
} else {
1348-
if ($bPace) {
1349-
$this->data_mesgs['record']['speed'] = round(60 / 2.23693629 / $this->data_mesgs['record']['speed'], 3);
1350-
} else {
1351-
$this->data_mesgs['record']['speed'] = round($this->data_mesgs['record']['speed'] * 2.23693629, 3);
1352-
}
1353-
}
1354-
}
1355-
if (isset($this->data_mesgs['record']['distance'])) { // convert from meters to miles
1356-
if (is_array($this->data_mesgs['record']['distance'])) {
1357-
foreach ($this->data_mesgs['record']['distance'] as &$value) {
1358-
$value = round($value * 0.000621371192, 2);
1359-
}
1360-
} else {
1361-
$this->data_mesgs['record']['distance'] = round($this->data_mesgs['record']['distance'] * 0.000621371192, 2);
13621397
}
1363-
}
1364-
if (isset($this->data_mesgs['record']['altitude'])) { // convert from meters to feet
1365-
if (is_array($this->data_mesgs['record']['altitude'])) {
1366-
foreach ($this->data_mesgs['record']['altitude'] as &$value) {
1367-
$value = round($value * 3.2808399, 1);
1398+
1399+
// convert from meters to miles
1400+
foreach ($m_fields as $field) {
1401+
if (isset($this->data_mesgs[$message][$field])) {
1402+
if (is_array($this->data_mesgs[$message][$field])) {
1403+
foreach ($this->data_mesgs[$message][$field] as &$value) {
1404+
$value = round($value * 0.000621371192, 2);
1405+
}
1406+
} else {
1407+
$this->data_mesgs[$message][$field] = round($this->data_mesgs[$message][$field] * 0.000621371192, 2);
1408+
}
13681409
}
1369-
} else {
1370-
$this->data_mesgs['record']['altitude'] = round($this->data_mesgs['record']['altitude'] * 3.2808399, 1);
13711410
}
1372-
}
1373-
if (isset($this->data_mesgs['record']['position_lat'])) { // convert from semicircles to degress
1374-
if (is_array($this->data_mesgs['record']['position_lat'])) {
1375-
foreach ($this->data_mesgs['record']['position_lat'] as &$value) {
1376-
$value = round($value * (180.0 / pow(2, 31)), 5);
1377-
}
1378-
} else {
1379-
$this->data_mesgs['record']['position_lat'] = round($this->data_mesgs['record']['position_lat'] * (180.0 / pow(2, 31)), 5);
1380-
}
1381-
}
1382-
if (isset($this->data_mesgs['record']['position_long'])) { // convert from semicircles to degress
1383-
if (is_array($this->data_mesgs['record']['position_long'])) {
1384-
foreach ($this->data_mesgs['record']['position_long'] as &$value) {
1385-
$value = round($value * (180.0 / pow(2, 31)), 5);
1411+
1412+
// convert from meters to feet
1413+
foreach ($m_ft_fields as $field) {
1414+
if (isset($this->data_mesgs[$message][$field])) {
1415+
if (is_array($this->data_mesgs[$message][$field])) {
1416+
foreach ($this->data_mesgs[$message][$field] as &$value) {
1417+
$value = round($value * 3.2808399, 1);
1418+
}
1419+
} else {
1420+
$this->data_mesgs[$message][$field] = round($this->data_mesgs[$message][$field] * 3.2808399, 1);
1421+
}
13861422
}
1387-
} else {
1388-
$this->data_mesgs['record']['position_long'] = round($this->data_mesgs['record']['position_long'] * (180.0 / pow(2, 31)), 5);
13891423
}
1390-
}
1391-
if (isset($this->data_mesgs['record']['temperature'])) { // convert from celsius to fahrenheit
1392-
if (is_array($this->data_mesgs['record']['temperature'])) {
1393-
foreach ($this->data_mesgs['record']['temperature'] as &$value) {
1394-
$value = round((($value * 9) / 5) + 32, 2);
1424+
1425+
// convert meters per second to miles per hour
1426+
foreach ($ms_fields as $field) {
1427+
if (isset($this->data_mesgs[$message][$field])) {
1428+
if (is_array($this->data_mesgs[$message][$field])) {
1429+
foreach ($this->data_mesgs[$message][$field] as &$value) {
1430+
if ($bPace) {
1431+
$value = round(60 / 2.23693629 / $value, 3);
1432+
} else {
1433+
$value = round($value * 2.23693629, 3);
1434+
}
1435+
}
1436+
} else {
1437+
if ($bPace) {
1438+
$this->data_mesgs[$message][$field] = round(60 / 2.23693629 / $this->data_mesgs[$message][$field], 3);
1439+
} else {
1440+
$this->data_mesgs[$message][$field] = round($this->data_mesgs[$message][$field] * 2.23693629, 3);
1441+
}
1442+
}
13951443
}
1396-
} else {
1397-
$this->data_mesgs['record']['temperature'] = round((($this->data_mesgs['record']['temperature'] * 9) / 5) + 32, 2);
13981444
}
1399-
}
1400-
break;
1401-
case 'raw':
1402-
// Do nothing - leave values as read from file.
1403-
break;
1404-
case 'metric':
1405-
if (isset($this->data_mesgs['record']['speed'])) { // convert meters per second to kilometers per hour
1406-
if (is_array($this->data_mesgs['record']['speed'])) {
1407-
foreach ($this->data_mesgs['record']['speed'] as &$value) {
1408-
if ($bPace) {
1409-
$value = ($value != 0) ? round(60 / 3.6 / $value, 3) : 0;
1445+
1446+
// convert from semicircles to degress
1447+
foreach ($semi_fields as $field) {
1448+
if (isset($this->data_mesgs[$message][$field])) {
1449+
if (is_array($this->data_mesgs[$message][$field])) {
1450+
foreach ($this->data_mesgs[$message][$field] as &$value) {
1451+
$value = round($value * (180.0 / pow(2, 31)), 5);
1452+
}
14101453
} else {
1411-
$value = round($value * 3.6, 3);
1454+
$this->data_mesgs[$message][$field] = round($this->data_mesgs[$message][$field] * (180.0 / pow(2, 31)), 5);
14121455
}
14131456
}
1414-
} else {
1415-
if ($bPace) {
1416-
$this->data_mesgs['record']['speed'] = round(60 / 3.6 / $this->data_mesgs['record']['speed'], 3);
1417-
} else {
1418-
$this->data_mesgs['record']['speed'] = round($this->data_mesgs['record']['speed'] * 3.6, 3);
1419-
}
14201457
}
1421-
}
1422-
if (isset($this->data_mesgs['record']['distance'])) { // convert from meters to kilometers
1423-
if (is_array($this->data_mesgs['record']['distance'])) {
1424-
foreach ($this->data_mesgs['record']['distance'] as &$value) {
1425-
$value = round($value * 0.001, 2);
1458+
1459+
break;
1460+
1461+
case 'raw':
1462+
// Do nothing - leave values as read from file.
1463+
break;
1464+
case 'metric':
1465+
1466+
// convert from meters to kilometers
1467+
foreach ($m_fields as $field) {
1468+
if (isset($this->data_mesgs[$message][$field])) {
1469+
if (is_array($this->data_mesgs[$message][$field])) {
1470+
foreach ($this->data_mesgs[$message][$field] as &$value) {
1471+
$value = round($value * 0.001, 2);
1472+
}
1473+
} else {
1474+
$this->data_mesgs[$message][$field] = round($this->data_mesgs[$message][$field] * 0.001, 2);
1475+
}
14261476
}
1427-
} else {
1428-
$this->data_mesgs['record']['distance'] = round($this->data_mesgs['record']['distance'] * 0.001, 2);
14291477
}
1430-
}
1431-
if (isset($this->data_mesgs['record']['position_lat'])) { // convert from semicircles to degress
1432-
if (is_array($this->data_mesgs['record']['position_lat'])) {
1433-
foreach ($this->data_mesgs['record']['position_lat'] as &$value) {
1434-
$value = round($value * (180.0 / pow(2, 31)), 5);
1478+
1479+
// convert meters per second to kilometers per hour
1480+
foreach ($ms_fields as $field) {
1481+
if (isset($this->data_mesgs[$message][$field])) {
1482+
if (is_array($this->data_mesgs[$message][$field])) {
1483+
foreach ($this->data_mesgs[$message][$field] as &$value) {
1484+
if ($bPace) {
1485+
$value = ($value != 0) ? round(60 / 3.6 / $value, 3) : 0;
1486+
} else {
1487+
$value = round($value * 3.6, 3);
1488+
}
1489+
}
1490+
} else {
1491+
if ($bPace) {
1492+
$this->data_mesgs[$message][$field] = round(60 / 3.6 / $this->data_mesgs[$message][$field], 3);
1493+
} else {
1494+
$this->data_mesgs[$message][$field] = round($this->data_mesgs[$message][$field] * 3.6, 3);
1495+
}
1496+
}
14351497
}
1436-
} else {
1437-
$this->data_mesgs['record']['position_lat'] = round($this->data_mesgs['record']['position_lat'] * (180.0 / pow(2, 31)), 5);
14381498
}
1439-
}
1440-
if (isset($this->data_mesgs['record']['position_long'])) { // convert from semicircles to degress
1441-
if (is_array($this->data_mesgs['record']['position_long'])) {
1442-
foreach ($this->data_mesgs['record']['position_long'] as &$value) {
1443-
$value = round($value * (180.0 / pow(2, 31)), 5);
1499+
1500+
// convert from semicircles to degress
1501+
foreach ($semi_fields as $field) {
1502+
if (isset($this->data_mesgs[$message][$field])) {
1503+
if (is_array($this->data_mesgs[$message][$field])) {
1504+
foreach ($this->data_mesgs[$message][$field] as &$value) {
1505+
$value = round($value * (180.0 / pow(2, 31)), 5);
1506+
}
1507+
} else {
1508+
$this->data_mesgs[$message][$field] = round($this->data_mesgs[$message][$field] * (180.0 / pow(2, 31)), 5);
1509+
}
14441510
}
1445-
} else {
1446-
$this->data_mesgs['record']['position_long'] = round($this->data_mesgs['record']['position_long'] * (180.0 / pow(2, 31)), 5);
14471511
}
1448-
}
1449-
break;
1450-
default:
1451-
throw new \Exception('phpFITFileAnalysis->setUnits(): units option not valid!');
1452-
break;
1512+
1513+
break;
1514+
default:
1515+
throw new \Exception('phpFITFileAnalysis->setUnits(): units option not valid!');
1516+
break;
1517+
}
14531518
}
14541519
}
14551520

0 commit comments

Comments
 (0)