2024-02-09 23:30:47 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Targets;
|
|
|
|
|
|
|
|
|
|
use Targets\TargetDescriptionFiles\TargetDescriptionFile;
|
|
|
|
|
|
|
|
|
|
require_once __DIR__ . "/TargetRegister.php";
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Do not confuse this with `TargetDescriptionFiles\RegisterGroup` - that class represents a <register-group> element
|
|
|
|
|
* in a TDF. Any references to subgroups will be unresolved.
|
|
|
|
|
*
|
|
|
|
|
* This class represents a **resolved** target register group, within a target peripheral. With this class, we can
|
|
|
|
|
* access all subgroups, including referenced subgroups, along with their registers.
|
|
|
|
|
*
|
|
|
|
|
* This class is constructed from a `TargetDescriptionFiles\RegisterGroup` object.
|
|
|
|
|
* @see TargetDescriptionFile::getTargetRegisterGroup() for more.
|
|
|
|
|
*/
|
|
|
|
|
class TargetRegisterGroup
|
|
|
|
|
{
|
|
|
|
|
public ?string $key = null;
|
|
|
|
|
public ?string $name = null;
|
|
|
|
|
public ?int $baseAddress = null;
|
|
|
|
|
|
|
|
|
|
/** @var TargetRegisterGroup[] */
|
2024-02-12 19:39:21 +00:00
|
|
|
public array $subgroups = [];
|
2024-02-09 23:30:47 +00:00
|
|
|
|
|
|
|
|
/** @var TargetRegister[] */
|
|
|
|
|
public array $registers = [];
|
|
|
|
|
|
2024-02-12 19:39:21 +00:00
|
|
|
public function __construct(?string $key, ?string $name, ?int $baseAddress, array $subgroups, array $registers)
|
2024-02-09 23:30:47 +00:00
|
|
|
{
|
|
|
|
|
$this->key = $key;
|
|
|
|
|
$this->name = $name;
|
|
|
|
|
$this->baseAddress = $baseAddress;
|
2024-02-12 19:39:21 +00:00
|
|
|
$this->subgroups = $subgroups;
|
2024-02-09 23:30:47 +00:00
|
|
|
$this->registers = $registers;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function getRegister(array|string $keys): ?TargetRegister
|
|
|
|
|
{
|
|
|
|
|
if (is_string($keys)) {
|
|
|
|
|
$keys = explode('.', $keys);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$registerKey = array_pop($keys);
|
2024-02-12 19:39:21 +00:00
|
|
|
$group = !empty($keys) > 1 ? $this->getSubgroup($keys) : $this;
|
2024-02-09 23:30:47 +00:00
|
|
|
|
|
|
|
|
if ($group instanceof TargetRegisterGroup) {
|
|
|
|
|
foreach ($group->registers as $register) {
|
|
|
|
|
if ($register->key === $registerKey) {
|
|
|
|
|
return $register;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2024-02-12 19:39:21 +00:00
|
|
|
public function getSubgroup(array|string $subgroupKeys): ?TargetRegisterGroup
|
2024-02-09 23:30:47 +00:00
|
|
|
{
|
2024-02-12 19:39:21 +00:00
|
|
|
if (is_string($subgroupKeys)) {
|
|
|
|
|
$subgroupKeys = explode('.', $subgroupKeys);
|
2024-02-09 23:30:47 +00:00
|
|
|
}
|
|
|
|
|
|
2024-02-12 19:39:21 +00:00
|
|
|
$firstLevelSubgroupKey = array_shift($subgroupKeys);
|
|
|
|
|
foreach ($this->subgroups as $subgroup) {
|
|
|
|
|
if ($subgroup->key === $firstLevelSubgroupKey) {
|
|
|
|
|
return !empty($subgroupKeys) ? $subgroup->getSubgroup($subgroupKeys) : $subgroup;
|
2024-02-09 23:30:47 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|