Add "show sensors" command to show script sensor information for debug purposes.
parent
f0a936832b
commit
be5c6658bb
|
@ -42,6 +42,41 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
{
|
{
|
||||||
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Used by one-off and repeated sensors
|
||||||
|
/// </summary>
|
||||||
|
public class SensorInfo
|
||||||
|
{
|
||||||
|
public uint localID;
|
||||||
|
public UUID itemID;
|
||||||
|
public double interval;
|
||||||
|
public DateTime next;
|
||||||
|
|
||||||
|
public string name;
|
||||||
|
public UUID keyID;
|
||||||
|
public int type;
|
||||||
|
public double range;
|
||||||
|
public double arc;
|
||||||
|
public SceneObjectPart host;
|
||||||
|
|
||||||
|
public SensorInfo Clone()
|
||||||
|
{
|
||||||
|
SensorInfo s = new SensorInfo();
|
||||||
|
s.localID = localID;
|
||||||
|
s.itemID = itemID;
|
||||||
|
s.interval = interval;
|
||||||
|
s.next = next;
|
||||||
|
s.name = name;
|
||||||
|
s.keyID = keyID;
|
||||||
|
s.type = type;
|
||||||
|
s.range = range;
|
||||||
|
s.arc = arc;
|
||||||
|
s.host = host;
|
||||||
|
|
||||||
|
return s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public AsyncCommandManager m_CmdManager;
|
public AsyncCommandManager m_CmdManager;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
|
@ -78,24 +113,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
private double maximumRange = 96.0;
|
private double maximumRange = 96.0;
|
||||||
private int maximumToReturn = 16;
|
private int maximumToReturn = 16;
|
||||||
|
|
||||||
//
|
|
||||||
// SenseRepeater and Sensors
|
|
||||||
//
|
|
||||||
private class SenseRepeatClass
|
|
||||||
{
|
|
||||||
public uint localID;
|
|
||||||
public UUID itemID;
|
|
||||||
public double interval;
|
|
||||||
public DateTime next;
|
|
||||||
|
|
||||||
public string name;
|
|
||||||
public UUID keyID;
|
|
||||||
public int type;
|
|
||||||
public double range;
|
|
||||||
public double arc;
|
|
||||||
public SceneObjectPart host;
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// Sensed entity
|
// Sensed entity
|
||||||
//
|
//
|
||||||
|
@ -128,7 +145,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
///
|
///
|
||||||
/// Always lock SenseRepeatListLock when updating this list.
|
/// Always lock SenseRepeatListLock when updating this list.
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
private List<SenseRepeatClass> SenseRepeaters = new List<SenseRepeatClass>();
|
private List<SensorInfo> SenseRepeaters = new List<SensorInfo>();
|
||||||
private object SenseRepeatListLock = new object();
|
private object SenseRepeatListLock = new object();
|
||||||
|
|
||||||
public void SetSenseRepeatEvent(uint m_localID, UUID m_itemID,
|
public void SetSenseRepeatEvent(uint m_localID, UUID m_itemID,
|
||||||
|
@ -142,7 +159,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// Add to timer
|
// Add to timer
|
||||||
SenseRepeatClass ts = new SenseRepeatClass();
|
SensorInfo ts = new SensorInfo();
|
||||||
ts.localID = m_localID;
|
ts.localID = m_localID;
|
||||||
ts.itemID = m_itemID;
|
ts.itemID = m_itemID;
|
||||||
ts.interval = sec;
|
ts.interval = sec;
|
||||||
|
@ -161,11 +178,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
AddSenseRepeater(ts);
|
AddSenseRepeater(ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddSenseRepeater(SenseRepeatClass senseRepeater)
|
private void AddSenseRepeater(SensorInfo senseRepeater)
|
||||||
{
|
{
|
||||||
lock (SenseRepeatListLock)
|
lock (SenseRepeatListLock)
|
||||||
{
|
{
|
||||||
List<SenseRepeatClass> newSenseRepeaters = new List<SenseRepeatClass>(SenseRepeaters);
|
List<SensorInfo> newSenseRepeaters = new List<SensorInfo>(SenseRepeaters);
|
||||||
newSenseRepeaters.Add(senseRepeater);
|
newSenseRepeaters.Add(senseRepeater);
|
||||||
SenseRepeaters = newSenseRepeaters;
|
SenseRepeaters = newSenseRepeaters;
|
||||||
}
|
}
|
||||||
|
@ -176,8 +193,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
// Remove from timer
|
// Remove from timer
|
||||||
lock (SenseRepeatListLock)
|
lock (SenseRepeatListLock)
|
||||||
{
|
{
|
||||||
List<SenseRepeatClass> newSenseRepeaters = new List<SenseRepeatClass>();
|
List<SensorInfo> newSenseRepeaters = new List<SensorInfo>();
|
||||||
foreach (SenseRepeatClass ts in SenseRepeaters)
|
foreach (SensorInfo ts in SenseRepeaters)
|
||||||
{
|
{
|
||||||
if (ts.localID != m_localID || ts.itemID != m_itemID)
|
if (ts.localID != m_localID || ts.itemID != m_itemID)
|
||||||
{
|
{
|
||||||
|
@ -192,7 +209,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
public void CheckSenseRepeaterEvents()
|
public void CheckSenseRepeaterEvents()
|
||||||
{
|
{
|
||||||
// Go through all timers
|
// Go through all timers
|
||||||
foreach (SenseRepeatClass ts in SenseRepeaters)
|
foreach (SensorInfo ts in SenseRepeaters)
|
||||||
{
|
{
|
||||||
// Time has passed?
|
// Time has passed?
|
||||||
if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime())
|
if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime())
|
||||||
|
@ -209,7 +226,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
double range, double arc, SceneObjectPart host)
|
double range, double arc, SceneObjectPart host)
|
||||||
{
|
{
|
||||||
// Add to timer
|
// Add to timer
|
||||||
SenseRepeatClass ts = new SenseRepeatClass();
|
SensorInfo ts = new SensorInfo();
|
||||||
ts.localID = m_localID;
|
ts.localID = m_localID;
|
||||||
ts.itemID = m_itemID;
|
ts.itemID = m_itemID;
|
||||||
ts.interval = 0;
|
ts.interval = 0;
|
||||||
|
@ -225,7 +242,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
SensorSweep(ts);
|
SensorSweep(ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void SensorSweep(SenseRepeatClass ts)
|
private void SensorSweep(SensorInfo ts)
|
||||||
{
|
{
|
||||||
if (ts.host == null)
|
if (ts.host == null)
|
||||||
{
|
{
|
||||||
|
@ -301,7 +318,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<SensedEntity> doObjectSensor(SenseRepeatClass ts)
|
private List<SensedEntity> doObjectSensor(SensorInfo ts)
|
||||||
{
|
{
|
||||||
List<EntityBase> Entities;
|
List<EntityBase> Entities;
|
||||||
List<SensedEntity> sensedEntities = new List<SensedEntity>();
|
List<SensedEntity> sensedEntities = new List<SensedEntity>();
|
||||||
|
@ -451,7 +468,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
return sensedEntities;
|
return sensedEntities;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<SensedEntity> doAgentSensor(SenseRepeatClass ts)
|
private List<SensedEntity> doAgentSensor(SensorInfo ts)
|
||||||
{
|
{
|
||||||
List<SensedEntity> sensedEntities = new List<SensedEntity>();
|
List<SensedEntity> sensedEntities = new List<SensedEntity>();
|
||||||
|
|
||||||
|
@ -627,7 +644,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
{
|
{
|
||||||
List<Object> data = new List<Object>();
|
List<Object> data = new List<Object>();
|
||||||
|
|
||||||
foreach (SenseRepeatClass ts in SenseRepeaters)
|
foreach (SensorInfo ts in SenseRepeaters)
|
||||||
{
|
{
|
||||||
if (ts.itemID == itemID)
|
if (ts.itemID == itemID)
|
||||||
{
|
{
|
||||||
|
@ -657,7 +674,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
|
|
||||||
while (idx < data.Length)
|
while (idx < data.Length)
|
||||||
{
|
{
|
||||||
SenseRepeatClass ts = new SenseRepeatClass();
|
SensorInfo ts = new SensorInfo();
|
||||||
|
|
||||||
ts.localID = localID;
|
ts.localID = localID;
|
||||||
ts.itemID = itemID;
|
ts.itemID = itemID;
|
||||||
|
@ -678,5 +695,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||||
idx += 6;
|
idx += 6;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public List<SensorInfo> GetSensorInfo()
|
||||||
|
{
|
||||||
|
List<SensorInfo> retList = new List<SensorInfo>();
|
||||||
|
|
||||||
|
lock (SenseRepeatListLock)
|
||||||
|
{
|
||||||
|
foreach (SensorInfo si in SenseRepeaters)
|
||||||
|
retList.Add(si.Clone());
|
||||||
|
}
|
||||||
|
|
||||||
|
return retList;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,86 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) Contributors, http://opensimulator.org/
|
||||||
|
* See CONTRIBUTORS.TXT for a full list of copyright holders.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions are met:
|
||||||
|
* * Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* * Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
* * Neither the name of the OpenSimulator Project nor the
|
||||||
|
* names of its contributors may be used to endorse or promote products
|
||||||
|
* derived from this software without specific prior written permission.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
|
||||||
|
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
|
||||||
|
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using OpenSim.Framework;
|
||||||
|
using OpenSim.Framework.Console;
|
||||||
|
using OpenSim.Region.ScriptEngine.Interfaces;
|
||||||
|
using OpenSim.Region.ScriptEngine.Shared.Api;
|
||||||
|
using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
|
||||||
|
|
||||||
|
namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
|
{
|
||||||
|
public class ScriptEngineConsoleCommands
|
||||||
|
{
|
||||||
|
IScriptEngine m_engine;
|
||||||
|
|
||||||
|
public ScriptEngineConsoleCommands(IScriptEngine engine)
|
||||||
|
{
|
||||||
|
m_engine = engine;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void RegisterCommands()
|
||||||
|
{
|
||||||
|
MainConsole.Instance.Commands.AddCommand(
|
||||||
|
"Scripts", false, "show sensors", "show sensors", "Show script sensors information",
|
||||||
|
HandleShowSensors);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void HandleShowSensors(string module, string[] cmdparams)
|
||||||
|
{
|
||||||
|
if (!(MainConsole.Instance.ConsoleScene == null || MainConsole.Instance.ConsoleScene == m_engine.World))
|
||||||
|
return;
|
||||||
|
|
||||||
|
SensorRepeat sr = AsyncCommandManager.GetSensorRepeatPlugin(m_engine);
|
||||||
|
|
||||||
|
if (sr == null)
|
||||||
|
{
|
||||||
|
MainConsole.Instance.Output("Sensor plugin not yet initialized");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
List<SensorRepeat.SensorInfo> sensorInfo = sr.GetSensorInfo();
|
||||||
|
|
||||||
|
ConsoleDisplayTable cdt = new ConsoleDisplayTable();
|
||||||
|
cdt.AddColumn("Part name", 40);
|
||||||
|
cdt.AddColumn("Script item ID", 36);
|
||||||
|
cdt.AddColumn("Type", 4);
|
||||||
|
cdt.AddColumn("Interval", 8);
|
||||||
|
cdt.AddColumn("Range", 8);
|
||||||
|
cdt.AddColumn("Arc", 8);
|
||||||
|
|
||||||
|
foreach (SensorRepeat.SensorInfo s in sensorInfo)
|
||||||
|
{
|
||||||
|
cdt.AddRow(s.host.Name, s.itemID, s.type, s.interval, s.range, s.arc);
|
||||||
|
}
|
||||||
|
|
||||||
|
MainConsole.Instance.Output(cdt.ToString());
|
||||||
|
MainConsole.Instance.OutputFormat("Total: {0}", sensorInfo.Count);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -169,6 +169,8 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
IWorkItemResult m_CurrentCompile = null;
|
IWorkItemResult m_CurrentCompile = null;
|
||||||
private Dictionary<UUID, int> m_CompileDict = new Dictionary<UUID, int>();
|
private Dictionary<UUID, int> m_CompileDict = new Dictionary<UUID, int>();
|
||||||
|
|
||||||
|
private ScriptEngineConsoleCommands m_consoleCommands;
|
||||||
|
|
||||||
public string ScriptEngineName
|
public string ScriptEngineName
|
||||||
{
|
{
|
||||||
get { return "XEngine"; }
|
get { return "XEngine"; }
|
||||||
|
@ -318,6 +320,9 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||||
OnObjectRemoved += m_XmlRpcRouter.ObjectRemoved;
|
OnObjectRemoved += m_XmlRpcRouter.ObjectRemoved;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m_consoleCommands = new ScriptEngineConsoleCommands(this);
|
||||||
|
m_consoleCommands.RegisterCommands();
|
||||||
|
|
||||||
MainConsole.Instance.Commands.AddCommand(
|
MainConsole.Instance.Commands.AddCommand(
|
||||||
"Scripts", false, "xengine status", "xengine status", "Show status information",
|
"Scripts", false, "xengine status", "xengine status", "Show status information",
|
||||||
"Show status information on the script engine.",
|
"Show status information on the script engine.",
|
||||||
|
|
Loading…
Reference in New Issue