<?php
namespace SmartData;
require_once( __DIR__ . '/Exception.php');
require_once( __DIR__ . '/Packer.php');
require_once( __DIR__ . '/Unit.php');
use SmartData\Utility\Pack;
use SmartData\Utility\Unpack;
class Series
{
public $version;
private $unit;
public $x;
public $y;
public $z;
public $r;
public $t0;
public $t1;
public $dev;
public $signature;
public function __construct($v, $u, $x,$y,$z, $r, $t0, $t1, $dev, $signature=0, $workflow=0)
{
// Conditions for a valid series.
//TODO: Check the maximum value comparison
//if ((gmp_cmp(gmp_init($t0), gmp_init($t1)) > 0) or ($r < 0)){
if (($t0 > $t1) or ($t0 < 0) or ($t1 < 0) or ($r < 0)){
throw new Exception\BadRequestException("Invalid series");
}
$tmp_v = $v;
if(is_numeric($tmp_v) && is_int($tmp_v+0)){
// nothing
} else {
$tmp_v = explode(".", $tmp_v);
$tmp_v = ($tmp_v[0]<<4) + $tmp_v[1];
}
$this->version = $tmp_v;
$this->unit = ($u instanceof Unit) ? $u : Unit::interpret($u);
$this->x = $x;
$this->y = $y;
$this->z = $z;
$this->r = $r;
$this->t0 = $t0;
$this->t1 = $t1;
$this->dev = $dev;
$this->signature = $signature;
$this->workflow = $workflow;
}
public function unit()
{
return $this->unit;
}
public function contains_point($x, $y, $z)
{
return ( sqrt(pow($this->x - $x, 2) + pow($this->y - $y, 2) + pow($this->z - $z, 2)) <= $this->r );
}
public function contains_time($time)
{
return ( $this->t0 <= $time && $time <= $this->t1 );
}
public function __get($property)
{
if (property_exists($this, $property)) {
switch ($property) {
case 'unit':
if($this->unit instanceof Unit)
return $this->unit->cod;
else
return $this->unit;
default:
return $this->$property;
}
}
}
//public function create()
//{
// return API::create($this->pack());
//}
//public function attach()
//{
// return API::attach($this->pack());
//}
//public function get()
//{
// return API::get($this->pack());
//}
public function pack(array $suppress = array())
{
$bin = '';
if(!in_array("version", $suppress))
$bin .= Pack::uInt8($this->version);
if(!in_array("unit", $suppress))
$bin .= Pack::uInt32($this->unit->cod);
if(!in_array("x", $suppress))
$bin .= Pack::int32($this->x);
if(!in_array("y", $suppress))
$bin .= Pack::int32($this->y);
if(!in_array("z", $suppress))
$bin .= Pack::int32($this->z);
if(!in_array("r", $suppress))
$bin .= Pack::int32($this->r);
if(!in_array("t0", $suppress))
$bin .= Pack::uInt64($this->t0);
if(!in_array("t1", $suppress))
$bin .= Pack::uInt64($this->t1);
if(!in_array("dev", $suppress))
$bin .= Pack::uint32($this->dev);
return $bin;
}
public static function unpack(& $bin, array $compl = array())
{
$ver = $compl['version'] ?? Unpack::uInt8($bin, true);
if(array_key_exists('unit', $compl))
$u = Unit::interpret($compl['unit']);
else
$u = Unit::unpack($bin);
$x = $compl['x'] ?? Unpack::int32($bin, true);
$y = $compl['y'] ?? Unpack::int32($bin, true);
$z = $compl['z'] ?? Unpack::int32($bin, true);
$r = $compl['r'] ?? Unpack::int32($bin, true);
$t0 = $compl['t0'] ?? Unpack::uInt64($bin, true);
if($t0<0)
$t0 = 0;
$t1 = $compl['t1'] ?? Unpack::uInt64($bin, true);
if($t1<0)
$t1 = PHP_INT_MAX;
$d = $compl['dev'] ?? Unpack::uint32($bin, true);
return new self($ver, $u, $x, $y, $z, $r, $t0, $t1, $d);
}
public function toArray()
{
$json = array();
$json['version'] = $this->version;
$json['unit'] = $this->unit->cod;
$json['x'] = $this->x;
$json['y'] = $this->y;
$json['z'] = $this->z;
$json['r'] = $this->r;
$json['t0'] = $this->t0;
$json['t1'] = $this->t1;
$json['dev'] = $this->dev;
return $json;
}
public function toJson()
{
$json = json_encode($this->toArray());
$json = preg_replace('/:"([0-9]*)"/',':$1',$json);
//$json = preg_replace('/\"t0\":\"/', "\"t0\":", $json);
//$json = preg_replace('/\"t1\":\"/', "\"t1\":", $json);
return $json;
}
public static function fromJson(\stdClass $json)
{
return new self(
$json->version,
$json->unit,
$json->x,
$json->y,
$json->z,
$json->r,
$json->t0,
$json->t1,
$json->dev??0,
$json->signature??0,
$json->workflow??0
);
}
public function __toString()
{
$string = "{";
$string .= "v={$this->version}, ";
$string .= "u={$this->unit}, ";
$string .= "x={$this->x}, ";
$string .= "y={$this->y}, ";
$string .= "z={$this->z}, ";
$string .= "r={$this->r}, ";
$string .= "t0={$this->t0}, ";
$string .= "t1={$this->t1}, ";
$string .= "d={$this->dev}";
if($this->version == SmartData::MOBILE_VERSION) // Remove.. Now we have the classs "Tracker" for mobile version
$string .= ",sig={$this->signature}";
$string .= '}';
return $string;
}
}