summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatt Ranostay <matt.ranostay@konsulko.com>2017-05-31 19:51:16 +0000
committerJan-Simon Moeller <jsmoeller@linuxfoundation.org>2017-06-20 09:45:09 +0000
commit95b850fa3ae4674576a5ff7b5afd6c27b753b840 (patch)
tree28cec0c5853edb799adad045cb719bdd624cd75a
parent4c8a4dd5466b1ed0fd5412c4cb29b2f6ef8deac1 (diff)
systemd: remove automounting
Switching to more robust script to manage media insertation, and removal. Change-Id: I5ca2a9bef6178184002316155693473ac68537ac Bug-AGL: SPEC-634 Signed-off-by: Matt Ranostay <matt.ranostay@konsulko.com> Reviewed-on: https://gerrit.automotivelinux.org/gerrit/9601 Tested-by: Jenkins Job builder account <agl-jobbuilder@automotivelinux.org> ci-image-build: Jenkins Job builder account <agl-jobbuilder@automotivelinux.org> ci-image-boot-test: Jenkins Job builder account <agl-jobbuilder@automotivelinux.org> Reviewed-by: Jan-Simon Moeller <jsmoeller@linuxfoundation.org>
-rw-r--r--meta-agl/recipes-core/systemd/systemd/automount-rules19
-rw-r--r--meta-agl/recipes-core/systemd/systemd/mount.sh90
-rw-r--r--meta-agl/recipes-core/systemd/systemd_%.bbappend7
3 files changed, 0 insertions, 116 deletions
diff --git a/meta-agl/recipes-core/systemd/systemd/automount-rules b/meta-agl/recipes-core/systemd/systemd/automount-rules
deleted file mode 100644
index 62578ea63..000000000
--- a/meta-agl/recipes-core/systemd/systemd/automount-rules
+++ /dev/null
@@ -1,19 +0,0 @@
-# There are a number of modifiers that are allowed to be used in some
-# of the different fields. They provide the following subsitutions:
-#
-# %n the "kernel number" of the device.
-# For example, 'sda3' has a "kernel number" of '3'
-# %e the smallest number for that name which does not matches an existing node
-# %k the kernel name for the device
-# %M the kernel major number for the device
-# %m the kernel minor number for the device
-# %b the bus id for the device
-# %c the string returned by the PROGRAM
-# %s{filename} the content of a sysfs attribute
-# %% the '%' char itself
-#
-
-# Media automounting
-SUBSYSTEM=="block", ACTION=="add" RUN+="/etc/udev/scripts/mount.sh"
-SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh"
-SUBSYSTEM=="block", ACTION=="change", ENV{DISK_MEDIA_CHANGE}=="1" RUN+="/etc/udev/scripts/mount.sh"
diff --git a/meta-agl/recipes-core/systemd/systemd/mount.sh b/meta-agl/recipes-core/systemd/systemd/mount.sh
deleted file mode 100644
index 811e025bc..000000000
--- a/meta-agl/recipes-core/systemd/systemd/mount.sh
+++ /dev/null
@@ -1,90 +0,0 @@
-#!/bin/sh
-#
-# Called from udev
-#
-# Attempt to mount any added block devices and umount any removed devices
-
-
-MOUNT="/bin/mount -o ro"
-PMOUNT="/usr/bin/pmount"
-UMOUNT="/bin/umount"
-for line in `grep -h -v ^# /etc/udev/mount.blacklist /etc/udev/mount.blacklist.d/*`
-do
- if [ ` expr match "$DEVNAME" "$line" ` -gt 0 ];
- then
- logger "udev/mount.sh" "[$DEVNAME] is blacklisted, ignoring"
- exit 0
- fi
-done
-
-automount() {
- name="`basename "$DEVNAME"`"
-
- ! test -d "/run/media/$name" && mkdir -p "/run/media/$name"
- # Silent util-linux's version of mounting auto
- if [ "x`readlink $MOUNT`" = "x/bin/mount.util-linux" ] ;
- then
- MOUNT="$MOUNT -o silent"
- fi
-
- # If filesystem type is vfat, change the ownership group to 'disk', and
- # grant it with w/r/x permissions.
- case $ID_FS_TYPE in
- vfat|fat)
- MOUNT="$MOUNT -o umask=007,gid=`awk -F':' '/^disk/{print $3}' /etc/group`"
- ;;
- # TODO
- *)
- ;;
- esac
-
- if ! $MOUNT -t auto $DEVNAME "/run/media/$name"
- then
- #logger "mount.sh/automount" "$MOUNT -t auto $DEVNAME \"/run/media/$name\" failed!"
- rm_dir "/run/media/$name"
- else
- logger "mount.sh/automount" "Auto-mount of [/run/media/$name] successful"
- touch "/tmp/.automount-$name"
- fi
-}
-
-rm_dir() {
- # We do not want to rm -r populated directories
- if test "`find "$1" | wc -l | tr -d " "`" -lt 2 -a -d "$1"
- then
- ! test -z "$1" && rm -r "$1"
- else
- logger "mount.sh/automount" "Not removing non-empty directory [$1]"
- fi
-}
-
-# No ID_FS_TYPE for cdrom device, yet it should be mounted
-name="`basename "$DEVNAME"`"
-[ -e /sys/block/$name/device/media ] && media_type=`cat /sys/block/$name/device/media`
-
-if [ "$ACTION" = "add" ] && [ -n "$DEVNAME" ] && [ -n "$ID_FS_TYPE" -o "$media_type" = "cdrom" ]; then
- if [ -x "$PMOUNT" ]; then
- $PMOUNT $DEVNAME 2> /dev/null
- elif [ -x $MOUNT ]; then
- $MOUNT $DEVNAME 2> /dev/null
- fi
-
- # If the device isn't mounted at this point, it isn't
- # configured in fstab (note the root filesystem can show up as
- # /dev/root in /proc/mounts, so check the device number too)
- if expr $MAJOR "*" 256 + $MINOR != `stat -c %d /`; then
- grep -q "^$DEVNAME " /proc/mounts || automount
- fi
-fi
-
-
-if [ "$ACTION" = "remove" ] || [ "$ACTION" = "change" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then
- for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " `
- do
- $UMOUNT $mnt
- done
-
- # Remove empty directories from auto-mounter
- name="`basename "$DEVNAME"`"
- test -e "/tmp/.automount-$name" && rm_dir "/run/media/$name"
-fi
diff --git a/meta-agl/recipes-core/systemd/systemd_%.bbappend b/meta-agl/recipes-core/systemd/systemd_%.bbappend
index 0a6d6047c..ef877c0c1 100644
--- a/meta-agl/recipes-core/systemd/systemd_%.bbappend
+++ b/meta-agl/recipes-core/systemd/systemd_%.bbappend
@@ -1,8 +1,6 @@
FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI += "file://e2fsck.conf \
- file://automount-rules \
- file://mount.sh \
${@bb.utils.contains('VIRTUAL-RUNTIME_net_manager','systemd','file://wired.network','',d)} \
"
@@ -15,11 +13,6 @@ do_install_append() {
# Install /etc/e2fsck.conf to avoid boot stuck by wrong clock time
install -m 644 -p -D ${WORKDIR}/e2fsck.conf ${D}${sysconfdir}/e2fsck.conf
- if ${@bb.utils.contains('DISTRO_FEATURES', 'automount', 'true', 'false', d)}; then
- install -m 644 -p -D ${WORKDIR}/automount-rules ${D}${sysconfdir}/udev/rules.d/10-automount.rules
- install -m 755 -p -D ${WORKDIR}/mount.sh ${D}${sysconfdir}/udev/scripts/mount.sh
- fi
-
if ${@bb.utils.contains('VIRTUAL-RUNTIME_net_manager','systemd','true','false',d)}; then
# Install DHCP configuration for Ethernet adapters
install -m 644 ${WORKDIR}/wired.network ${D}${sysconfdir}/systemd/network
} /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */ }
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<title>UNICENS: Node Scripting</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link rel="shortcut icon" type="image/x-icon" href="favicon.ico">
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<script type="text/javascript">
  $(document).ready(initResizable);
</script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/search.js"></script>
<script type="text/javascript">
  $(document).ready(function() { searchBox.OnSelectItem(0); });
</script>
<link href="style_html.css" rel="stylesheet" type="text/css" />
<link href="inic.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<div class="GlobalWrapper">
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr>
  <td><a href="index.html"><img alt="Logo" src="logo.png"/></a></td>
  <td>
   <div id="projectname">UNICENS&#160;<span id="projectnumber">V2.1.0-3491</span></div>
   <div id="projectbrief">User Manual and API Reference</div>
    <div id="searchbox">        <div id="MSearchBox" class="MSearchBoxInactive">
        <span class="left">
          <img id="MSearchSelect" src="search/mag_sel.png"
               onmouseover="return searchBox.OnSearchSelectShow()"
               onmouseout="return searchBox.OnSearchSelectHide()"
               alt=""/>
          <input type="text" id="MSearchField" value="Search" accesskey="S"
               onfocus="searchBox.OnSearchFieldFocus(true)" 
               onblur="searchBox.OnSearchFieldFocus(false)" 
               onkeyup="searchBox.OnSearchFieldChange(event)"/>
          </span><span class="right">
            <a id="MSearchClose" href="javascript:searchBox.CloseResultsWindow()"><img id="MSearchCloseImg" border="0" src="search/close.png" alt=""/></a>
          </span>
        </div>
</div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- Generated by Doxygen 1.8.2 -->
<script type="text/javascript">
var searchBox = new SearchBox("searchBox", "search",false,'Search');
</script>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
$(document).ready(function(){initNavTree('_p__u_m__s_t_a_r_t_e_d__n_o_d_e__s_c_r_i_p_t.html','');});
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
<a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(0)"><span class="SelectionMark">&#160;</span>All</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(1)"><span class="SelectionMark">&#160;</span>Data Structures</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(2)"><span class="SelectionMark">&#160;</span>Functions</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(3)"><span class="SelectionMark">&#160;</span>Variables</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(4)"><span class="SelectionMark">&#160;</span>Typedefs</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(5)"><span class="SelectionMark">&#160;</span>Enumerations</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(6)"><span class="SelectionMark">&#160;</span>Enumerator</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(7)"><span class="SelectionMark">&#160;</span>Groups</a><a class="SelectItem" href="javascript:void(0)" onclick="searchBox.OnSelectItem(8)"><span class="SelectionMark">&#160;</span>Pages</a></div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="headertitle">
<div class="title">Node Scripting </div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><h1>Introduction</h1>
<p>The idea behind the Node Scripting is to allow execution of custom scripts in remote Nodes. That is, user can specify scripts based on FBlock command syntax and run these on remote nodes by the use of Node Scripting module. <br/>
 The module is designed and intended for the use of <b>I2C</b> and <b>GPIO</b> commands only. This means that using the Scripting module for any other FBlock INIC commands (MOST, MediaLB, USB, Streaming or Connection for example) is expressly <b>prohibited</b>.</p>
<p>A script is a structure data (see below) composed of:</p>
<ul>
<li>The command based on INIC FBlock-Syntax to be transmitted</li>
<li>The expected result also based on INIC FBlock-Syntax.</li>
<li>The amount time [in milliseconds] to pause before sending the Tx command.</li>
</ul>
<div class="fragment"><div class="line"><span class="comment">/*! \brief Structure of a node-script */</span></div>
<div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span>Ucs_Ns_Script_</div>
<div class="line">{<span class="comment"></span></div>
<div class="line"><span class="comment">    /*! \brief Specifies the pause which shall be set before sending</span></div>
<div class="line"><span class="comment">               the Tx configuration message. </span></div>
<div class="line"><span class="comment">     */</span></div>
<div class="line">    uint16_t pause;<span class="comment"></span></div>
<div class="line"><span class="comment">    /*! \brief Send command to be transmitted. */</span></div>
<div class="line">    <a class="code" href="struct_ucs___ns___config_msg__t.html" title="Structure of a ConfigMsg used in Node-Script.">Ucs_Ns_ConfigMsg_t</a> * send_cmd;<span class="comment"></span></div>
<div class="line"><span class="comment">    /*! \brief Expected result. */</span></div>
<div class="line">    <a class="code" href="struct_ucs___ns___config_msg__t.html" title="Structure of a ConfigMsg used in Node-Script.">Ucs_Ns_ConfigMsg_t</a> * exp_result;</div>
<div class="line"></div>
<div class="line">} <a class="code" href="struct_ucs___ns___script__t.html" title="Structure of a node-script used to configure a remote node.">Ucs_Ns_Script_t</a>;</div>
</div><!-- fragment --><p>A <a class="el" href="struct_ucs___ns___config_msg__t.html" title="Structure of a ConfigMsg used in Node-Script.">Ucs_Ns_ConfigMsg_t</a> message is based on INIC FBlock-Syntax and looks like this: </p>
<div class="fragment"><div class="line"><span class="comment">/*! \brief Structure of a ConfigMsg */</span></div>
<div class="line"><span class="keyword">typedef</span> <span class="keyword">struct </span>Ucs_Ns_ConfigMsg_</div>
<div class="line">{<span class="comment"></span></div>
<div class="line"><span class="comment">    /*! \brief FBlockId. */</span></div>
<div class="line">    uint8_t FBlockId;<span class="comment"></span></div>
<div class="line"><span class="comment">    /*! \brief InstId. */</span></div>
<div class="line">    uint8_t InstId;<span class="comment"></span></div>
<div class="line"><span class="comment">    /*! \brief FunktId. */</span></div>
<div class="line">    uint16_t FunktId;<span class="comment"></span></div>
<div class="line"><span class="comment">    /*! \brief OpCode. */</span></div>
<div class="line">    uint8_t OpCode;<span class="comment"></span></div>
<div class="line"><span class="comment">    /*! \brief Data length. */</span></div>
<div class="line">    uint8_t DataLen;<span class="comment"></span></div>
<div class="line"><span class="comment">    /*! \brief Reference to the Data */</span></div>
<div class="line">    uint8_t * DataPtr;</div>
<div class="line"></div>
<div class="line">} <a class="code" href="struct_ucs___ns___config_msg__t.html" title="Structure of a ConfigMsg used in Node-Script.">Ucs_Ns_ConfigMsg_t</a>;</div>
</div><!-- fragment --><h1>Operation</h1>
<p>The user specifies the desired scripts, binds them to the target nodes and then call the function <a class="el" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_ga2f2737e4d507b9c15e165918db3f1456.html#ga2f2737e4d507b9c15e165918db3f1456" title="Runs the script(s) contained in the given node.">Ucs_Ns_Run()</a> for processing. The result of the operation is reported via the result callback function <a class="el" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_gab0f1bc424462b8bbe0b2155d504025a5.html#gab0f1bc424462b8bbe0b2155d504025a5">Ucs_Ns_ResultCb_t</a>, which is passed by user in the arguments list of <a class="el" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_ga2f2737e4d507b9c15e165918db3f1456.html#ga2f2737e4d507b9c15e165918db3f1456" title="Runs the script(s) contained in the given node.">Ucs_Ns_Run()</a>. In addition to this callback function and the referred UCS instance the function requires a reference to the Node that contains the script(s).</p>
<div class="fragment"><div class="line"><a class="code" href="group___g___u_c_s___i_n_i_t___a_n_d___s_r_v___t_y_p_e_s_ga886138f5d13e84ffaa3df5769830e1cd.html#ga886138f5d13e84ffaa3df5769830e1cd" title="Standard return codes used for synchronous response.">Ucs_Return_t</a> <a class="code" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_ga2f2737e4d507b9c15e165918db3f1456.html#ga2f2737e4d507b9c15e165918db3f1456" title="Runs the script(s) contained in the given node.">Ucs_Ns_Run</a>(<a class="code" href="group___g___u_c_s___i_n_i_t___a_n_d___s_r_v___t_y_p_e_s_ga074c04d40d00986e0c869adaec8fadda.html#ga074c04d40d00986e0c869adaec8fadda" title="UNICENS instance.">Ucs_Inst_t</a> *<span class="keyword">self</span>, <a class="code" href="struct_ucs___rm___node__t.html" title="Configuration structure of a Node.">Ucs_Rm_Node_t</a> * node_ptr, <a class="code" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_gab0f1bc424462b8bbe0b2155d504025a5.html#gab0f1bc424462b8bbe0b2155d504025a5" title="Function signature used for the results of the Scripting Manager.">Ucs_Ns_ResultCb_t</a> result_fptr);</div>
</div><!-- fragment --><p>The <a class="el" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_ga2f2737e4d507b9c15e165918db3f1456.html#ga2f2737e4d507b9c15e165918db3f1456" title="Runs the script(s) contained in the given node.">Ucs_Ns_Run()</a> function starts the process to transmit the script(s) contained in the provided node and then checks for the expected results (specified by customer). The Node Scripting module will start a timer of 2600ms before sending the Tx command of each script. That is, if no incoming messages match the expected result of the script during this time the result code <a class="el" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_gabd3ecc8ab539f3b9de3fc8045c083b60.html#ggabd3ecc8ab539f3b9de3fc8045c083b60ad0ba0f8f6ba494e7685980d490e48b72">UCS_NS_RES_ERROR</a> is returned via the <a class="el" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_gab0f1bc424462b8bbe0b2155d504025a5.html#gab0f1bc424462b8bbe0b2155d504025a5">Ucs_Ns_ResultCb_t</a> user callback function. This error code is also get when the script module couldn't perform the device synchronization of the remote device (this can be read in the detailed error messages, if enabled. See below). Otherwise, if an incoming message matches the expected result, <a class="el" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_gabd3ecc8ab539f3b9de3fc8045c083b60.html#ggabd3ecc8ab539f3b9de3fc8045c083b60af22bd910a1d7e2271b5b3cddf5892962">UCS_NS_RES_SUCCESS</a> is returned.</p>
<p>The <a class="el" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_ga2f2737e4d507b9c15e165918db3f1456.html#ga2f2737e4d507b9c15e165918db3f1456" title="Runs the script(s) contained in the given node.">Ucs_Ns_Run()</a> function will return <a class="el" href="group___g___u_c_s___i_n_i_t___a_n_d___s_r_v___t_y_p_e_s_ga886138f5d13e84ffaa3df5769830e1cd.html#gga886138f5d13e84ffaa3df5769830e1cdad4a30091202638c890abbdb682ca4fe5">UCS_RET_ERR_API_LOCKED</a> when attempting to execute a script in a node that is currently busy with other(s) previous script(s). The <a class="el" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_ga2f2737e4d507b9c15e165918db3f1456.html#ga2f2737e4d507b9c15e165918db3f1456" title="Runs the script(s) contained in the given node.">Ucs_Ns_Run()</a> function is namely locked for a Node when handling script(s) on this node and unlocked after reporting the result of the operation. However processing scripts can be executed on different nodes in parallel.</p>
<p>The detailed error messages can be read when enabling the error trace output in <code>ucs_cfg.h</code> file as shown below.</p>
<div class="fragment"><div class="line"><span class="comment">/* File: ucs_cfg.h */</span></div>
<div class="line"><span class="comment">/*------------------------------------------------------------------------------------------------*/</span></div>
<div class="line"><span class="comment">/* Tracing &amp; Debugging                                                                            */</span></div>
<div class="line"><span class="comment">/*------------------------------------------------------------------------------------------------*/</span></div>
<div class="line"><span class="preprocessor"># define UCS_TR_ERROR     App_TraceError</span></div>
<div class="line"><span class="preprocessor"></span></div>
<div class="line"><span class="keyword">extern</span> <span class="keywordtype">void</span> App_TraceError(<span class="keywordtype">void</span> *ucs_user_ptr, <span class="keyword">const</span> <span class="keywordtype">char</span> module_str[], <span class="keyword">const</span> <span class="keywordtype">char</span> entry_str[], </div>
<div class="line">                           uint16_t vargs_cnt, ...); </div>
</div><!-- fragment --><div class="fragment"><div class="line"><span class="comment">/* File: app_trace.c */</span></div>
<div class="line"><span class="keywordtype">void</span> App_TraceError(<span class="keywordtype">void</span> *ucs_user_ptr, <span class="keyword">const</span> <span class="keywordtype">char</span> module_str[], <span class="keyword">const</span> <span class="keywordtype">char</span> entry_str[], </div>
<div class="line">                    uint16_t vargs_cnt, ...)</div>
<div class="line">{</div>
<div class="line">    <span class="keywordflow">if</span> (file_ != NULL)</div>
<div class="line">    {</div>
<div class="line">        <span class="keywordtype">char</span> outbuf[256];</div>
<div class="line">        va_list argptr;</div>
<div class="line">        uint16_t timestamp = (uint16_t)timeGetTime() - startup_time;</div>
<div class="line">        va_start(argptr, vargs_cnt);</div>
<div class="line">        (void)vsprintf(outbuf, entry_str, argptr);</div>
<div class="line">        va_end(argptr);</div>
<div class="line">        (void)fprintf(file_, <span class="stringliteral">&quot;%5u | [%u] | Error  | %s | %s\n&quot;</span>, timestamp, ucs_user_ptr, module_str, outbuf);</div>
<div class="line">        (void)fflush(file_);</div>
<div class="line">    }</div>
<div class="line">}</div>
</div><!-- fragment --><h1>Example</h1>
<p>The example below outlines the execution of a script within a node with address 0x200. This example is inserted as a guide and may not contain all of the necessary details and information.</p>
<div class="fragment"><div class="line"><span class="comment">/* Flag that checks whether node with address 0x200 is discovered by Node Discovering */</span></div>
<div class="line"><span class="keyword">static</span> <span class="keywordtype">bool</span> node200_discovered = <span class="keyword">false</span>;</div>
<div class="line"></div>
<div class="line"><span class="comment">/* Forward declaration of result callback function */</span></div>
<div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span> App_OnScriptingResult(uint16_t node_address, <a class="code" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_gabd3ecc8ab539f3b9de3fc8045c083b60.html#gabd3ecc8ab539f3b9de3fc8045c083b60" title="Result codes of the Node Script Management.">Ucs_Ns_ResultCode_t</a> result, <span class="keywordtype">void</span> *user_ptr);</div>
<div class="line"></div>
<div class="line"><span class="comment">/* Configuration Msg specification */</span></div>
<div class="line"><span class="keyword">static</span> uint8_t  tx_data []  = { 0x00, 0x40, 0x01, 0x01 };</div>
<div class="line"><span class="keyword">static</span> uint8_t  rx_data []  = { 0x0F, 0x00 };</div>
<div class="line"><span class="keyword">static</span> <a class="code" href="struct_ucs___ns___config_msg__t.html" title="Structure of a ConfigMsg used in Node-Script.">Ucs_Ns_ConfigMsg_t</a> tx_msg = { 0x00, 0x00, 0x6C1, 0x2,  4U, &amp;tx_data };</div>
<div class="line"><span class="keyword">static</span> <a class="code" href="struct_ucs___ns___config_msg__t.html" title="Structure of a ConfigMsg used in Node-Script.">Ucs_Ns_ConfigMsg_t</a> rx_msg = { 0x00, 0x01, 0x6C1, 0xC,  2U, &amp;rx_data };</div>
<div class="line"></div>
<div class="line"><span class="comment">/* Scripts specification */</span></div>
<div class="line"><span class="keyword">static</span> <a class="code" href="struct_ucs___ns___script__t.html" title="Structure of a node-script used to configure a remote node.">Ucs_Ns_Script_t</a>  script_x = { 100U, &amp;tx_msg, &amp;rx_msg };</div>
<div class="line"></div>
<div class="line"><span class="comment">/* Signature specification */</span></div>
<div class="line"><a class="code" href="struct_ucs___signature__t.html" title="This structure holds the signature of the Hello, Welcome and Signature messages. It supports the sign...">Ucs_Signature_t</a> sig_200  = { 200U };</div>
<div class="line"></div>
<div class="line"><span class="comment">/* Nodes objects Specification */</span></div>
<div class="line"><span class="keyword">static</span> <a class="code" href="struct_ucs___rm___node__t.html" title="Configuration structure of a Node.">Ucs_Rm_Node_t</a> node_200 = { &amp;sig_200, &amp;script_x, 1U, 0U };</div>
<div class="line"></div>
<div class="line"><span class="comment">/* Main function */</span></div>
<div class="line"><span class="keywordtype">void</span> main(uint8_t argc, <span class="keywordtype">char</span> *argv[])</div>
<div class="line">{</div>
<div class="line"></div>
<div class="line">    <span class="comment">/* ... */</span></div>
<div class="line"></div>
<div class="line">    <span class="keywordflow">if</span> (node200_discovered)</div>
<div class="line">    {</div>
<div class="line">        (void)<a class="code" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_ga2f2737e4d507b9c15e165918db3f1456.html#ga2f2737e4d507b9c15e165918db3f1456" title="Runs the script(s) contained in the given node.">Ucs_Ns_Run</a>(ucs_inst_ptr, &amp;node_200, &amp;App_OnScriptingResult);</div>
<div class="line">    }</div>
<div class="line"></div>
<div class="line">    <span class="comment">/* ... */</span></div>
<div class="line">}</div>
<div class="line"></div>
<div class="line"><span class="comment">/* The result callback function */</span></div>
<div class="line"><span class="keyword">static</span> <span class="keywordtype">void</span> App_OnScriptingResult(<a class="code" href="struct_ucs___rm___node__t.html" title="Configuration structure of a Node.">Ucs_Rm_Node_t</a> * node_ptr, <a class="code" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_gabd3ecc8ab539f3b9de3fc8045c083b60.html#gabd3ecc8ab539f3b9de3fc8045c083b60" title="Result codes of the Node Script Management.">Ucs_Ns_ResultCode_t</a> result, <span class="keywordtype">void</span> *user_ptr)</div>
<div class="line">{</div>
<div class="line">     <span class="keywordflow">switch</span> (result)</div>
<div class="line">     {</div>
<div class="line">         <span class="keywordflow">case</span> <a class="code" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_gabd3ecc8ab539f3b9de3fc8045c083b60.html#ggabd3ecc8ab539f3b9de3fc8045c083b60af22bd910a1d7e2271b5b3cddf5892962" title="Transmission of script(s) was successful.">UCS_NS_RES_SUCCESS</a>:</div>
<div class="line">           <span class="comment">/* Node can be set to &quot;Available&quot; for example */</span></div>
<div class="line">           <a class="code" href="group___g___u_c_s___r_o_u_t_i_n_g_ga57ca34a488f06d57f2219be23fa0259f.html#ga57ca34a488f06d57f2219be23fa0259f" title="Sets the availability attribute (available or not available) of the given node and triggers the routi...">Ucs_Rm_SetNodeAvailable</a>(ucs_inst_ptr, node_ptr, <span class="keyword">true</span>);</div>
<div class="line">           <span class="keywordflow">break</span>;</div>
<div class="line"></div>
<div class="line">         <span class="keywordflow">case</span> <a class="code" href="group___g___u_c_s___s_c_r_i_p_t_i_n_g_gabd3ecc8ab539f3b9de3fc8045c083b60.html#ggabd3ecc8ab539f3b9de3fc8045c083b60ad0ba0f8f6ba494e7685980d490e48b72" title="Transmission of script(s) failed.">UCS_NS_RES_ERROR</a>:</div>
<div class="line">         <span class="keywordflow">default</span>:</div>
<div class="line">           <span class="comment">/* Do whatever is necessary here */</span></div>
<div class="line">           <span class="keywordflow">break</span>;</div>
<div class="line">     }</div>
<div class="line">}</div>
</div><!-- fragment --> </div></div><!-- contents -->
</div><!-- doc-content -->
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="footer">&copy; 2017 Microchip Technology Inc. All rights reserved. <a href="http://www.microchip.com" target="_blank">www.microchip.com</a></li>
  </ul>
</div>
</body>
<!--
Generated on Mon Apr 3 2017 13:52:59 for UNICENS by
Doxygen 1.8.2
-->
<script language="javascript">
<!--
$('#MSearchResults').wrap('<div style="position: absolute; margin-left: 444px;"></div>');
-->
</script>
</html>