| |
using System;
using System.Collections.Generic;
using System.ComponentModel;
using Microsoft.Ccr.Core;
using Microsoft.Dss.Core;
using Microsoft.Dss.Core.Attributes;
using Microsoft.Dss.ServiceModel.Dssp;
using Microsoft.Dss.ServiceModel.DsspServiceBase;
using W3C.Soap;
using System.IO;
using dssp = Microsoft.Dss.ServiceModel.Dssp;
using engineproxy = Microsoft.Robotics.Simulation.Engine.Proxy;
using submgr = Microsoft.Dss.Services.SubscriptionManager;
using simengine = Microsoft.Robotics.Simulation.Engine;
using physics = Microsoft.Robotics.Simulation.Physics;
using Microsoft.Robotics.Simulation;
using Microsoft.Robotics.Simulation.Engine;
using Microsoft.Robotics.Simulation.Physics;
using Microsoft.Robotics.PhysicalModel;
namespace SimulationFromState2
{
[Contract(Contract.Identifier)]
[DisplayName("SimulationFromState2")]
[Description("SimulationFromState2 service (no description provided)")]
class SimulationFromState2Service : DsspServiceBase
{
simengine.SimulationEnginePort _notificationTarget;
DifferentialDriveEntity _robot = null;
[ServiceState]
SimulationFromState2State _state = new SimulationFromState2State();
[ServicePort("/SimulationFromState2", AllowMultipleInstances = true)]
SimulationFromState2Operations _mainPort = new SimulationFromState2Operations();
public SimulationFromState2Service(DsspServiceCreationPort creationPort)
: base(creationPort)
{
}
protected override void Start()
{
_notificationTarget = new simengine.SimulationEnginePort();
base.Start();
MainPortInterleave.CombineWith(
new Interleave(
new TeardownReceiverGroup(),
new ExclusiveReceiverGroup(
Arbiter.Receive(true, _notificationTarget, InsertEntityNotificationHandler),
Arbiter.Receive(true, _notificationTarget, DeleteEntityNotificationHandler)
),
new ConcurrentReceiverGroup()
)
);
//Start simulation engine from the state file
string filename = "SimState/boxsim.xml";
dssp.PartnerType pt = new dssp.PartnerType();
System.Xml.XmlQualifiedName qName =
new System.Xml.XmlQualifiedName("StateService", "http://schemas.microsoft.com/xw/2004/10/dssp.html");
pt.Name = qName;
pt.Service = filename;
pt.Contract = "http://schemas.microsoft.com/robotics/2006/04/simulationengine.html";
engineproxy.Contract.CreateService(ConstructorPort, new PartnerType[] { pt });
//Request to robot platform bilding
simengine.EntitySubscribeRequestType esrt = new simengine.EntitySubscribeRequestType();
esrt.Name = "myrobot";
simengine.SimulationEngine.GlobalInstancePort.Subscribe(esrt, _notificationTarget);
}
void InsertEntityNotificationHandler(simengine.InsertSimulationEntity ins)
{
if (ins.Body.State.Name == "myrobot")
{
_robot = (DifferentialDriveEntity)ins.Body;
LogInfo(LogGroups.Console, _robot.State.Name + " was connected!");
}
}
void DeleteEntityNotificationHandler(simengine.DeleteSimulationEntity del)
{
if (del.Body.State.Name == "myrobot")
{
_robot = null;
}
}
}
}
| |