Skip to content
Snippets Groups Projects
Commit 63690b40 authored by Oleksandr Husak's avatar Oleksandr Husak
Browse files

validate messages. Type guards for Object, Position

parent ee575dae
No related branches found
No related tags found
No related merge requests found
......@@ -17,7 +17,7 @@ import {
} from 'ng-apexcharts';
import { MarkerColorMap } from 'src/environments/environment';
import {NotificationType, Object, PositionUpdate} from 'src/app/model/base-model';
import {NotificationType, Object, PositionUpdate, validateTypeObject} from 'src/app/model/base-model';
export type ChartOptions = {
series: ApexAxisChartSeries;
......@@ -73,8 +73,15 @@ export class ChartTimelineComponent implements OnInit {
this.subsPosition = this._mqttService.observe('ipos/client/position').subscribe((message: IMqttMessage) => {
let upd: PositionUpdate = JSON.parse(message.payload.toString())
upd.objects.forEach(obj => this.addNewSeries(obj))
try {
let upd: PositionUpdate = JSON.parse(message.payload.toString())
upd.objects.forEach(obj => {
validateTypeObject(obj)
this.addNewSeries(obj)
});
} catch(e) {
console.log(e)
}
});
}
......
......@@ -6,7 +6,7 @@ import 'leaflet-arrowheads';
import { IMqttMessage, MqttService } from 'ngx-mqtt';
import { environment, MarkerColorMap } from 'src/environments/environment';
import {Position, PositionUpdate, RelativePos, WGS84} from 'src/app/model/base-model';
import {Position, PositionUpdate, RelativePos, WGS84, validateTypePosition, validateTypeObject} from 'src/app/model/base-model';
@Component({
......@@ -31,9 +31,11 @@ export class MapComponent implements OnInit {
this.subsRoot = this._mqttService.observe('ipos/client/root').subscribe((message: IMqttMessage) => {
try {
this.root = JSON.parse(message.payload.toString())
console.log("New root: ", this.root)
this.registerPoint("ROOT", {"position": this.root})
let root = <Position>JSON.parse(message.payload.toString())
validateTypePosition(root)
console.log("New root: ", root)
this.registerPoint("ROOT", {"position": root})
this.root = root
} catch(e) {
console.log(e)
}
......@@ -41,8 +43,12 @@ export class MapComponent implements OnInit {
this.subsPosition = this._mqttService.observe('ipos/client/position').subscribe((message: IMqttMessage) => {
try {
let upd: PositionUpdate = JSON.parse(message.payload.toString())
upd.objects.forEach(obj => this.registerPoint(obj.id, obj));
let upd: PositionUpdate = <PositionUpdate>JSON.parse(message.payload.toString())
upd.objects.forEach(obj => {
validateTypeObject(obj)
this.registerPoint(obj.id, obj)
});
} catch(e) {
console.log(e)
}
......@@ -143,10 +149,10 @@ export class MapComponent implements OnInit {
}
// --- Orientation
if (theta && 'x' in point) {
if ('x' in point) {
let orient: RelativePos = {
"x": point.x + Math.sin(theta) * 3 ?? 3,
"y": point.y + Math.cos(theta) * 3 ?? 3,
"x": point.x + (theta ? Math.sin(theta)*3 : 0),
"y": point.y + (theta ? Math.cos(theta)*3 : 3.5),
"z": point.z
}
let globPointOrient = this.ref2root(orient)
......
import { Component, OnInit, ViewChild } from '@angular/core';
import {PositionUpdate, ZoneDesc} from 'src/app/model/base-model';
import {PositionUpdate, validateTypeObject} from 'src/app/model/base-model';
import { IMqttMessage, MqttService } from 'ngx-mqtt';
import { Subscription } from 'rxjs';
......@@ -35,10 +35,14 @@ export class TableComponent implements OnInit {
// this.testMessages.forEach(upd => this.dataSource.push(...upd.objects))
this.subsPosition = this._mqttService.observe('ipos/client/position').subscribe((message: IMqttMessage) => {
let upd: PositionUpdate = JSON.parse(message.payload.toString())
console.log(upd.objects)
this.dataSource.push(...upd.objects);
this.table?.renderRows();
try {
let upd: PositionUpdate = JSON.parse(message.payload.toString())
upd.objects.forEach(obj => validateTypeObject(obj));
this.dataSource.push(...upd.objects);
this.table?.renderRows();
} catch(e) {
console.log(e)
}
});
}
......
......@@ -71,3 +71,44 @@ interface ExtAttribute {
}
export function validateTypePosition(obj: any) {
if (!isPosition(obj)) {
throw new TypeError("Object is not Position")
}
}
export function validateTypeObject(obj: any) {
if (!isObject(obj)) {
console.log(obj)
throw new TypeError("Unvalid Object: " + Object.keys(obj))
}
}
// --- Type Guards
function isWGS84(obj: any): obj is WGS84 {
return Object.prototype.hasOwnProperty.call(obj, "latitude")
&& Object.prototype.hasOwnProperty.call(obj, "longitude")
}
function isRelativePos(obj: any): obj is RelativePos {
return Object.prototype.hasOwnProperty.call(obj, "x")
&& Object.prototype.hasOwnProperty.call(obj, "y")
}
export function isPosition(obj: any): obj is Position {
return isWGS84(obj.point) || isRelativePos(obj.point)
&& Object.prototype.hasOwnProperty.call(obj, "refSystemId")
}
export function isObject(obj: any): obj is Object {
return "id" in obj
&& "type" in obj
&& "sensorId" in obj
&& "sensorType" in obj
&& "position" in obj
&& isPosition(obj.position)
&& "lastPosUpdate" in obj
&& "zoneDescriptors" in obj
}
\ No newline at end of file
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment