@openhps/core
Version:
Open Hybrid Positioning System - Core component
103 lines • 3.67 kB
JavaScript
import { __decorate, __metadata } from "tslib";
import { TimeService } from '../../service/TimeService';
import { Unit } from '../../utils';
import { DataSerializer } from '../DataSerializer';
import { SerializableMember, SerializableObject, NumberType } from '../decorators';
import { Accuracy } from '../values/Accuracy';
import { Accuracy1D } from '../values/Accuracy1D';
/**
* Relative position to another reference object or space.
* @category Position
*/
let RelativePosition = class RelativePosition {
/**
* Get the position probability
* @returns {number} Probability between 0 and 1
*/
get probability() {
if (!this._probability) {
return 1 / this.accuracy.valueOf();
}
return this._probability;
}
set probability(value) {
if (value > 1 || value < 0) {
throw new Error(`${this.constructor.name} should be between 0 and 1.`);
}
this._probability = value;
}
/**
* Position accuracy
* @returns {Accuracy} Position accuracy
*/
get accuracy() {
if (!this._accuracy) {
this._accuracy = new Accuracy1D(1, this._defaultUnit);
}
return this._accuracy;
}
set accuracy(value) {
if (!value) {
throw new Error(`Accuracy can not be undefined!`);
}
this._accuracy = value;
}
constructor(referenceObject, value, unit) {
/**
* Position recording timestamp
*/
this.timestamp = TimeService.now();
if (referenceObject !== undefined) {
if (referenceObject instanceof String || typeof referenceObject === 'string') {
this.referenceObjectUID = referenceObject;
} else {
this.referenceObjectType = referenceObject.constructor.name;
this.referenceObjectUID = referenceObject.uid;
}
}
this._defaultUnit = unit || Unit.UNKNOWN;
this.unit = unit;
this.referenceValue = value;
}
/**
* Set the accuracy of the absolute position
* @param {number | Accuracy} accuracy Accuracy object or number
* @param {Unit} [unit] Optional unit
* @returns {RelativePosition} instance
*/
setAccuracy(accuracy, unit) {
if (typeof accuracy === 'number') {
this.accuracy = new Accuracy1D(accuracy, unit || this._defaultUnit);
} else {
this.accuracy = accuracy;
}
return this;
}
equals(position) {
return this.timestamp === position.timestamp;
}
/**
* Clone the position
* @returns {RelativePosition} Cloned relative position
*/
clone() {
return DataSerializer.clone(this);
}
};
__decorate([SerializableMember({
index: true,
numberType: NumberType.LONG
}), __metadata("design:type", Number)], RelativePosition.prototype, "timestamp", void 0);
__decorate([SerializableMember(), __metadata("design:type", String)], RelativePosition.prototype, "referenceObjectUID", void 0);
__decorate([SerializableMember(), __metadata("design:type", String)], RelativePosition.prototype, "referenceObjectType", void 0);
__decorate([SerializableMember(), __metadata("design:type", Object)], RelativePosition.prototype, "referenceValue", void 0);
__decorate([SerializableMember({
name: 'accuracy'
}), __metadata("design:type", Accuracy)], RelativePosition.prototype, "_accuracy", void 0);
__decorate([SerializableMember({
name: 'probability',
numberType: NumberType.DECIMAL
}), __metadata("design:type", Number)], RelativePosition.prototype, "_probability", void 0);
__decorate([SerializableMember(() => Unit), __metadata("design:type", Object)], RelativePosition.prototype, "unit", void 0);
RelativePosition = __decorate([SerializableObject(), __metadata("design:paramtypes", [Object, Object, Object])], RelativePosition);
export { RelativePosition };