YARP
Yet Another Robot Platform
 
Loading...
Searching...
No Matches
generate_yarprobotinterface.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2024-2024 Istituto Italiano di Tecnologia (IIT)
3 * SPDX-License-Identifier: BSD-3-Clause
4 */
5
6#include "generator.h"
7#include <sstream>
8#include <iomanip>
9#include <iostream>
10#include <stack>
11
12/*
13< ? xml version = "1.0" encoding = "UTF-8" ? >
14<!DOCTYPE robot PUBLIC "-//YARP//DTD yarprobotinterface 3.0//EN" "http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd">
15<robot name = "robot1" build = "1" xmlns:xi = "http://www.w3.org/2001/XInclude">
16<devices>
17 <device xmlns:xi="http://www.w3.org/2001/XInclude" name="device_example" type="embObjBattery">
18 <param name="param_1"> 0 </param>
19 <param name="param_2"> 0 </param>
20 <group name="GROUP_PARAM1">
21 <param name="param_3"> 0 </param>
22 <param name="param_4"> 0 </param>
23 </group>
24 </devices>
25</robot>
26*/
27
28//ids stands for indentation spaces
29inline std::string ids(size_t indent)
30{
31 std::string spaces(indent*4, ' ');
32 return spaces;
33}
34
36{
37 std::ostringstream s;
38 s << "\
39<?xml version = \"1.0\" encoding = \"UTF-8\" ?>\n\
40<!DOCTYPE robot PUBLIC \"-//YARP//DTD yarprobotinterface 3.0//EN\" \"http://www.yarp.it/DTD/yarprobotinterfaceV3.0.dtd\">\n\
41<robot name = \"robot1\" build = \"1\" xmlns:xi = \"http://www.w3.org/2001/XInclude\">\n\
42<devices>\n\
43 <device xmlns:xi = \"http://www.w3.org/2001/XInclude\" name = \"device_example\" type = \"" << m_modulename << "\">\n\
44";
45
47
48 auto param_old = m_sectionGroup.iterator_get();
49 auto param_curr = m_sectionGroup.iterator_get();
50
51 std::stack <std::string> groups_to_be_closed;
52 do
53 {
54 param_old = param_curr;
55 param_curr = m_sectionGroup.iterator_get();
56
57 // Open a group section
58 if (param_curr->nestingLevel > param_old->nestingLevel)
59 {
60 s << "\n";
61 s << ids(groups_to_be_closed.size()) << " <group name=\"" << param_old->name << "\">\n";
62 groups_to_be_closed.push (param_old->name);
63 }
64
65 // Close a group section
66 if (param_curr->nestingLevel < param_old->nestingLevel)
67 {
68 s << ids(groups_to_be_closed.size()-1) << " </group>\n";
69 groups_to_be_closed.pop();
70 }
71
72 //This block generates <param name="xxxx"> yyyy </param>
73 if (param_curr->nextNode.size() == 0)
74 {
75 Parameter* pp = &(param_curr->param);
76
77 s << ids(groups_to_be_closed.size()) << " <param name=\"" << pp->getParamOnly() << "\"> ";
78 if (!pp->defaultValue.empty())
79 {
80 s << pp->defaultValue;
81 }
82 else
83 {
84 if (pp->required)
85 {
86 s << "mandatory_value";
87 }
88 else
89 {
90 s << "optional_value";
91 }
92 }
93 s << " </param>\n";
94 }
95 }
96 while (m_sectionGroup.iterator_next() != nullptr);
97
98 //empty all stack, closing all open group sections
99 while (groups_to_be_closed.size() > 0)
100 {
101 //s << "[ close " << groups_to_be_closed.top() << "]\n"; //debug only
102 s << ids(groups_to_be_closed.size()-1) << " </group>\n";
103 groups_to_be_closed.pop();
104 }
105
106 s << "\
107 </device>\n\
108</devices>\n\
109</robot>\n";
110
111 return s.str();
112}
std::string getParamOnly() const
Definition parameter.cpp:89
bool required
Definition parameter.h:30
std::string defaultValue
Definition parameter.h:29
std::string m_modulename
Definition generator.h:39
SectionHandler m_sectionGroup
Definition generator.h:35
SectionNode * iterator_next()
SectionNode * iterator_start()
SectionNode * iterator_get()
std::string ids(size_t indent)