void PhysicsContactNotificationHandler(physics.EntityContactNotification contact) { foreach (physics.ShapeContact sc in contact.ShapeContacts) { // look up shape involved in collision and check its one of the bumper shapes pxContactSensor.ContactSensor s; if (!_bumperShapeToSensorTable.TryGetValue(sc.LocalShape, out s)) { continue; } if (contact.Stage == physics.ContactNotificationStage.Started) { s.Pressed = true; } else if (contact.Stage == physics.ContactNotificationStage.Finished) { s.Pressed = false; } s.TimeStamp = DateTime.Now; // notification for individual sensor _subMgrPort.Post(new submgr.Submit(s, dssp.DsspActions.UpdateRequest)); } // send notification _subMgrPort.Post(new submgr.Submit(_state, dssp.DsspActions.ReplaceRequest)); // reactivate notification handler Activate(Arbiter.Receive(false, _contactNotificationPort, PhysicsContactNotificationHandler)); }
/// <summary> /// This handler receives a notification when the bumper contact state changes /// </summary> /// <param name="contact"></param> void ContactHandler(simcommon.EntityContactNotification contact) { if (contact.Stage == simcommon.ContactNotificationStage.Finished) { _entity.BumperLeft = _entity.BumperRight = false; } else { bool right = false; bool left = false; foreach (simcommon.ShapeContact sc in contact.ShapeContacts) { switch (sc.LocalShape.State.Name[sc.LocalShape.State.Name.Length - 2]) { case 'L': left = true; break; case 'R': right = true; break; case 'B': left = true; right = true; break; } } _entity.BumperLeft = left; _entity.BumperRight = right; } }