fnd_screen (1).nas 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. # ==============================================================================
  2. # Original Boeing 747-400 pfd by Gijs de Rooy
  3. # Modified for 737-800 by Michael Soitanen
  4. # Modified for EC145 by litzi
  5. # ==============================================================================
  6. fnd_display = canvas.new({
  7. "name": "FND",
  8. "size": [1024, 1024],
  9. "view": [1050, 1000],
  10. "mipmapping": 1
  11. });
  12. var group = fnd_display.createGroup();
  13. fnd_canvas = canvas_MFD.new(group, helionixpath ~ "svg/fnd.svg");
  14. # alt tape elements animation
  15. # move the thousand and hundret numerals, use "fast" option for labels
  16. # ============================
  17. fnd_canvas.add_trans_grp(["radarAlttape", "aglBug"], "y-shift", {"sensor": adc.agllut });
  18. fnd_canvas.add_trans("aglBug", "y-shift", {"function": func {return -adc.ralt_lut.get( getprop("/autopilot/settings/target-agl-ft") );} });
  19. fnd_canvas.add_trans("Alt_Group", "y-shift", {"sensor": adc.alt, "scale": ALTFACTOR, "mod":100});
  20. fnd_canvas.add_trans("altBug", "y-shift", {"sensor": Sensor.new({"prop": "/autopilot/settings/target-altitude-ft"}) , "scale": -ALTFACTOR});
  21. fnd_canvas.add_text( "altNum-4", { "function": func altTs(-4), "disable_listener": FAST});
  22. fnd_canvas.add_text( "altNum-3", { "function": func altTs(-3), "disable_listener": FAST});
  23. fnd_canvas.add_text( "altNum-2", { "function": func altTs(-2), "disable_listener": FAST});
  24. fnd_canvas.add_text( "altNum-1", { "function": func altTs(-1), "disable_listener": FAST});
  25. fnd_canvas.add_text( "altNum0", { "function": func altTs(0), "disable_listener": FAST});
  26. fnd_canvas.add_text( "altNum1", { "function": func altTs(1), "disable_listener": FAST});
  27. fnd_canvas.add_text( "altNum2", { "function": func altTs(2), "disable_listener": FAST});
  28. fnd_canvas.add_text( "altNum3", { "function": func altTs(3), "disable_listener": FAST});
  29. fnd_canvas.add_text( "altNum4", { "function": func altTs(4), "disable_listener": FAST});
  30. fnd_canvas.add_text( "altNum5", { "function": func altTs(5), "disable_listener": FAST});
  31. fnd_canvas.add_text( "Hnum-4", { "function": func altHs(-4), "disable_listener": FAST});
  32. fnd_canvas.add_text( "Hnum-3", { "function": func altHs(-3), "disable_listener": FAST});
  33. fnd_canvas.add_text( "Hnum-2", { "function": func altHs(-2), "disable_listener": FAST});
  34. fnd_canvas.add_text( "Hnum-1", { "function": func altHs(-1), "disable_listener": FAST});
  35. fnd_canvas.add_text( "Hnum0", { "function": func altHs(0), "disable_listener": FAST});
  36. fnd_canvas.add_text( "Hnum1", { "function": func altHs(1), "disable_listener": FAST});
  37. fnd_canvas.add_text( "Hnum2", { "function": func altHs(2), "disable_listener": FAST});
  38. fnd_canvas.add_text( "Hnum3", { "function": func altHs(3), "disable_listener": FAST});
  39. fnd_canvas.add_text( "Hnum4", { "function": func altHs(4), "disable_listener": FAST});
  40. fnd_canvas.add_text( "Hnum5", { "function": func altHs(5), "disable_listener": FAST});
  41. # make room to the left of the two-digit wide alt labels
  42. # ============================
  43. fnd_canvas.add_trans( "Hnum-4", "x-shift", {"function": func altMove(-4), "delta": SHIFT_THRES, "disable_listener": FAST});
  44. fnd_canvas.add_trans( "Hnum-3", "x-shift", {"function": func altMove(-3), "delta": SHIFT_THRES, "disable_listener": FAST});
  45. fnd_canvas.add_trans( "Hnum-2", "x-shift", {"function": func altMove(-2), "delta": SHIFT_THRES, "disable_listener": FAST});
  46. fnd_canvas.add_trans( "Hnum-1", "x-shift", {"function": func altMove(-1), "delta": SHIFT_THRES, "disable_listener": FAST});
  47. fnd_canvas.add_trans( "Hnum0", "x-shift", {"function": func altMove(0), "delta": SHIFT_THRES, "disable_listener": FAST});
  48. fnd_canvas.add_trans( "Hnum1", "x-shift", {"function": func altMove(1), "delta": SHIFT_THRES, "disable_listener": FAST});
  49. fnd_canvas.add_trans( "Hnum2", "x-shift", {"function": func altMove(2), "delta": SHIFT_THRES, "disable_listener": FAST});
  50. fnd_canvas.add_trans( "Hnum3", "x-shift", {"function": func altMove(3), "delta": SHIFT_THRES, "disable_listener": FAST});
  51. fnd_canvas.add_trans( "Hnum4", "x-shift", {"function": func altMove(4), "delta": SHIFT_THRES, "disable_listener": FAST});
  52. fnd_canvas.add_trans( "Hnum5", "x-shift", {"function": func altMove(5), "delta": SHIFT_THRES, "disable_listener": FAST});
  53. fnd_canvas.add_trans("altBack", "y-shift", {"sensor": adc.agl, "scale": 130/280 , "max":280, "min":-280 });
  54. # move speed and fli tapes, animate ai elements
  55. # ============================
  56. fnd_canvas.add_trans("speedtape", "y-shift", {"sensor": adc.ias, "scale": 3.19, "max": 350 });
  57. fnd_canvas.add_trans("iasBug", "y-shift", {"sensor": adc.ias, "scale": 3.19 });
  58. fnd_canvas.add_trans("iasBug", "y-shift", {"sensor": Sensor.new({"prop": "/autopilot/settings/target-speed-kt"}), "scale": -3.19 });
  59. fnd_canvas.add_trans("flitape", "y-shift", {"sensor": adc.fli, "scale": 90.3, "offset": 0, "max": 10, "min": 0 });
  60. fnd_canvas.add_trans("fli_sync", "y-shift", {"sensor": Sensor.new({"prop": "instrumentation/efis/fnd/fli-sync"}), "scale": -90.3, "offset": 0, "max": 10, "min": -10, "delta": SHIFT_THRES });
  61. fnd_canvas.add_trans("fli_ttop", "y-shift", {"sensor": Sensor.new({"prop": "instrumentation/efis/fnd/fli-ttop"}), "scale": -90.3, "offset": 0, "max": 10, "min": -10, "delta": SHIFT_THRES });
  62. fnd_canvas.add_trans("fli_mcp", "y-scale", {"function": func {return getprop("instrumentation/efis/fnd/fli-top") - getprop("instrumentation/efis/fnd/fli-mcp");} });
  63. fnd_canvas.add_trans("fli_mcp", "y-shift", {"sensor": Sensor.new({"prop": "instrumentation/efis/fnd/fli-mcp"}), "scale": -90.3, "offset": 0, "max": 10, "min": -10, "delta": SHIFT_THRES });
  64. fnd_canvas.add_trans("horizon", "y-shift", {"sensor": adc.pitch, "scale": 3.6, "max": 90 , "min":-90});
  65. fnd_canvas.add_trans("horizon", "rotation", {"sensor": adc.roll, "scale": -1});
  66. fnd_canvas.add_trans("horizonNums", "y-shift", {"sensor": adc.pitch, "scale": 3.6, "max": 90 , "min":-90});
  67. fnd_canvas.add_trans("horizonNums", "rotation", {"sensor": adc.roll, "scale": -1});
  68. fnd_canvas["horizonNums"].set("clip", "rect(150, 400, 330, 150)"); # clip: top, right, bottom, left
  69. fnd_canvas.add_trans("rollPointer", "rotation", {"sensor": adc.roll, "scale": -1 });
  70. fnd_canvas.add_trans("slipSkid", "x-shift", {"sensor": adc.slipskid, "scale": -25 });
  71. fnd_canvas.add_text("aglNum", {"sensor": adc.agl, "format": "%3.0f", "offset":-5.22, "trunc": "abs"});
  72. fnd_canvas.add_cond("aglNum", {"function": func { (adc.agl.get()<1000) ? 1 : 0}});
  73. # move vsi needle and numerical indication
  74. # ============================
  75. fnd_canvas.add_trans("vsi", "rotation", {"sensor": adc.vs, "scale":-1.2, "max":35, "min":-35});
  76. fnd_canvas.add_trans_grp(["vsi", "vsiNum"], "y-shift", {"sensor": adc.vs, "scale": -84/2000*FPS2FPM, "max":35, "min":-35 });
  77. fnd_canvas.add_trans("vsBug", "y-shift", {"sensor": Sensor.new({"prop": "autopilot/internal/target-climb-rate-fps"}), "scale": -84/2000*FPS2FPM, "max":35, "min":-35 });
  78. fnd_canvas.add_text("vsiNum", {"sensor": adc.vs, "trunc": "abs", "scale": FPS2FPM/100, "format": "%2.0f" });
  79. fnd_canvas.add_trans("vsiNum", "y-shift", {"function": func { (adc.vs.get() > 0) ? -35 : 0 ;} });
  80. fnd_canvas.add_cond("vsiNum", {"function": func { (abs(adc.vs.get()) > 3) ? 1 : 0}});
  81. # Rose transformations
  82. # Bearing Needles
  83. # ============================
  84. fnd_canvas.add_trans("bear1Needle", "rotation", {"sensor": adc.nav1bear});
  85. fnd_canvas.add_cond("bear1Needle", {"sensor": adc.nav1inrange});
  86. fnd_canvas.add_trans("bear2Needle", "rotation", {"sensor": adc.adf0bear});
  87. fnd_canvas.add_cond("bear2Needle", {"sensor": adc.adf0inrange });
  88. # course and CDI
  89. # ============================
  90. fnd_canvas.add_trans_grp(["rose", "Cdi_Group", "hdgBug"], "rotation", {"sensor": adc.heading, "scale": -1});
  91. fnd_canvas.add_trans("hdgBug", "rotation", {"sensor": adc.headbug});
  92. fnd_canvas.add_trans("cdiNeedle", "x-shift", {"sensor": adc.nav0defl, "scale": 8});
  93. fnd_canvas.add_cond_grp(["cdiNeedle", "toFrom"], {"sensor": adc.nav0inrange});
  94. fnd_canvas.add_trans("toFrom", "rotation", {"sensor": Sensor.new({"prop": "instrumentation/nav[0]/from-flag"}), "scale": 180});
  95. fnd_canvas.add_trans("Cdi_Group", "rotation", {"sensor": adc.nav0crs});
  96. fnd_canvas.add_trans("Rose_Group", "y-scale", {"offset": ROSESC});
  97. fnd_canvas.add_trans("gsNeedle", "y-shift", {"sensor": Sensor.new({"prop": "instrumentation/nav[0]/gs-needle-deflection-norm"}), "scale": -65, "delta": SHIFT_THRES});
  98. fnd_canvas.add_cond_grp(["gsNeedle", "gsScale"], {"sensor": adc.nav0gsinrange});
  99. fnd_canvas.add_trans("speedTrend", "y-scale", {"sensor": Sensor.new({"prop": "velocities/airspeed-delta-kt-sec"}), "scale": 0.02, "max": 40, "min":-40});
  100. # lots of text
  101. # for nav aids to update
  102. # ============================
  103. fnd_canvas.add_text("bearingFrq1", {"sensor": Sensor.new({"prop": "instrumentation/nav[1]/frequencies/selected-mhz"}), "format": "%6.2f" });
  104. fnd_canvas.add_text("bearingFrq2", {"sensor": Sensor.new({"prop": "instrumentation/adf[0]/frequencies/selected-khz"}), "format": "%6.2f" });
  105. fnd_canvas.add_text("navFrq", {"sensor": Sensor.new({"prop": "instrumentation/nav[0]/frequencies/selected-mhz"}), "format": "%6.2f" });
  106. fnd_canvas.add_text("navID", {"sensor": Sensor.new({"prop": "instrumentation/nav[0]/nav-id", "type": "STRING"}) });
  107. fnd_canvas.add_text("navSrc", {"function": func return adc.nav0hasgs.get() ? "ILS1" : "VOR1", "disable_listener": SLOW });
  108. fnd_canvas.add_text("bearingSrc1", {"function": func return adc.nav1hasgs.get() ? "ILS2" : "VOR2", "disable_listener": SLOW });
  109. fnd_canvas.add_text("crs", {"sensor": adc.nav0crs, "format": "%3.0f" });
  110. fnd_canvas.add_text("navDME", {"function": func DME_format("instrumentation/nav[0]/nav-distance") , "disable_listener": SLOW });
  111. fnd_canvas.add_text("bearingDME1", {"function": func DME_format("instrumentation/nav[1]/nav-distance"), "disable_listener": SLOW });
  112. fnd_canvas.add_cond("navDME", {"function": func return adc.nav0dmeinrange.get() and adc.nav0inrange.get(), "disable_listener": SLOW});
  113. fnd_canvas.add_cond("bearingDME1", {"function": func return adc.nav1dmeinrange.get() and adc.nav1inrange.get(), "disable_listener": SLOW });
  114. # /instrumentation/nav[0]/has-gs --> navSrc VOR1/ILS1
  115. fnd_canvas.add_cond("navETE", {offset:0}); # hide ETE
  116. # fuel indicators
  117. # and rotor and eng rmp
  118. # ============================
  119. fnd_canvas.add_trans("fuelTotal", "y-scale", {"sensor": adc.tank0 });
  120. fnd_canvas.add_trans("fuelL", "y-scale", {"sensor": adc.tank1 });
  121. fnd_canvas.add_trans("fuelR", "y-scale", {"sensor": adc.tank2 });
  122. fnd_canvas.add_text("fuelNum", {"sensor": adc.tank_total, "scale": LB2KG, "format": "%3.0f Kg" });
  123. fnd_canvas.add_text("nrNum", {"sensor": adc.nr, "format": "%3.0f"});
  124. fnd_canvas.add_trans_grp(["nrNeedle1", "nrNeedle2"], "rotation", {"sensor": adc.nr, "min": 80 , "max":120, "scale": 180/40, "offset": -360});
  125. fnd_canvas.add_trans("n2_1Needle", "rotation", {"sensor": adc.n2_1, "min": 80 , "max":120, "scale": 180/40, "offset": -360});
  126. fnd_canvas.add_trans("n2_2Needle", "rotation", {"sensor": adc.n2_2, "min": 80 , "max":120, "scale": 180/40, "offset": -360});
  127. fnd_canvas["nrNeedle1"].set("clip", "rect(20, 170, 110, 0)"); # clip: top, right, bottom, left
  128. # note: this works also
  129. # fnd_canvas.add_text("fuelNum", {"function": func sprintf("%3.0fkg", getprop("consumables/fuel/tank[0]/level-norm")*500) });
  130. fnd_canvas.add_text("OAT", {"sensor": Sensor.new({"prop": "environment/temperature-degc", "disable_listener": SLOW }), "format": "%3.0f°C" });
  131. fnd_canvas.add_text("qnh", {"function": func return (adc.qnh.get() == 29.92) ? "STD" : sprintf("%4.0f", adc.qnh.get()*33.8639), "disable_listener": SLOW });
  132. # AP annunciators text items
  133. #
  134. # ============================
  135. fnd_canvas.add_text("altTarget", {"sensor": Sensor.new({"prop": "/autopilot/settings/target-altitude-ft"}), "format": "%5.0f"});
  136. fnd_canvas.add_cond_grp(["altTarget", "altBug"], {"function": func {return ( adc.apalt.get() == "altitude-hold" or adc.apaltarm.get() == "altitude-hold");} } );
  137. fnd_canvas.add_text("aglTarget", {"sensor": Sensor.new({"prop": "/autopilot/settings/target-agl-ft"}), "format": "%3.0f"});
  138. fnd_canvas.add_cond_grp(["aglTarget", "aglBug"], {"function": func {return ( adc.apalt.get() == "agl-hold" or adc.apaltarm.get() == "agl-hold");} } );
  139. fnd_canvas.add_cond("iasBug", {"function": func {return ( adc.apspeed.get() == "speed-with-pitch-trim" );}, "disable_listener": SLOW } );
  140. fnd_canvas.add_cond("vsBug", {"function": func {return ( adc.apalt.get() == "vertical-speed-hold" or adc.apalt.get() == "altitude-hold");}, "disable_listener": SLOW } );
  141. fnd_canvas.add_text("apLockRoll", {"function": func {
  142. var r = adc.aproll.get();
  143. if (r == "wing-leveler") return "SAS";
  144. elsif (r == "dg-heading-hold") return "HDG";
  145. elsif (r == "nav1-hold") return "VOR1";
  146. elsif (r == "nav2-hold") return "VOR2";
  147. else return "";
  148. }, "disable_listener": SLOW
  149. });
  150. fnd_canvas.add_text("apArmRoll", {"function": func {
  151. var r = adc.aprollarm.get();
  152. if (r == "nav1-hold") return "VOR1";
  153. elsif (r == "nav2-hold") return "VOR2";
  154. else return "";
  155. }, "disable_listener": SLOW
  156. });
  157. fnd_canvas.add_text("apLockPitch", {"function": func {
  158. var a = adc.apalt.get();
  159. var s = adc.apspeed.get();
  160. var c = adc.apcoll.get();
  161. if (a == "pitch-hold") return "SAS";
  162. elsif (a == "altitude-hold" and !c) return "ALT";
  163. elsif (a == "agl-hold" and !c) return "CR.HT";
  164. elsif (a == "vertical-speed-hold" and !c) return "V/S";
  165. elsif (s == "speed-with-pitch-trim") return "IAS";
  166. elsif (a == "gs1-hold" and !c) return "G/S1";
  167. elsif (s == "go-around") return "GA";
  168. else return "";
  169. }, "disable_listener": SLOW
  170. });
  171. fnd_canvas.add_text("apArmPitch", {"function": func {
  172. var a = adc.apaltarm.get();
  173. var c = adc.apcoll.get();
  174. if (a == "altitude-hold" and !c) return "ALT.A";
  175. elsif (a == "gs1-hold" and !c) return "G/S1";
  176. else return "";
  177. }, "disable_listener": SLOW
  178. });
  179. fnd_canvas.add_text("apLockColl", {"function": func {
  180. var a = adc.apalt.get();
  181. var c = adc.apcoll.get();
  182. if (a == "altitude-hold" and c) return "ALT";
  183. elsif (a == "agl-hold" and c) return "CR.HT";
  184. elsif (a == "go-around") return "GA";
  185. elsif (a == "vertical-speed-hold" and c) return "V/S";
  186. elsif (a == "gs1-hold" and c) return "G/S1";
  187. elsif (a == "fpa-hold" and c) return "FPA";
  188. else return "";
  189. }, "disable_listener": SLOW
  190. });
  191. fnd_canvas.add_text("apArmColl", {"function": func {
  192. var a = adc.apaltarm.get();
  193. var c = adc.apcoll.get();
  194. if (a == "altitude-hold" and c) return "ALT.A";
  195. elsif (a == "gs1-hold" and c) return "G/S1";
  196. elsif (a == "agl-hold" and c) return "CR.HT";
  197. else return "";
  198. }, "disable_listener": SLOW
  199. });
  200. # master line text items
  201. #
  202. # ============================
  203. for (var li=0; li<7; li+=1) {
  204. foreach (var j; [0,1,2])
  205. fnd_canvas.add_text("ml_"~li~"_"~j, {"prop" : "instrumentation/efis/fnd/masterlist["~li~"]/msg["~j~"]"});
  206. }
  207. # translate rose numerals in elliptic orbit
  208. # around center of compass rose
  209. # ============================
  210. fnd_canvas.add_trans("markN","y-shift",{"function": func rose_mark_y(0), "delta": SHIFT_THRES, "disable_listener": FAST});
  211. fnd_canvas.add_trans("markE","y-shift",{"function": func rose_mark_y(9), "delta": SHIFT_THRES, "disable_listener": FAST});
  212. fnd_canvas.add_trans("markS","y-shift",{"function": func rose_mark_y(18), "delta": SHIFT_THRES, "disable_listener": FAST});
  213. fnd_canvas.add_trans("markW","y-shift",{"function": func rose_mark_y(27), "delta": SHIFT_THRES, "disable_listener": FAST});
  214. fnd_canvas.add_trans("mark03","y-shift",{"function": func rose_mark_y(3), "delta": SHIFT_THRES, "disable_listener": FAST});
  215. fnd_canvas.add_trans("mark06","y-shift",{"function": func rose_mark_y(6), "delta": SHIFT_THRES, "disable_listener": FAST});
  216. fnd_canvas.add_trans("mark12","y-shift",{"function": func rose_mark_y(12), "delta": SHIFT_THRES, "disable_listener": FAST});
  217. fnd_canvas.add_trans("mark15","y-shift",{"function": func rose_mark_y(15), "delta": SHIFT_THRES, "disable_listener": FAST});
  218. fnd_canvas.add_trans("mark21","y-shift",{"function": func rose_mark_y(21), "delta": SHIFT_THRES, "disable_listener": FAST});
  219. fnd_canvas.add_trans("mark24","y-shift",{"function": func rose_mark_y(24), "delta": SHIFT_THRES, "disable_listener": FAST});
  220. fnd_canvas.add_trans("mark30","y-shift",{"function": func rose_mark_y(30), "delta": SHIFT_THRES, "disable_listener": FAST});
  221. fnd_canvas.add_trans("mark33","y-shift",{"function": func rose_mark_y(33), "delta": SHIFT_THRES, "disable_listener": FAST});
  222. fnd_canvas.add_trans("markN","x-shift",{"function": func rose_mark_x(0), "delta": SHIFT_THRES, "disable_listener": FAST});
  223. fnd_canvas.add_trans("markE","x-shift",{"function": func rose_mark_x(9), "delta": SHIFT_THRES, "disable_listener": FAST});
  224. fnd_canvas.add_trans("markS","x-shift",{"function": func rose_mark_x(18), "delta": SHIFT_THRES, "disable_listener": FAST});
  225. fnd_canvas.add_trans("markW","x-shift",{"function": func rose_mark_x(27), "delta": SHIFT_THRES, "disable_listener": FAST});
  226. fnd_canvas.add_trans("mark03","x-shift",{"function": func rose_mark_x(3), "delta": SHIFT_THRES, "disable_listener": FAST});
  227. fnd_canvas.add_trans("mark06","x-shift",{"function": func rose_mark_x(6), "delta": SHIFT_THRES, "disable_listener": FAST});
  228. fnd_canvas.add_trans("mark12","x-shift",{"function": func rose_mark_x(12), "delta": SHIFT_THRES, "disable_listener": FAST});
  229. fnd_canvas.add_trans("mark15","x-shift",{"function": func rose_mark_x(15), "delta": SHIFT_THRES, "disable_listener": FAST});
  230. fnd_canvas.add_trans("mark21","x-shift",{"function": func rose_mark_x(21), "delta": SHIFT_THRES, "disable_listener": FAST});
  231. fnd_canvas.add_trans("mark24","x-shift",{"function": func rose_mark_x(24), "delta": SHIFT_THRES, "disable_listener": FAST});
  232. fnd_canvas.add_trans("mark30","x-shift",{"function": func rose_mark_x(30), "delta": SHIFT_THRES, "disable_listener": FAST});
  233. fnd_canvas.add_trans("mark33","x-shift",{"function": func rose_mark_x(33), "delta": SHIFT_THRES, "disable_listener": FAST});
  234. fnd_canvas.add_trans("windBarb", "rotation", {"function": func {adc.winddir.get()-adc.heading.get()-180}, "delta": 1, "disable_listener": SLOW } );
  235. fnd_canvas.add_cond("windBarb", {"function": func {adc.windspeed.get() > 2 } , "delta": 1, "disable_listener": SLOW });
  236. fnd_canvas.add_cond("windBarb1", {"function": func {adc.windspeed.get()>8} , "delta": 1, "disable_listener": SLOW});
  237. fnd_canvas.add_cond("windBarb2", {"function": func {adc.windspeed.get()>18} , "delta": 1, "disable_listener": SLOW});
  238. fnd_canvas.add_cond("windBarb3", {"function": func {adc.windspeed.get()>28} , "delta": 1, "disable_listener": SLOW});
  239. fnd_canvas.add_cond("windBarb4", {"function": func {adc.windspeed.get()>38} , "delta": 1, "disable_listener": SLOW});
  240. fnd_canvas.newMFD();
  241. var __test__ = func(y) {
  242. call( fnd_canvas["Rose_Group"].setVisible, [y,], fnd_canvas["Rose_Group"]);
  243. }