public void Can_parse_rosbag_with_nested_message() { var input = @"byte DEBUG=1 byte INFO=2 byte WARN=4 byte ERROR=8 byte FATAL=16 Header header byte level string name string msg string file string function uint32 line string[] topics ================================================================================ MSG: std_msgs/Header uint32 seq time stamp string frame_id"; var actual = new RosbagMessageDefinitionParser(input).Parse(); Assert.NotNull(actual); Assert.NotNull(actual.Message); Assert.Single(actual.NestedMessages); var nestedMessage = actual.NestedMessages[RosTypeInfo.CreateRosType("std_msgs", "Header")]; Assert.NotNull(nestedMessage); Assert.False(nestedMessage.IsEmpty); }
private void ParseMessagesInternal() { var packageDependencyCollector = new PackageDependencyCollector(new [] { Package.Name }); var typeDependencyCollector = new TypeDependencyCollector(new [] { Package.Name }); var collectors = new RosMessageVisitorListenerCollection(new IRosMessageVisitorListener[] { packageDependencyCollector, typeDependencyCollector }); var messages = new List <KeyValuePair <RosTypeInfo, MessageDescriptor> >(); var actions = new List <KeyValuePair <RosTypeInfo, ActionDescriptor> >(); var services = new List <KeyValuePair <RosTypeInfo, ServiceDescriptor> >(); foreach (var messageFile in Package.Messages) { using (var fileStream = File.OpenRead(messageFile.FullName)) { var rosType = RosTypeInfo.CreateRosType(Package.Name, messageFile.NameWithoutExtension()); switch (messageFile.GetRosMessageType()) { case RosMessageType.Message: var messageParser = new RobSharper.Ros.MessageParser.MessageParser(fileStream); var messageDescriptor = messageParser.Parse(collectors); messages.Add( new KeyValuePair <RosTypeInfo, MessageDescriptor>(rosType, messageDescriptor)); break; case RosMessageType.Service: var serviceParser = new ServiceParser(fileStream); var serviceDescriptor = serviceParser.Parse(collectors); services.Add( new KeyValuePair <RosTypeInfo, ServiceDescriptor>(rosType, serviceDescriptor)); break; case RosMessageType.Action: var actionParser = new ActionParser(fileStream); var actionDescriptor = actionParser.Parse(collectors); actions.Add( new KeyValuePair <RosTypeInfo, ActionDescriptor>(rosType, actionDescriptor)); break; } } } // Add actionlib dependency if (actions.Any() && !packageDependencyCollector.Dependencies.Contains("actionlib_msgs")) { packageDependencyCollector.Dependencies.Add("actionlib_msgs"); } _packageDependencies = packageDependencyCollector.Dependencies; _externalTypeDependencies = typeDependencyCollector.Dependencies; _messages = messages; _actions = actions; _services = services; }
public void OnVisitRosType_called_in_constant_decalaration_for_external_type() { var message = $"std_msgs/Bool CONST = True"; var expectedTypeDescriptor = RosTypeInfo.CreateRosType("std_msgs", "Bool"); var messageParser = ParserHelper.CreateParserForMessage(message); var context = messageParser.ros_message(); var mock = new Mock <IRosMessageVisitorListener>(); var visitor = new RosMessageVisitor(mock.Object); visitor.Visit(context); mock.Verify(x => x.OnVisitRosType(expectedTypeDescriptor)); }
public void OnVisitRosType_called_in_field_decalaration_for_header_type() { var message = $"Header fieldName"; var expectedTypeDescriptor = RosTypeInfo.CreateRosType("std_msgs", "Header"); var messageParser = ParserHelper.CreateParserForMessage(message); var context = messageParser.ros_message(); var mock = new Mock <IRosMessageVisitorListener>(); var visitor = new RosMessageVisitor(mock.Object); visitor.Visit(context); mock.Verify(x => x.OnVisitRosType(expectedTypeDescriptor)); }
public void Can_parse_rosbag_with_multiple_nested_messages() { var input = @"# ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ====== Header header actionlib_msgs/GoalStatus status MoveArmOnTrajectoryResult result ================================================================================ MSG: std_msgs/Header # Standard metadata for higher-level stamped data types. # This is generally used to communicate timestamped data # in a particular coordinate frame. # # sequence ID: consecutively increasing ID uint32 seq #Two-integer timestamp that is expressed as: # * stamp.sec: seconds (stamp_secs) since epoch (in Python the variable is called 'secs') # * stamp.nsec: nanoseconds since stamp_secs (in Python the variable is called 'nsecs') # time-handling sugar is provided by the client library time stamp #Frame this data is associated with # 0: no frame # 1: global frame string frame_id ================================================================================ MSG: actionlib_msgs/GoalStatus GoalID goal_id uint8 status uint8 PENDING = 0 # The goal has yet to be processed by the action server uint8 ACTIVE = 1 # The goal is currently being processed by the action server uint8 PREEMPTED = 2 # The goal received a cancel request after it started executing # and has since completed its execution (Terminal State) uint8 SUCCEEDED = 3 # The goal was achieved successfully by the action server (Terminal State) uint8 ABORTED = 4 # The goal was aborted during execution by the action server due # to some failure (Terminal State) uint8 REJECTED = 5 # The goal was rejected by the action server without being processed, # because the goal was unattainable or invalid (Terminal State) uint8 PREEMPTING = 6 # The goal received a cancel request after it started executing # and has not yet completed execution uint8 RECALLING = 7 # The goal received a cancel request before it started executing, # but the action server has not yet confirmed that the goal is canceled uint8 RECALLED = 8 # The goal received a cancel request before it started executing # and was successfully cancelled (Terminal State) uint8 LOST = 9 # An action client can determine that a goal is LOST. This should not be # sent over the wire by an action server #Allow for the user to associate a string with GoalStatus for debugging string text ================================================================================ MSG: actionlib_msgs/GoalID # The stamp should store the time at which this goal was requested. # It is used by an action server when it tries to preempt all # goals that were requested before a certain time time stamp # The id provides a way to associate feedback and # result message with specific goal requests. The id # specified must be unique. string id ================================================================================ MSG: robot_msgs/MoveArmOnTrajectoryResult # ====== DO NOT MODIFY! AUTOGENERATED FROM AN ACTION DEFINITION ====== geometry_msgs/Pose resultPose string resultMessage ================================================================================ MSG: geometry_msgs/Pose # A representation of pose in free space, composed of position and orientation. Point position Quaternion orientation ================================================================================ MSG: geometry_msgs/Point # This contains the position of a point in free space float64 x float64 y float64 z ================================================================================ MSG: geometry_msgs/Quaternion # This represents an orientation in free space in quaternion form. float64 x float64 y float64 z float64 w"; var actual = new RosbagMessageDefinitionParser(input).Parse(); Assert.NotNull(actual); Assert.NotNull(actual.Message); Assert.Equal(7, actual.NestedMessages.Count); Assert.True(actual.NestedMessages.ContainsKey(RosTypeInfo.CreateRosType("std_msgs", "Header")), "Nested message std_msgs/Header not found"); Assert.True(actual.NestedMessages.ContainsKey(RosTypeInfo.CreateRosType("actionlib_msgs", "GoalStatus")), "Nested message actionlib_msgs/GoalStatus not found"); Assert.True(actual.NestedMessages.ContainsKey(RosTypeInfo.CreateRosType("actionlib_msgs", "GoalID")), "Nested message actionlib_msgs/GoalID not found"); Assert.True(actual.NestedMessages.ContainsKey(RosTypeInfo.CreateRosType("robot_msgs", "MoveArmOnTrajectoryResult")), "Nested message robot_msgs/MoveArmOnTrajectoryResult not found"); Assert.True(actual.NestedMessages.ContainsKey(RosTypeInfo.CreateRosType("geometry_msgs", "Pose")), "Nested message geometry_msgs/Pose not found"); Assert.True(actual.NestedMessages.ContainsKey(RosTypeInfo.CreateRosType("geometry_msgs", "Point")), "Nested message geometry_msgs/Point not found"); Assert.True(actual.NestedMessages.ContainsKey(RosTypeInfo.CreateRosType("geometry_msgs", "Quaternion")), "Nested message geometry_msgs/Quaternion not found"); }