Add "show sensors" command to show script sensor information for debug purposes.

user_profiles
Justin Clark-Casey (justincc) 2013-01-10 00:32:22 +00:00
parent 290dc274ec
commit a0000a034f
3 changed files with 153 additions and 32 deletions

View File

@ -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>();
@ -450,7 +467,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>();
@ -626,7 +643,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)
{ {
@ -656,7 +673,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;
@ -677,5 +694,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;
}
} }
} }

View File

@ -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);
}
}
}

View File

@ -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.",