add new std file phi.nas

This commit is contained in:
ValKmjolnir 2023-11-08 22:15:33 +08:00
parent fee646965e
commit 0b66227667
4 changed files with 158 additions and 412 deletions

View File

@ -564,264 +564,3 @@ foreach(var a;runtime.argv())
if(contains(fg_env_cli,a)){
fg_env_cli[a].f();
}
# related doc: https://sourceforge.net/p/flightgear/fgdata/ci/next/tree/Docs/README.properties
# ================================================================================
# CONTROLS
# ================================================================================
# Flight Controls
# ---------------
# /controls/flight/aileron
# /controls/flight/aileron-trim
# /controls/flight/elevator
# /controls/flight/elevator-trim
# /controls/flight/rudder
# /controls/flight/rudder-trim
# /controls/flight/flaps
# /controls/flight/slats
# /controls/flight/BLC // Boundary Layer Control
# /controls/flight/spoilers
# /controls/flight/speedbrake
# /controls/flight/wing-sweep
# /controls/flight/wing-fold
# /controls/flight/drag-chute
# Engines
# -------
# /controls/engines/throttle_idle
# /controls/engines/engine[%d]/throttle
# /controls/engines/engine[%d]/starter
# /controls/engines/engine[%d]/fuel-pump
# /controls/engines/engine[%d]/fire-switch
# /controls/engines/engine[%d]/fire-bottle-discharge
# /controls/engines/engine[%d]/cutoff
# /controls/engines/engine[%d]/mixture
# /controls/engines/engine[%d]/propeller-pitch
# /controls/engines/engine[%d]/magnetos
# /controls/engines/engine[%d]/boost
# /controls/engines/engine[%d]/WEP
# /controls/engines/engine[%d]/cowl-flaps-norm
# /controls/engines/engine[%d]/feather
# /controls/engines/engine[%d]/ignition
# /controls/engines/engine[%d]/augmentation
# /controls/engines/engine[%d]/afterburner
# /controls/engines/engine[%d]/reverser
# /controls/engines/engine[%d]/water-injection
# /controls/engines/engine[%d]/condition
# Fuel
# ----
# /controls/fuel/dump-valve
# /controls/fuel/tank[%d]/fuel_selector
# /controls/fuel/tank[%d]/to_engine
# /controls/fuel/tank[%d]/to_tank
# /controls/fuel/tank[%d]/boost-pump[%d]
# /consumables/fuel/tank[%d]/level-lbs
# /consumables/fuel/tank[%d]/level-gal_us
# /consumables/fuel/tank[%d]/capacity-gal_us
# /consumables/fuel/tank[%d]/density-ppg
# /consumables/fuel/total-fuel-lbs
# /consumables/fuel/total-gal_us
# Gear
# ----
# /controls/gear/brake-left
# /controls/gear/brake-right
# /controls/gear/brake-parking
# /controls/gear/steering
# /controls/gear/gear-down
# /controls/gear/antiskid
# /controls/gear/tailhook
# /controls/gear/tailwheel-lock
# /controls/gear/wheel[%d]/alternate-extension
# Anti-Ice
# --------
# /controls/anti-ice/wing-heat
# /controls/anti-ice/pitot-heat
# /controls/anti-ice/wiper
# /controls/anti-ice/window-heat
# /controls/anti-ice/engine[%d]/carb-heat
# /controls/anti-ice/engine[%d]/inlet-heat
# Hydraulics
# ----------
# /controls/hydraulic/system[%d]/engine-pump
# /controls/hydraulic/system[%d]/electric-pump
# Electric
# --------
# /controls/electric/battery-switch
# /controls/electric/external-power
# /controls/electric/APU-generator
# /controls/electric/engine[%d]/generator
# /controls/electric/engine[%d]/bus-tie
# Pneumatic
# ---------
# /controls/pneumatic/APU-bleed
# /controls/pneumatic/engine[%d]/bleed
# Pressurization
# --------------
# /controls/pressurization/mode
# /controls/pressurization/dump
# /controls/pressurization/outflow-valve
# /controls/pressurization/pack[%d]/pack-on
# Lights
# ------
# /controls/lighting/landing-lights
# /controls/lighting/turn-off-lights
# /controls/lighting/formation-lights
# /controls/lighting/taxi-light
# /controls/lighting/logo-lights
# /controls/lighting/nav-lights
# /controls/lighting/beacon
# /controls/lighting/strobe
# /controls/lighting/panel-norm
# /controls/lighting/instruments-norm
# /controls/lighting/dome-norm
# Armament
# --------
# /controls/armament/master-arm
# /controls/armament/station-select
# /controls/armament/release-all
# /controls/armament/station[%d]/stick-size
# /controls/armament/station[%d]/release-stick
# /controls/armament/station[%d]/release-all
# /controls/armament/station[%d]/jettison-all
# Seat
# ----
# /controls/seat/vertical-adjust
# /controls/seat/fore-aft-adjust
# /controls/seat/cmd_selector_valve
# /controls/seat/eject[%d]/initiate
# /controls/seat/eject[%d]/status
# APU
# ---
# /controls/APU/off-start-run
# /controls/APU/fire-switch
# Autoflight
# ----------
# /controls/autoflight/autopilot[%d]/engage
# /controls/autoflight/autothrottle-arm
# /controls/autoflight/autothrottle-engage
# /controls/autoflight/heading-select
# /controls/autoflight/altitude-select
# /controls/autoflight/bank-angle-select
# /controls/autoflight/vertical-speed-select
# /controls/autoflight/speed-select
# /controls/autoflight/mach-select
# /controls/autoflight/vertical-mode
# /controls/autoflight/lateral-mode
# ================================================================================
# FDM (Aircraft settings)
# ================================================================================
# Position
# ---------------
# /position/latitude-deg
# /position/longitude-deg
# /position/altitude-ft
# Orientation
# -----------
# /orientation/roll-deg
# /orientation/pitch-deg
# /orientation/heading-deg
# /orientation/roll-rate-degps
# /orientation/pitch-rate-degps
# /orientation/yaw-rate-degps
# /orientation/side-slip-rad
# /orientation/side-slip-deg
# /orientation/alpha-deg
# Velocities
# ----------
# /velocities/airspeed-kt
# /velocities/mach
# /velocities/speed-north-fps
# /velocities/speed-east-fps
# /velocities/speed-down-fps
# /velocities/uBody-fps
# /velocities/vBody-fps
# /velocities/wBody-fps
# /velocities/vertical-speed-fps
# /velocities/glideslope
# Acceleration
# ------------
# /accelerations/nlf
# /accelerations/ned/north-accel-fps_sec
# /accelerations/ned/east-accel-fps_sec
# /accelerations/ned/down-accel-fps_sec
# /accelerations/pilot/x-accel-fps_sec
# /accelerations/pilot/y-accel-fps_sec
# /accelerations/pilot/z-accel-fps_sec
# Engines
# -------
# common:
# /engines/engine[%d]/fuel-flow-gph
# /engines/engine[%d]/fuel-flow_pph
# /engines/engine[%d]/thrust_lb
# /engines/engine[%d]/running
# /engines/engine[%d]/starter
# /engines/engine[%d]/cranking
# piston:
# /engines/engine[%d]/mp-osi
# /engines/engine[%d]/egt-degf
# /engines/engine[%d]/oil-temperature-degf
# /engines/engine[%d]/oil-pressure-psi
# /engines/engine[%d]/cht-degf
# /engines/engine[%d]/rpm
# turbine:
# /engines/engine[%d]/n1
# /engines/engine[%d]/n2
# /engines/engine[%d]/epr
# /engines/engine[%d]/augmentation
# /engines/engine[%d]/water-injection
# /engines/engine[%d]/ignition
# /engines/engine[%d]/nozzle-pos-norm
# /engines/engine[%d]/inlet-pos-norm
# /engines/engine[%d]/reversed
# /engines/engine[%d]/cutoff
# propeller:
# /engines/engine[%d]/rpm
# /engines/engine[%d]/pitch
# /engines/engine[%d]/torque
# ================================================================================
# LIGHT
# ================================================================================
# /sim/time/sun-angle-rad
# /rendering/scene/ambient/red
# /rendering/scene/ambient/ggreen
# /rendering/scene/ambient/blue
# /rendering/scene/diffuse/red
# /rendering/scene/diffuse/green
# /rendering/scene/diffuse/blue
# /rendering/scene/specular/red
# /rendering/scene/specular/green
# /rendering/scene/specular/blue

View File

@ -299,7 +299,7 @@ var stringify = func(object) {
var k = keys(h);
var vsize = size(k);
for(var i = 0; i<vsize; i += 1) {
s ~= k[i]~":";
s ~= "\""~k[i]~"\":";
gen(h[k[i]]);
if (i!=vsize-1) {
s ~= ",";

145
std/phi.nas Normal file
View File

@ -0,0 +1,145 @@
# used to get property tree from fgfs by httpd
# use --httpd=5500 to start fgfs
# and use this script to get property tree
# 2023/11/06 ValKmjolnir
use module.libsock;
use std.json;
var _raw_str = func(s) {
var v = split("", s);
var res = "";
foreach(var i; v) {
if (i=="\r") {
res ~= "\\r";
continue;
}
if (i=="\n") {
res ~= "\\n";
continue;
}
res ~= i;
}
return res;
}
var _get_time = func() {
return "["~os.time()~"]";
}
var _connect = func(hostname, port) {
var socket = libsock.socket;
var sd = socket.socket(
socket.AF_INET,
socket.SOCK_STREAM,
socket.IPPROTO_TCP
);
var ip_info = hostname~":"~port;
while((var err = socket.connect(sd, hostname, port))==socket.SOCKET_ERROR) {
println(_get_time(), " failed to connect ", ip_info, ": ", socket.errno());
unix.sleep(1);
}
println(_get_time(), " connect to ", ip_info, " succeeded");
return sd;
}
var new = func(hostname, port) {
var socket = libsock.socket;
var sd = _connect(hostname, port);
var getprop = func(path) {
if (size(path)==0 or path[0]!='/'[0]) {
println("node \"", path, "\" not found, invalid path");
return {path: path};
}
# GET header
var header = "GET /json"~path~" HTTP/1.1\r\n\r\n";
var res = socket.send(sd, header);
# get message head 1024
var message = socket.recv(sd, 1024);
if (find("404 Not Found", message.str)>=0) {
println("node \"", path, "\" not found, get 404 response");
return {path: path};
}
# get total message
var total_source = message.str;
# 0\r\n\r\n is the tail of chunked http info
while(find("0\r\n\r\n", total_source)<0) {
message = socket.recv(sd, 1024);
total_source ~= message.str;
}
# get json in this message
var begin_position = find("{", total_source);
var end_position = find("0\r\n\r\n", total_source);
var length = end_position-begin_position;
if (begin_position<0) {
println("node \"", path, "\" not found, invalid begin token");
return {path: path};
}
if (length<0) {
println("node \"", path, "\" not found, invalid end token");
return {path: path};
}
var data = substr(total_source, begin_position, length);
# parse this json and return
var props = json.parse(data);
if (json.get_error()) {
println("encounter error when parsing \"", path, "\"");
logprint(LOG_DEBUG, _raw_str(data));
return {path: path};
}
# empty prop node is not allowed...
if (size(props)==0) {
println("node \"", path, "\" not found, empty tree node");
}
return props;
}
var setprop = func(path, data) {
if (size(path)==0 or path[0]!='/'[0]) {
println("node \"", path, "\" not found, invalid path");
return {path: path};
}
# POST header
var header = "POST /json"~path~" HTTP/1.1\r\n\r\n";
# generate value
header ~= "{\"value\":\""~data~"\"}\r\n\r\n";
var res = socket.send(sd, header);
var message = socket.recv(sd, 1024);
}
return {
getprop: getprop,
setprop: setprop
};
}
var dump = func(tree, indent = "") {
if (size(tree)==0) {
return;
}
println(indent, "-------------------");
var tree_keys = keys(tree);
sort(tree_keys, func(a,b) {return cmp(a, b)<0;});
foreach(var key; tree_keys) {
if (key == "children") {
continue;
}
println(indent, key, " : \"", tree[key], "\"");
}
println(indent, "-------------------");
if (contains(tree, "children")) {
foreach(var i; tree.children) {
dump(i, indent~" ");
}
}
}

View File

@ -1,146 +1,4 @@
# used to get property tree from fgfs by httpd
# use --httpd=5500 to start fgfs
# and use this script to get property tree
# 2023/11/06 ValKmjolnir
use module.libsock;
use std.json;
var connection = {};
connection.new = func(hostname, port) {
var socket = libsock.socket;
var sd = socket.socket(
socket.AF_INET,
socket.SOCK_STREAM,
socket.IPPROTO_TCP
);
while((var err = socket.connect(sd, hostname, port))==socket.SOCKET_ERROR) {
println(
"[", os.time(), "] connect to ",
hostname, ":", port, " failed: ",
socket.errno()
);
unix.sleep(1);
}
println("[", os.time(), "] connect to ", hostname, ":", port, " succeeded");
var raw = func(s) {
var v = split("", s);
var res = "";
foreach(var i; v) {
if (i=="\r") {
res ~= "\\r";
continue;
}
if (i=="\n") {
res ~= "\\n\n";
continue;
}
res ~= i;
}
return res;
}
var getprop = func(path) {
# GET header
var header = "GET /json"~path~" HTTP/1.1\n\r\n";
var res = socket.send(sd, header);
# get message head 1024
var message = socket.recv(sd, 1024);
var head_vector = split("\r\n", message.str);
if (size(head_vector)<11) {
println("getprop: node \"", path, "\" not found, invalid header");
logprint(LOG_DEBUG, raw(message.str));
return {path: path};
}
var message_total_size = num("0x"~head_vector[10]);
# get total message
var total_source = message.str;
var total_size = message.size;
while(total_size<=message_total_size) {
message = socket.recv(sd, 1024);
total_source ~= message.str;
total_size += message.size;
}
# if not get end of the message, recv one more time
if (find("0\r\n\r\n", total_source)<0) {
message = socket.recv(sd, 1024);
total_source ~= message.str;
total_size += message.size;
}
# get json in this message
var begin_position = find("{", total_source);
if (begin_position<0) {
println("getprop: node \"", path, "\" not found, invalid begin token");
return {path: path};
}
var end_position = find("0\r\n\r\n", total_source);
var length = end_position-begin_position;
if (length<0) {
println("getprop: node \"", path, "\" not found, invalid end token");
return {path: path};
}
var data = substr(total_source, begin_position, length);
# parse this json and return
var props = json.parse(data);
if (json.get_error()) {
println("getprop: encounter error when parsing \"", path, "\"");
logprint(LOG_DEBUG, raw(data));
return {path: path};
}
# empty prop node is not allowed...
if (size(props)==0) {
println("getprop: node \"", path, "\" not found, empty tree node");
}
return props;
}
var setprop = func(path, data) {
# POST header
var header = "POST /json"~path~" HTTP/1.1\n\n";
# generate value
header ~= "{\"value\":\""~data~"\"}\n\r\n";
var res = socket.send(sd, header);
var message = socket.recv(sd, 1024);
}
return {
getprop: getprop,
setprop: setprop
};
}
var dump = func(tree, indent = "") {
if (size(tree)==0) {
return;
}
println(indent, "-------------------");
var tree_keys = keys(tree);
sort(tree_keys, func(a,b) {return cmp(a, b)<0;});
foreach(var key; tree_keys) {
if (key == "children") {
continue;
}
println(indent, key, " : \"", tree[key], "\"");
}
println(indent, "-------------------");
if (contains(tree, "children")) {
println(indent, "children :");
foreach(var i; tree.children) {
dump(i, indent~" ");
}
}
}
use std.phi;
var tips = func() {
println("usage:");
@ -158,24 +16,28 @@ if (size(arg)>2) {
exit(-1);
}
var connect = connection.new(arg[0], num(arg[1]));
var connect = phi.new(arg[0], num(arg[1]));
var count = 0;
var recursive_get_prop = func(path = "/") {
count += 1;
if (math.mod(count, 100)==0) {
if (math.mod(count, 50)==0) {
println("get ", count," nodes, now: \"", path, "\"");
}
var props = connect.getprop(path);
var tree = {};
tree.path = props.path;
foreach(var key; keys(props)) {
if (key=="children") {
tree.children = [];
continue;
}
tree[key] = props[key];
}
if (!contains(props, "children")) {
return tree;
}
tree.children = [];
foreach(var child; props.children) {
var node = {};
node = recursive_get_prop(child.path);
var node = recursive_get_prop(child.path);
append(tree.children, node);
}
return tree;
@ -183,4 +45,4 @@ var recursive_get_prop = func(path = "/") {
# takes about 5 min to get whole tree
var props = recursive_get_prop("/");
dump(props);
phi.dump(props);