Files

163 lines
3.8 KiB
GDScript

extends Node3D
class_name VehicleNode
var UUID = preload('res://addons/uuid/uuid.gd')
"""
4 | 1 byte | bool | peer provides datetime
5 | 1 byte | bool | peer provides gps
6 | 1 byte | bool | peer provides accelerometer
7 | 1 byte | bool | peer provides gyroscope
8 | 1 byte | bool | peer provides magnetometer
"""
var host_id: String = ''
@export var host: bool = true
var sensor_nodes = {}
var sensor_classes = {
"VEHICLE": [],
"LIDAR_2D": [],
}
var timer: float = 0.
static var timer_1: float = 1.
var altitude_m: float:
get:
return _get_altitude_m()
var speed_kmh: float:
get:
return _get_speed_kmh()
var roll_rad: float:
get:
return _get_roll_rad()
var pitch_rad: float:
get:
return _get_pitch_rad()
var lateral_accel: Vector2:
get:
return _get_lateral_accel()
var heading_rad: float:
get:
return _get_heading_rad()
# Called when the node enters the scene tree for the first time.
func _ready() -> void:
if host:
_load_id()
print('VehicleNode ready')
#var axis_scene = axis_scene_template.instantiate()
#axis_scene.axis_length = 2.
#if not has_node('Axis'):
# add_child(axis_scene)
# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta: float) -> void:
pass
func _physics_process(delta: float) -> void:
pass
func _load_id():
var file_path = "user://host_id.idf"
if not FileAccess.file_exists(file_path):
host_id = _generate_id()
var id_file = FileAccess.open(file_path, FileAccess.WRITE)
id_file.store_line(host_id)
id_file.close()
var id_file = FileAccess.open(file_path, FileAccess.READ)
host_id = id_file.get_line()
func _generate_id():
return UUID.new().as_string()
func _get_altitude_m():
var alt_sum: float = 0
var alt_count: int = 0
for sensor_ip in sensor_classes["VEHICLE"]:
var sensor_alt = sensor_nodes[sensor_ip].altitude_m
if sensor_alt == null:
continue
alt_sum += sensor_alt
alt_count += 1
if alt_count == 0:
return 0
return alt_sum / alt_count
func _get_speed_kmh():
var speed_sum: float = 0
var speed_count: int = 0
for sensor_ip in sensor_classes["VEHICLE"]:
var sensor_speed = sensor_nodes[sensor_ip].speed_kmh
if sensor_speed == null:
continue
speed_sum += sensor_speed
speed_count += 1
if speed_count == 0:
return 0
return speed_sum / speed_count
func _get_roll_rad():
var roll_sum: float = 0
var roll_count: int = 0
for sensor_ip in sensor_classes["VEHICLE"]:
var sensor_roll = sensor_nodes[sensor_ip].roll_rad
if sensor_roll == null:
continue
roll_sum += sensor_roll
roll_count += 1
if roll_count == 0:
return 0
return roll_sum / roll_count
func _get_pitch_rad():
var pitch_sum: float = 0
var pitch_count: int = 0
for sensor_ip in sensor_classes["VEHICLE"]:
var sensor_pitch= sensor_nodes[sensor_ip].pitch_rad
if sensor_pitch == null:
continue
pitch_sum += sensor_pitch
pitch_count += 1
if pitch_count == 0:
return 0
return pitch_sum / pitch_count
func _get_lateral_accel():
var gs_sum: Vector2 = Vector2.ZERO
var gs_count: int = 0
for sensor_ip in sensor_classes["VEHICLE"]:
var sensor_gs = sensor_nodes[sensor_ip].lateral_accel
if sensor_gs == null:
continue
gs_sum += sensor_gs
gs_count += 1
if gs_count == 0:
return Vector2.ZERO
return gs_sum / gs_count
func _get_heading_rad():
var heading_sum: float = 0
var heading_count: int = 0
for sensor_ip in sensor_classes["VEHICLE"]:
var sensor_heading = sensor_nodes[sensor_ip].heading_rad
if sensor_heading == null:
continue
heading_sum += sensor_heading
heading_count += 1
if heading_count == 0:
return 0
return heading_sum / heading_count
func add_sensor_node(sensor_node: BaseSensorNode):
sensor_nodes[sensor_node.ip_address] = sensor_node
if sensor_node.sensor_class not in sensor_classes:
return
sensor_classes[sensor_node.sensor_class].append(sensor_node.ip_address)