Howto:Reset/re-init Troubleshooting: Difference between revisions

Jump to navigation Jump to search
(→‎Nasal example: Indenation)
Line 191: Line 191:


== Nasal example ==
== Nasal example ==
{{Note|The following Nasal script can be executed via the Nasal Console or put in a separate file and executed via a menu item to easily test different aspects of reset/re-init. For the time being, you are likely to trigger segfaults/crashes or other undefined behavior (e.g. memory leaks), so it is recommended to run fgfs in a gdb session to obtain a backtrace. If you manage to cause a bug or crash, please file a bug report: {{Tickets}} }}
{{Note|The following Nasal script can be executed via the Nasal Console or put in a separate file and executed via a menu item to easily test different aspects of reset/re-init. For the time being, you are likely to trigger segfaults/crashes or other undefined behavior (e.g., memory leaks), so it is recommended to run FlightGear in a GDB session to obtain a backtrace. If you manage to cause a bug or crash, please file a bug report: {{Tickets}} }}


<syntaxhighlight lang="nasal">
<syntaxhighlight lang="nasal" enclose="div">
canvas.MessageBox.warning(
    "Developer Feature",
    "This dialog is mainly intended for people familiar with FlightGear/core internals to help troubleshoot reset/re-init related bugs. You will probably want to run FlightGear inside a GDB session when using this dialog",
    func(sel){
        if(sel != canvas.MessageBox.Ok) return;


canvas.MessageBox.warning(
  "Developer Feature...",
  "This dialog is mainly intended for people familiar with FlightGear/core internals, to help troubleshoot reset/re-init related bugs you will probably want to run fgfs inside  a gdb session when using this dialog",
  func(sel)
  {
    if( sel != canvas.MessageBox.Ok )
      return;
###################################################################
###################################################################
var (width, height) = (700, 480);
var (width, height) = (700, 480);
Line 214: Line 212:
   
   
var myLayout = canvas.VBoxLayout.new();
var myLayout = canvas.VBoxLayout.new();


myCanvas.setLayout(myLayout);
myCanvas.setLayout(myLayout);
Line 220: Line 217:
var drawMaskHBox = canvas.HBoxLayout.new();
var drawMaskHBox = canvas.HBoxLayout.new();
myLayout.addItem(drawMaskHBox);
myLayout.addItem(drawMaskHBox);


# create a scrollbar   
# create a scrollbar   
Line 234: Line 230:
scroll.setLayout(list);
scroll.setLayout(list);


var resetBtn = canvas.gui.widgets.Button.new(root, canvas.style, {})
    .setText("Global reset")
    .setFixedSize(120, 25);


var resetBtn = canvas.gui.widgets.Button.new(root, canvas.style, {})
resetBtn.listen("clicked", func(){
.setText("Global reset")
    fgcommand("reset");
.setFixedSize(120, 25);
resetBtn.listen("clicked", func() {
fgcommand("reset");
});
});
drawMaskHBox.addItem(resetBtn);
drawMaskHBox.addItem(resetBtn);


var draw_masks = ["terrain","aircraft","models","clouds"];
var draw_masks = ["terrain", "aircraft", "models", "clouds"];
foreach(var d; draw_masks) {
foreach(var d; draw_masks) {
var prop = "/sim/rendering/draw-mask/"~d;
    var prop = "/sim/rendering/draw-mask/" ~ d;
drawMaskHBox.addItem(
    drawMaskHBox.addItem(
         canvas.gui.widgets.CheckBox.new(root, canvas.style, {})
         canvas.gui.widgets.CheckBox.new(root, canvas.style, {})
                            .setText(d)
            .setText(d)
    .setChecked(getprop(prop))
            .setChecked(getprop(prop))
                            .listen("toggled", func(e) {
            .listen("toggled", func(e) {
      var prop=prop;
                setprop(prop, e.detail.checked);
                              setprop(prop, e.detail.checked);
            })
                            })
    );
      );
}
}
   
   
##
##
Line 262: Line 257:
var resetHandler = func(command, arguments){
var resetHandler = func(command, arguments){
     return func(){
     return func(){
      var name = arguments.name;
        var name = arguments.name;
        logprint(4,"testing subsystemFactory for:"~name);
        logprint(4, "testing subsystemFactory for:" ~ name);
 
        fgcommand(command, props.Node.new({"subsystem": name}));
      fgcommand(command, props.Node.new({"subsystem": name}));
     };
     }; # inner func
};
}; # outer func


##
##
Line 274: Line 268:
var addTest = func(root, layout, test){  
var addTest = func(root, layout, test){  
     # create a new layout
     # create a new layout
  var row = canvas.HBoxLayout.new();
    var row = canvas.HBoxLayout.new();
  layout.addItem(row);
    layout.addItem(row);


var label = canvas.gui.widgets.Label.new(root, canvas.style, {wordWrap: 0});
    var label = canvas.gui.widgets.Label.new(root, canvas.style, {wordWrap: 0});
label.setText(test.name);
    label.setText(test.name);
row.addItem(label);
    row.addItem(label);


foreach(var cmd; ["re-init", "remove-subsystem", "add-subsystem"]) {  
    foreach(var cmd; ["re-init", "remove-subsystem", "add-subsystem"]) {  
    var button = canvas.gui.widgets.Button.new(root, canvas.style, {})
        var button = canvas.gui.widgets.Button.new(root, canvas.style, {})
        .setText(cmd)
            .setText(cmd)
        .setFixedSize(150, 25);
            .setFixedSize(150, 25);
    button.listen("clicked", resetHandler(cmd, test));
        button.listen("clicked", resetHandler(cmd, test));
    row.addItem(button);
        row.addItem(button);
}
    }
return label; # we want to update the label elsewhere
 
    return label; # we want to update the label elsewhere
}; # addTest
}; # addTest
   
   
##
##
Line 328: Line 322:
     { name: "aircraft-model" },
     { name: "aircraft-model" },
     { name: "model-manager" },
     { name: "model-manager" },
     { name: "view-manager" },
     { name: "view-manager" }
 
 
 
]; # vector with tests
]; # vector with tests
   
   
Line 337: Line 328:
# add buttons for each test to the scrollbar layout
# add buttons for each test to the scrollbar layout
foreach(var test; Tests){
foreach(var test; Tests){
  # will add label fields to each test, so that labels can be dynamically updated
    # will add label fields to each test, so that labels can be dynamically updated
  # using a different callback
    # using a different callback
     test.label = addTest(root: scrollContent, layout: list, test: test);
     test.label = addTest(root: scrollContent, layout: list, test: test);
} # foreach test
}


var subsystemMonitor = func() {
var subsystemMonitor = func(){
foreach(var test; Tests) {
    foreach(var test; Tests){
  var isRunning = fgcommand("subsystem-running", props.Node.new({"subsystem": test.name}));
        var isRunning = fgcommand("subsystem-running", props.Node.new({"subsystem": test.name}));
var suffix= (isRunning)? " (active)": " (inactive)";  
        var suffix = isRunning ? " (active)" : " (inactive)";  
#test.label.setBackground( color );
        #test.label.setBackground(color);
var currentText = test.label._view._text.get("text");
        var currentText = test.label._view._text.get("text");
var neededLabel = test.name ~ suffix;
        var neededLabel = test.name ~ suffix;
if (currentText==neededLabel) continue;
        if (currentText == neededLabel) continue;
test.label.setText(neededLabel);
        test.label.setText(neededLabel);
} #foreach
    }
} # subsystemMonitor
}


var statusbar = canvas.gui.widgets.Label.new(root, canvas.style, {wordWrap: 0});
var statusbar = canvas.gui.widgets.Label.new(root, canvas.style, {wordWrap: 0});
statusbar.setText("FlightGear v." ~getprop("/sim/version/flightgear") );
statusbar.setText("FlightGear v." ~ getprop("/sim/version/flightgear"));
myLayout.addItem(statusbar);
myLayout.addItem(statusbar);


 
var myTimer = maketimer(0.1, subsystemMonitor);
var myTimer = maketimer(0.1, subsystemMonitor );
myTimer.start();
myTimer.start();


window.del = func()
window.del = func(){
{
    print("Cleaning up window: ", title);
print("Cleaning up window:",title,"\n");
    myTimer.stop();
myTimer.stop();
    call(canvas.Window.del, [], me);
call(canvas.Window.del, [], me);
};
};


###################################################################
###################################################################
  }, # event handler for messageBox
    }, # event handler for messageBox
  canvas.MessageBox.Ok |canvas.MessageBox.Cancel | canvas.MessageBox.DontShowAgain
    canvas.MessageBox.Ok |canvas.MessageBox.Cancel | canvas.MessageBox.DontShowAgain
);
);




</syntaxhighlight>
</syntaxhighlight>

Navigation menu