diff --git a/src/app/components/chart-timeline/chart-timeline.component.ts b/src/app/components/chart-timeline/chart-timeline.component.ts index 8398863bada94f0089ea90be10dd1c2cbf22fa7a..57cab727fe5128ad8e9d2027456def7d49bf4c52 100644 --- a/src/app/components/chart-timeline/chart-timeline.component.ts +++ b/src/app/components/chart-timeline/chart-timeline.component.ts @@ -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) + } }); } diff --git a/src/app/components/map/map.component.ts b/src/app/components/map/map.component.ts index 185aea6df097cc105a1e54d8ae65322a58729c1b..01c3e68474b4a1fd584c420c7f3cc0b1eef68d5b 100644 --- a/src/app/components/map/map.component.ts +++ b/src/app/components/map/map.component.ts @@ -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) diff --git a/src/app/components/table/table.component.ts b/src/app/components/table/table.component.ts index 9d71cab3dfff2ced23af4134939bd78c30851874..b0b48449d226fc09eb862a217ecfada5827a5208 100644 --- a/src/app/components/table/table.component.ts +++ b/src/app/components/table/table.component.ts @@ -1,5 +1,5 @@ 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) + } }); } diff --git a/src/app/model/base-model.ts b/src/app/model/base-model.ts index 17bd669c56a56581a7d86ca997a5bbc4d9dd565c..681dbd7c95fc5098931087ceb376ba75bd009cc7 100644 --- a/src/app/model/base-model.ts +++ b/src/app/model/base-model.ts @@ -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