## The following macros allow us to push name/desc/sub/... or node.name/node.desc/node.sub/... into node.0.name <?cs def:copy(__from,__from_str) ?> <?cs if:(__from && !node.0)?> <?cs set:node.0[__from_str] = __from?> <?cs /if?> <?cs if:(node[__from_str] && !node.0)?> <?cs set:node.0[__from_str] = node[__from_str]?> <?cs /if?> <?cs /def?> <?cs def:copy_list(__from,__from_str) ?> <?cs if:(__from.no_header && !node.0)?> <?cs set:node.0[__from_str].no_header = __from.no_header?> <?cs /if?> <?cs if:(node[__from_str].no_header && !node.0)?> <?cs set:node.0[__from_str].no_header = node[__from_str].no_header?> <?cs /if?> <?cs each:_e=__from?> <?cs each:_sube=_e?> <?cs set:node.0[__from_str][name(_e)][name(_sube)] = _sube?> <?cs /each?> <?cs /each?> <?cs each:_g=__from.group?> <?cs each:_subg=_g?> <?cs set:node.0[__from_str].group[name(_g)][name(_subg)] = _subg?> <?cs each:_subge=_subg?> <?cs set:node.0[__from_str].group[name(_g)][name(_subg)][name(_subge)] = _subge?> <?cs /each?> <?cs /each?> <?cs /each?> <?cs each:_e=node[__from_str]?> <?cs each:_sube=_e?> <?cs set:node.0[__from_str][name(_e)][name(_sube)] = _sube?> <?cs /each?> <?cs /each?> <?cs each:_g=node[__from_str].group?> <?cs each:_subg=_g?> <?cs set:node.0[__from_str].group[name(_g)][name(_subg)] = _subg?> <?cs each:_subge=_subg?> <?cs set:node.0[__from_str].group[name(_g)][name(_subg)][name(_subge)] = _subge?> <?cs /each?> <?cs /each?> <?cs /each?> <?cs /def?> <?cs call:copy(name,"name")?> <?cs call:copy(desc,"desc")?> <?cs call:copy_list(pub,"pub")?> <?cs call:copy_list(goal,"goal")?> <?cs call:copy_list(result,"result")?> <?cs call:copy_list(feedback,"feedback")?> <?cs call:copy_list(act_called,"act_called")?> <?cs call:copy_list(sub,"sub")?> <?cs call:copy_list(srv,"srv")?> <?cs call:copy_list(srv_called,"srv_called")?> <?cs call:copy_list(param,"param")?> <?cs call:copy_list(param_set,"param_set")?> <?cs call:copy_list(req_tf,"req_tf")?> <?cs call:copy_list(prov_tf,"prov_tf")?> <?cs each:_n=node?> <?cs each:_l=_n?> <?cs each:_e=_l?> <?cs if:(name(_e) != 'group')?> <?cs each:_sube=_e?> <?cs set:_l.group.0[name(_e)][name(_sube)] = _sube?> <?cs /each?> <?cs /if?> <?cs /each?> <?cs /each?> <?cs /each?> <?cs def:action_list(__name,__var,node_name)?> {{{{#!wiki seesaw actions<?cs var:node_name?> all<?cs var:node_name?> <?cs if:(subcount(__var))?> <?cs if:!__var.no_header?> ==== <?cs var:__name?> ==== <?cs /if?> <?cs each:_group=__var.group?> <?cs if:_group.name?> ===== <?cs var:_group.name ?> ===== <?cs var:_group.desc ?> ## Need this . to break paragraph . <?cs /if?> <?cs each:_elem=_group?> <?cs if:(name(_elem) != 'name' && name(_elem) != 'desc')?> `<?cs var:_elem.name ?>` ([[<?cs var:_elem.type ?>]]) <?cs var:_elem.desc ?> <?cs /if?> <?cs /each ?> <?cs /each ?> <?cs /if?> }}}} <?cs /def?> <?cs def:topic_list(__name,__var,node_name)?> {{{{#!wiki seesaw topics<?cs var:node_name?> all<?cs var:node_name?> <?cs if:(subcount(__var))?> <?cs if:!__var.no_header?> ==== <?cs var:__name?> ==== <?cs /if?> <?cs each:_group=__var.group?> <?cs if:_group.name?> ===== <?cs var:_group.name ?> ===== <?cs var:_group.desc ?> ## Need this . to break paragraph . <?cs /if?> <?cs each:_elem=_group?> <?cs if:(name(_elem) != 'name' && name(_elem) != 'desc')?> `<?cs var:_elem.name ?>` (<<MsgLink(<?cs var:_elem.type ?>)>>) <?cs var:_elem.desc ?> <?cs /if?> <?cs /each ?> <?cs /each ?> <?cs /if?> }}}} <?cs /def?> <?cs def:service_list(__name,__var,node_name)?> {{{{#!wiki seesaw services<?cs var:node_name?> all<?cs var:node_name?> <?cs if:(subcount(__var))?> <?cs if:!__var.no_header?> ==== <?cs var:__name?> ==== <?cs /if?> <?cs each:_group=__var.group?> <?cs if:_group.name?> ===== <?cs var:_group.name ?> ===== <?cs var:_group.desc ?> ## Need this . to break paragraph . <?cs /if?> <?cs each:_elem=_group?> <?cs if:(name(_elem) != 'name' && name(_elem) != 'desc')?> `<?cs var:_elem.name ?>` (<<SrvLink(<?cs var:_elem.type ?>)>>) <?cs var:_elem.desc ?> <?cs /if?> <?cs /each ?> <?cs /each ?> <?cs /if?> }}}} <?cs /def?> <?cs def:param_list(__name,__var,node_name)?> {{{{#!wiki seesaw params<?cs var:node_name?> all<?cs var:node_name?> <?cs if:(subcount(__var))?> <?cs if:!__var.no_header?> ==== <?cs var:__name?> ==== <?cs /if?> <?cs each:_group=__var.group?> <?cs if:_group.name?> ===== <?cs var:_group.name ?> ===== <?cs var:_group.desc ?> ## Need this . to break paragraph . <?cs /if?> <?cs each:_elem=_group?> <?cs if:(name(_elem) != 'name' && name(_elem) != 'desc')?> `<?cs var:_elem.name ?>` (`<?cs var:_elem.type ?>`<?cs if:(_elem.default)?>, default: <?cs var:_elem.default ?><?cs /if?>) <?cs var:_elem.desc ?> <?cs /if?> <?cs /each ?> <?cs /each ?> <?cs /if?> }}}} <?cs /def?> <?cs def:tf_list(__name,__var,node_name)?> {{{{#!wiki seesaw tf<?cs var:node_name?> all<?cs var:node_name?> <?cs if:(subcount(__var))?> <?cs if:!__var.no_header?> ==== <?cs var:__name?> ==== <?cs /if?> <?cs each:_group=__var.group?> <?cs if:_group.name?> ===== <?cs var:_group.name ?> ===== <?cs var:_group.desc ?> ## Need this . to break paragraph . <?cs /if?> <?cs each:_elem=_group?> <?cs if:(name(_elem) != 'name' && name(_elem) != 'desc')?> `<?cs var:_elem.from ?>` → `<?cs var:_elem.to ?>` <?cs var:_elem.desc ?> <?cs /if?> <?cs /each ?> <?cs /each ?> <?cs /if?> }}}} <?cs /def?> <?cs each:_node=node ?> <?cs if:_node.name?> === <?cs var:_node.name ?> === <?cs var:_node.desc ?> .<?cs if:subcount(_node.sub) || subcount(_node.pub)?> <<SeeSaw("%topics<?cs var:_node.name ?>/-all<?cs var:_node.name ?>", Topics)>>{{{ }}} <?cs /if?> <?cs if:subcount(_node.srv) || subcount(_node.srv_called)?> <<SeeSaw("%services<?cs var:_node.name ?>/-all<?cs var:_node.name ?>", Services)>>{{{ }}} <?cs /if?> <?cs if:subcount(_node.param) || subcount(_node.param_set)?> <<SeeSaw("%params<?cs var:_node.name ?>/-all<?cs var:_node.name ?>", Params)>>{{{ }}} <?cs /if?> <?cs if:subcount(_node.req_tf)|| subcount(_node.prov_tf)?> <<SeeSaw("%tf<?cs var:_node.name ?>/-all<?cs var:_node.name ?>", tf)>>{{{ }}} <?cs /if?> <?cs if:subcount(_node.act_called)?> <<SeeSaw("%actions<?cs var:_node.name ?>/-all<?cs var:_node.name ?>", Actions)>>{{{ }}} <?cs /if?> <<SeeSaw("%all<?cs var:_node.name ?>", All)>>{{{ }}} <?cs /if?> <?cs if:!_node.name?> <<SeeSaw("all<?cs var:_node.name ?>", show=True)>> <?cs /if?> <?cs call:topic_list("Action Goal", _node.goal,_node.name)?> <?cs call:topic_list("Action Result", _node.result, _node.name)?> <?cs call:topic_list("Action Feedback", _node.feedback, _node.name)?> <?cs call:action_list("Actions Called", _node.act_called, _node.name)?> <?cs call:topic_list("Subscribed Topics", _node.sub, _node.name)?> <?cs call:topic_list("Published Topics", _node.pub, _node.name)?> <?cs call:service_list("Services", _node.srv, _node.name)?> <?cs call:service_list("Services Called", _node.srv_called, _node.name)?> <?cs call:param_list("Parameters", _node.param, _node.name)?> <?cs call:param_list("Parameters Set", _node.param_set, _node.name)?> <?cs call:tf_list("Required tf Transforms", _node.req_tf, _node.name)?> <?cs call:tf_list("Provided tf Transforms", _node.prov_tf, _node.name)?> <?cs /each ?>