From 0b66227667ae9b7b1036f2a6b9b51de2ccfc447f Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Wed, 8 Nov 2023 22:15:33 +0800 Subject: [PATCH] :zap: add new std file phi.nas --- std/fg_env.nas | 261 ------------------------------------ std/json.nas | 2 +- std/phi.nas | 145 ++++++++++++++++++++ tools/fgfs_props_getter.nas | 162 ++-------------------- 4 files changed, 158 insertions(+), 412 deletions(-) create mode 100644 std/phi.nas diff --git a/std/fg_env.nas b/std/fg_env.nas index 81bfb92..0479a35 100644 --- a/std/fg_env.nas +++ b/std/fg_env.nas @@ -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 \ No newline at end of file diff --git a/std/json.nas b/std/json.nas index 0c31849..7cf97b9 100644 --- a/std/json.nas +++ b/std/json.nas @@ -299,7 +299,7 @@ var stringify = func(object) { var k = keys(h); var vsize = size(k); for(var i = 0; i=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~" "); + } + } +} + diff --git a/tools/fgfs_props_getter.nas b/tools/fgfs_props_getter.nas index 38f0d4a..7987a8c 100644 --- a/tools/fgfs_props_getter.nas +++ b/tools/fgfs_props_getter.nas @@ -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);