mirror of
https://github.com/FoggedLens/deflock-app.git
synced 2026-02-12 16:52:51 +00:00
264 lines
8.0 KiB
Dart
264 lines
8.0 KiB
Dart
import 'package:uuid/uuid.dart';
|
|
|
|
/// A bundle of preset OSM tags that describe a particular surveillance node model/type.
|
|
class NodeProfile {
|
|
final String id;
|
|
final String name;
|
|
final Map<String, String> tags;
|
|
final bool builtin;
|
|
final bool requiresDirection;
|
|
final bool submittable;
|
|
final bool editable;
|
|
final double? fov; // Field-of-view in degrees (null means use dev_config default)
|
|
|
|
NodeProfile({
|
|
required this.id,
|
|
required this.name,
|
|
required this.tags,
|
|
this.builtin = false,
|
|
this.requiresDirection = true,
|
|
this.submittable = true,
|
|
this.editable = true,
|
|
this.fov,
|
|
});
|
|
|
|
/// Get all built-in default node profiles
|
|
static List<NodeProfile> getDefaults() => [
|
|
NodeProfile(
|
|
id: 'builtin-generic-alpr',
|
|
name: 'Generic ALPR',
|
|
tags: const {
|
|
'man_made': 'surveillance',
|
|
'surveillance:type': 'ALPR',
|
|
},
|
|
builtin: true,
|
|
requiresDirection: true,
|
|
submittable: false,
|
|
editable: false,
|
|
),
|
|
NodeProfile(
|
|
id: 'builtin-flock',
|
|
name: 'Flock',
|
|
tags: const {
|
|
'man_made': 'surveillance',
|
|
'surveillance': 'public',
|
|
'surveillance:type': 'ALPR',
|
|
'surveillance:zone': 'traffic',
|
|
'camera:type': 'fixed',
|
|
'manufacturer': 'Flock Safety',
|
|
'manufacturer:wikidata': 'Q108485435',
|
|
},
|
|
builtin: true,
|
|
requiresDirection: true,
|
|
submittable: true,
|
|
editable: true,
|
|
fov: 45.0, // Flock cameras typically have narrow FOV
|
|
),
|
|
NodeProfile(
|
|
id: 'builtin-motorola',
|
|
name: 'Motorola/Vigilant',
|
|
tags: const {
|
|
'man_made': 'surveillance',
|
|
'surveillance': 'public',
|
|
'surveillance:type': 'ALPR',
|
|
'surveillance:zone': 'traffic',
|
|
'camera:type': 'fixed',
|
|
'manufacturer': 'Motorola Solutions',
|
|
'manufacturer:wikidata': 'Q634815',
|
|
},
|
|
builtin: true,
|
|
requiresDirection: true,
|
|
submittable: true,
|
|
editable: true,
|
|
fov: 60.0, // Motorola cameras typically have moderate FOV
|
|
),
|
|
NodeProfile(
|
|
id: 'builtin-genetec',
|
|
name: 'Genetec',
|
|
tags: const {
|
|
'man_made': 'surveillance',
|
|
'surveillance': 'public',
|
|
'surveillance:type': 'ALPR',
|
|
'surveillance:zone': 'traffic',
|
|
'camera:type': 'fixed',
|
|
'manufacturer': 'Genetec',
|
|
'manufacturer:wikidata': 'Q30295174',
|
|
},
|
|
builtin: true,
|
|
requiresDirection: true,
|
|
submittable: true,
|
|
editable: true,
|
|
fov: 50.0, // Genetec cameras typically have moderate FOV
|
|
),
|
|
NodeProfile(
|
|
id: 'builtin-leonardo',
|
|
name: 'Leonardo/ELSAG',
|
|
tags: const {
|
|
'man_made': 'surveillance',
|
|
'surveillance': 'public',
|
|
'surveillance:type': 'ALPR',
|
|
'surveillance:zone': 'traffic',
|
|
'camera:type': 'fixed',
|
|
'manufacturer': 'Leonardo',
|
|
'manufacturer:wikidata': 'Q910379',
|
|
},
|
|
builtin: true,
|
|
requiresDirection: true,
|
|
submittable: true,
|
|
editable: true,
|
|
fov: 55.0, // Leonardo cameras typically have moderate FOV
|
|
),
|
|
NodeProfile(
|
|
id: 'builtin-neology',
|
|
name: 'Neology',
|
|
tags: const {
|
|
'man_made': 'surveillance',
|
|
'surveillance': 'public',
|
|
'surveillance:type': 'ALPR',
|
|
'surveillance:zone': 'traffic',
|
|
'camera:type': 'fixed',
|
|
'manufacturer': 'Neology, Inc.',
|
|
},
|
|
builtin: true,
|
|
requiresDirection: true,
|
|
submittable: true,
|
|
editable: true,
|
|
),
|
|
NodeProfile(
|
|
id: 'builtin-rekor',
|
|
name: 'Rekor',
|
|
tags: const {
|
|
'man_made': 'surveillance',
|
|
'surveillance': 'public',
|
|
'surveillance:type': 'ALPR',
|
|
'surveillance:zone': 'traffic',
|
|
'camera:type': 'fixed',
|
|
'manufacturer': 'Rekor',
|
|
},
|
|
builtin: true,
|
|
requiresDirection: true,
|
|
submittable: true,
|
|
editable: true,
|
|
),
|
|
NodeProfile(
|
|
id: 'builtin-axis',
|
|
name: 'Axis Communications',
|
|
tags: const {
|
|
'man_made': 'surveillance',
|
|
'surveillance': 'public',
|
|
'surveillance:type': 'ALPR',
|
|
'surveillance:zone': 'traffic',
|
|
'camera:type': 'fixed',
|
|
'manufacturer': 'Axis Communications',
|
|
'manufacturer:wikidata': 'Q2347731',
|
|
},
|
|
builtin: true,
|
|
requiresDirection: true,
|
|
submittable: true,
|
|
editable: true,
|
|
fov: 90.0, // Axis cameras can have wider FOV
|
|
),
|
|
NodeProfile(
|
|
id: 'builtin-generic-gunshot',
|
|
name: 'Generic Gunshot Detector',
|
|
tags: const {
|
|
'man_made': 'surveillance',
|
|
'surveillance:type': 'gunshot_detector',
|
|
},
|
|
builtin: true,
|
|
requiresDirection: false,
|
|
submittable: false,
|
|
editable: false,
|
|
),
|
|
NodeProfile(
|
|
id: 'builtin-shotspotter',
|
|
name: 'ShotSpotter',
|
|
tags: const {
|
|
'man_made': 'surveillance',
|
|
'surveillance': 'public',
|
|
'surveillance:type': 'gunshot_detector',
|
|
'surveillance:brand': 'ShotSpotter',
|
|
'surveillance:brand:wikidata': 'Q107740188',
|
|
},
|
|
builtin: true,
|
|
requiresDirection: false,
|
|
submittable: true,
|
|
editable: true,
|
|
),
|
|
NodeProfile(
|
|
id: 'builtin-flock-raven',
|
|
name: 'Flock Raven',
|
|
tags: const {
|
|
'man_made': 'surveillance',
|
|
'surveillance': 'public',
|
|
'surveillance:type': 'gunshot_detector',
|
|
'brand': 'Flock Safety',
|
|
'brand:wikidata': 'Q108485435',
|
|
},
|
|
builtin: true,
|
|
requiresDirection: false,
|
|
submittable: true,
|
|
editable: true,
|
|
),
|
|
];
|
|
|
|
|
|
|
|
/// Returns true if this profile can be used for submissions
|
|
bool get isSubmittable => submittable;
|
|
|
|
NodeProfile copyWith({
|
|
String? id,
|
|
String? name,
|
|
Map<String, String>? tags,
|
|
bool? builtin,
|
|
bool? requiresDirection,
|
|
bool? submittable,
|
|
bool? editable,
|
|
double? fov,
|
|
}) =>
|
|
NodeProfile(
|
|
id: id ?? this.id,
|
|
name: name ?? this.name,
|
|
tags: tags ?? this.tags,
|
|
builtin: builtin ?? this.builtin,
|
|
requiresDirection: requiresDirection ?? this.requiresDirection,
|
|
submittable: submittable ?? this.submittable,
|
|
editable: editable ?? this.editable,
|
|
fov: fov ?? this.fov,
|
|
);
|
|
|
|
Map<String, dynamic> toJson() => {
|
|
'id': id,
|
|
'name': name,
|
|
'tags': tags,
|
|
'builtin': builtin,
|
|
'requiresDirection': requiresDirection,
|
|
'submittable': submittable,
|
|
'editable': editable,
|
|
'fov': fov,
|
|
};
|
|
|
|
factory NodeProfile.fromJson(Map<String, dynamic> j) => NodeProfile(
|
|
id: j['id'],
|
|
name: j['name'],
|
|
tags: Map<String, String>.from(j['tags']),
|
|
builtin: j['builtin'] ?? false,
|
|
requiresDirection: j['requiresDirection'] ?? true, // Default to true for backward compatibility
|
|
submittable: j['submittable'] ?? true, // Default to true for backward compatibility
|
|
editable: j['editable'] ?? true, // Default to true for backward compatibility
|
|
fov: j['fov']?.toDouble(), // Can be null for backward compatibility
|
|
);
|
|
|
|
@override
|
|
bool operator ==(Object other) =>
|
|
identical(this, other) ||
|
|
other is NodeProfile &&
|
|
runtimeType == other.runtimeType &&
|
|
id == other.id;
|
|
|
|
@override
|
|
int get hashCode => id.hashCode;
|
|
}
|
|
|