<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Cecilia Tetlow, Author at DMC, Inc.</title>
	<atom:link href="https://static.dmcinfo.com/blog/author/ceciliab/feed/index.xml" rel="self" type="application/rss+xml" />
	<link></link>
	<description></description>
	<lastBuildDate>Thu, 20 Aug 2026 19:33:18 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</generator>

<image>
	<url>https://static.dmcinfo.com/wp-content/uploads/2025/04/site-icon-150x150.png</url>
	<title>Cecilia Tetlow, Author at DMC, Inc.</title>
	<link></link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Young Women Learn to Code with DMC</title>
		<link>https://static.dmcinfo.com/blog/21765/young-women-learn-to-code-with-dmc/</link>
		
		<dc:creator><![CDATA[Cecilia Tetlow]]></dc:creator>
		<pubDate>Mon, 08 Apr 2019 13:40:25 +0000</pubDate>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Houston]]></category>
		<category><![CDATA[Locations]]></category>
		<category><![CDATA[Special Events]]></category>
		<category><![CDATA[DMC Cares]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/21765/young-women-learn-to-code-with-dmc/</guid>

					<description><![CDATA[<p>This year, DMC took the opportunity to present at the 27th Annual Houston Expand Your Horizons in Science and Mathematics (EYH) conference at Spring Forest Middle School. What is EYH? EYH is an event for middle school girls designed to nurture their interests in mathematics, science, and technology. Around 450 girls attend each year, and [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/21765/young-women-learn-to-code-with-dmc/">Young Women Learn to Code with DMC</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">This year, DMC took the opportunity to present at the 27<sup>th</sup> Annual Houston <a href="https://westharriscounty-tx.aauw.net/activities-interest-groups/eyh/"><strong>Expand Your Horizons in Science and Mathematics (EYH)</strong></a> conference at Spring Forest Middle School.</p>



<h2 class="wp-block-heading" id="h-what-is-eyh">What is EYH?</h2>



<p class="wp-block-paragraph">EYH is an event for middle school girls designed to nurture their interests in mathematics, science, and technology. Around 450 girls attend each year, and a typical day consists of four&nbsp;hands-on workshops in various STEM-related fields. <a href="/contact/dmc-houston">DMC Houston</a> engineers, including&nbsp;<a href="https://static.dmcinfo.com/about/employee-bios/elizabeth-goodnight">Elizabeth</a>,&nbsp;<a href="https://static.dmcinfo.com/about/employee-bios/maddie-drake">Maddie</a>&nbsp;and <a href="https://static.dmcinfo.com/about/employee-bios/cecilia-brookshier">I</a>,&nbsp;put together coding demonstrations to get them interested in programming.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Maddie-Ceci-and-Elizabeth.jpg" alt="DMC houston girls"/></figure>



<h2 class="wp-block-heading" id="h-fun-processing-demos">Fun Processing Demos</h2>



<p class="wp-block-paragraph">After a quick ten-minute introduction to DMC and our backgrounds, the girls got to begin coding with a programming language called <a href="https://www.google.com/search?q=processing&amp;rlz=1C1GCEU_enUS819US820&amp;oq=processing&amp;aqs=chrome..69i57j69i60l5.1471j0j9&amp;sourceid=chrome&amp;ie=UTF-8">Processing</a>. Processing is an open-source graphical library, which makes it a great tool for teaching the fundamentals of computer programming.</p>



<p class="wp-block-paragraph">The first demo consisted of programming the proper sequence for a stoplight. The girls were given a template project that provided them with three functions: TurnOn, TurnOff, and Wait. They then had to use the functions in the proper order and with the correct arguments to simulate a stoplight. When done correctly, the program would run as demonstrated in the video below.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Stoplight.png" alt="Stoplight code"/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Stoplight-Gif.gif" alt="Stoplight"/></figure>



<p class="wp-block-paragraph">The second demo utilized x-y coordinate systems to draw a house. The girls were given a template project that contained a partially completed house. It was up to them to draw the remaining pieces with the proper coordinates. The last step was to color in the image using RGB values.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/House-R.png" alt="House Demo"/></figure>



<h2 class="wp-block-heading" id="h-take-home-usbs">Take-Home USBs</h2>



<p class="wp-block-paragraph">After each session was over, the girls got to take home a USB that contained their stoplight project, their house project, and the Processing software. The goal was to encourage them to continue developing their programming capabilities outside of the EYH workshop.</p>



<p class="wp-block-paragraph">Overall, the conference was a great experience, and hopefully, the girls enjoyed it as much as we did. As a company with a strong female presence, DMC is happy to foster young women and encourage them to pursue careers in STEM.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Women-at-DMC-R.png" alt="Women at DMC"/></figure>



<p class="wp-block-paragraph"><strong>Learn more about DMC&#8217;s <a href="https://static.dmcinfo.com/latest-thinking/blog/articletype/categoryview/categoryid/13/culture">company culture</a>.&nbsp;</strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/21765/young-women-learn-to-code-with-dmc/">Young Women Learn to Code with DMC</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>DMC Houston Releases &#8220;SCADA Boi&#8221; Music Video</title>
		<link>https://static.dmcinfo.com/blog/22222/dmc-houston-releases-scada-boi-music-video/</link>
		
		<dc:creator><![CDATA[Cecilia Tetlow]]></dc:creator>
		<pubDate>Tue, 15 Jan 2019 12:14:57 +0000</pubDate>
				<category><![CDATA[Culture]]></category>
		<category><![CDATA[Houston]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/22222/dmc-houston-releases-scada-boi-music-video/</guid>

					<description><![CDATA[<p>One of our favorite DMC traditions is the monthly all-company meeting. All DMC offices meet via video conferencing to share updates. At the end of the meeting, one office will take a turn sharing recent projects and events as well as an office update video. It&apos;s a chance to have some fun showing off our [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/22222/dmc-houston-releases-scada-boi-music-video/">DMC Houston Releases &#8220;SCADA Boi&#8221; Music Video</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p class="wp-block-paragraph">One of our favorite DMC traditions is the monthly all-company meeting. All DMC offices meet via video conferencing to share updates. At the end of the meeting, one office will take a turn sharing recent projects and events as well as an office update video. It&apos;s a chance to have some fun showing off our creative skills!</p>

<p class="wp-block-paragraph">This video was inspired by having several simultaneous SCADA projects in the Houston office that nearly everyone on the team was involved on. We wanted a video focusing on SCADA, so&nbsp;the brilliant Peter King wrote parody lyrics to&nbsp;Avril Lavigne&apos;s &quot;<a href="https://www.youtube.com/watch?v=TIy3n2b7V9k" target="_blank">Sk8er Boi</a>.&quot;</p>

<p class="wp-block-paragraph">Being the newest Houston team members at the time, <a href="https://static.dmcinfo.com/about/employee-bios/john-michael-frullo">John Michael Frullo</a> and I starred in the video. It was a fun way to bond with my new colleagues!</p>

<p class="wp-block-paragraph"><iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/9KdYy-VoS_8" width="560"><!--cke_bookmark_197S--><!--cke_bookmark_197E--></iframe></p>

<p class="wp-block-paragraph"><strong>Learn more about DMC&apos;s <a href="https://static.dmcinfo.com/latest-thinking/blog/articletype/categoryview/categoryid/13/just-plain-fun">company culture</a>.</strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/22222/dmc-houston-releases-scada-boi-music-video/">DMC Houston Releases &#8220;SCADA Boi&#8221; Music Video</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Simultaneously Flash 8 ECUs with LabVIEW and Vector</title>
		<link>https://static.dmcinfo.com/blog/22287/simultaneously-flash-8-ecus-with-labview-and-vector/</link>
		
		<dc:creator><![CDATA[Cecilia Tetlow]]></dc:creator>
		<pubDate>Mon, 14 Jan 2019 12:26:17 +0000</pubDate>
				<category><![CDATA[LabVIEW]]></category>
		<category><![CDATA[Test and Measurement Automation]]></category>
		<category><![CDATA[MS Visual Studio/.NET]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/22287/simultaneously-flash-8-ecus-with-labview-and-vector-2/</guid>

					<description><![CDATA[<p>Flashing an ECU can be a time-intensive process, so it’s no wonder that automotive OEMs are looking for ways to speed up production. Luckily, Vector has released a set of C/C# API commands called vFlashStation. This library has the capability to simultaneously flash up to eight ECUs on separate communication channels. Additionally, these APIs are [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/22287/simultaneously-flash-8-ecus-with-labview-and-vector/">Simultaneously Flash 8 ECUs with LabVIEW and Vector</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Flashing an ECU can be a time-intensive process, so it’s no wonder that automotive OEMs are looking for ways to speed up production. Luckily, <a href="https://www.vector.com/int/en/products/products-a-z/software/vflash/#c5419">Vector</a> has released a set of C/C# API commands called vFlashStation.</p>



<p class="wp-block-paragraph">This library has the capability to simultaneously flash up to eight ECUs on separate communication channels. Additionally, these APIs are compatible with several application environments, including LabVIEW.</p>



<h2 class="wp-block-heading" id="h-learn-vflashstation-api-calls">Learn vFlashStation API Calls</h2>



<p class="wp-block-paragraph">This blog explains how we were able to integrate Vector’s vFlashStation API with NI’s LabVIEW development environment to flash software to multiple ECUs at a time.</p>



<p class="wp-block-paragraph">To flash an ECU, there are five necessary commands:</p>



<ol class="wp-block-list">
<li><strong>Initialize()</strong><br>
 <br>
 <strong>Description:</strong> Synchronously initializes the vFlash library. This must be called before calling any other command.<br>
 &nbsp;</li>



<li><strong>Load Project</strong>(<strong>string</strong> <em>Path</em>, <strong>uint </strong><em>channelID</em>, <strong>out long </strong><em>projectHandle</em>)<br>
 <br>
 <strong>Description:</strong> Synchronously loads a packed project (.vflashpack) to a specific channel. The flash project contains important data such as the security seed key and necessary flashware. The packed project must be initially created using the vFlash GUI that comes with the hardware.<br>
 <br>
 <strong>Parameters:</strong><br>
 &nbsp;
 
 
<ul class="wp-block-list">
<li><strong>Path</strong>: filepath to the vFlash packed project (.vflashpack).<br>
  &nbsp;</li>



<li><strong>channelID</strong>: Channel number for the project. It must match the numbers used in the Vector Hardware Configuration screen (vFlash CAN 1, vFlash CAN 2, etc.).<br>
  &nbsp;</li>



<li><strong>projectHandle</strong>: The method will return a handle (ID) for the newly loaded project.<br>
  &nbsp;</li>
</ul>
</li>



<li><strong>Start</strong>(<strong>long </strong><em>projectHandle, </em><strong>CallbackProgressDelegate</strong> <em>progressCallback</em>, <strong>CallbackStatusDelegate</strong> <em>statusCallback</em>)<br>
 <br>
 <strong>Description:</strong> Asynchronously starts the flash process for the channel as indicated by the projectHandle.<br>
 &nbsp;
 

 
 
<p class="wp-block-paragraph"><strong>Parameters:</strong></p>



<ul class="wp-block-list">
<li><strong>projectHandle</strong>: Handle (ID) to the project to be flashed. Should have been created during the Load Project method.<br>
  &nbsp;</li>



<li><strong>progressCallback</strong>: Delegate reporting the flash progress in percent and time remaining (seconds).<br>
  &nbsp;</li>



<li><strong>statusCallback</strong>: Delegate reporting the status of the flash process (enum containing success or error information).<br>
  &nbsp;</li>
</ul>
</li>



<li><strong>Unload Project</strong>(<strong>long </strong><em>projectHandle</em>)<br>
 <br>
 <strong>Description:</strong> Synchronously unloads the project associated with the project handle.<br>
 <br>
 <strong>Parameters:</strong><br>
 &nbsp;
 
 
<ul class="wp-block-list">
<li><strong>projectHandle</strong>: ID of the associated project and channel. Should have been created during the Load Project method.<br>
  &nbsp;</li>
</ul>
</li>



<li><strong>Deinitialize</strong>()<br>
 <br>
 <strong>Description:</strong> Deinitializes the vFlash library in order to free allocated resources.</li>
</ol>



<p class="wp-block-paragraph">These are the bare bone methods required to flash an ECU through the vFlashStation API. While the other methods are not described in detail in this blog post, Vector also created other API calls to customize reporting, networks, flash attributes, and custom actions.</p>



<h2 class="wp-block-heading" id="h-create-a-c-based-wrapper-of-vflashstation-api">Create a C-Based Wrapper of vFlashStation API</h2>



<p class="wp-block-paragraph">It’s important to note that the Start API method requires two callback delegates in order to correctly query the flashing status information. This is especially important for simultaneously flashing multiple ECUs. However, LabVIEW does not currently have a way to natively access or call a callback delegate.</p>



<p class="wp-block-paragraph">The best workaround for this is to create a C-based wrapper to handle the callback delegate. In my case, I created a script using Visual Studio that referenced the vFlashStationAutomation DLL and housed my desired methods and callback delegates. The code snippet below shows how the vFlashStation API and callback delegates are utilized in my wrapper.<br>
&nbsp;</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C#</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>        public VFlashStationResult StartFlash()
        {
            VFlashStationResult startResult = VFlashStationAPI.Start(ProjectHandle, ProgressCallback, StatusCallback);
            return startResult;
        }


        /// &lt;summary>
        /// The StatusCallback handles changes of the reprogramming status.
        /// If the reprogramming process was successfully finished, the callback contains
        /// the result &lt;see cref="VFlashStationStatus.Success"/>.
        /// Otherwise the &lt;paramref name="flashStationStatus"/> contains the error code.
        /// &lt;/summary>
        /// &lt;param name="ProjectHandle">The project handle.&lt;/param>
        /// &lt;param name="flashStationStatus">The flash station status.&lt;/param>
        /// &lt;remarks>If detailed error information is required, 
        /// check &lt;see cref="VFlashStationAPI.GetLastErrorMessage"/>.&lt;/remarks>
        private void StatusCallback(long ProjectHandle, VFlashStationStatus flashStationStatus)
        {
            Status = flashStationStatus;
        }

        /// &lt;summary>
        /// The ProgressCallback contains progress information about the current
        /// reprogramming process containing the progress in percent and the
        /// estimated remaining time in seconds to finished the flash process.
        /// &lt;/summary>
        /// &lt;param name="ProjectHandle">The project handle.&lt;/param>
        /// &lt;param name="progressInPercent">The progress in percent.&lt;/param>
        /// &lt;param name="remainingTimeInSeconds">The remaining time in seconds.&lt;/param>
        private void ProgressCallback(long ProjectHandle, uint progressInPercent, uint remainingTimeInSeconds)
        {
            PercentProgress = progressInPercent;
            TimeRemaining = remainingTimeInSeconds;
        }</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">VFlashStationResult</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">StartFlash</span><span style="color: #D4D4D4">()</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #4EC9B0">VFlashStationResult</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">startResult</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">VFlashStationAPI</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Start</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">ProjectHandle</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">ProgressCallback</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">StatusCallback</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">startResult</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">        /// The StatusCallback handles changes of the reprogramming status.</span></span>
<span class="line"><span style="color: #6A9955">        /// If the reprogramming process was successfully finished, the callback contains</span></span>
<span class="line"><span style="color: #6A9955">        /// the result </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">see</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">cref</span><span style="color: #6A9955">=</span><span style="color: #CE9178">&quot;VFlashStationStatus.Success&quot;</span><span style="color: #808080">/&gt;</span><span style="color: #6A9955">.</span></span>
<span class="line"><span style="color: #6A9955">        /// Otherwise the </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">paramref</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">name</span><span style="color: #6A9955">=</span><span style="color: #CE9178">&quot;flashStationStatus&quot;</span><span style="color: #808080">/&gt;</span><span style="color: #6A9955"> contains the error code.</span></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">param</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">name</span><span style="color: #6A9955">=</span><span style="color: #CE9178">&quot;ProjectHandle&quot;</span><span style="color: #808080">&gt;</span><span style="color: #6A9955">The project handle.</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">param</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">param</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">name</span><span style="color: #6A9955">=</span><span style="color: #CE9178">&quot;flashStationStatus&quot;</span><span style="color: #808080">&gt;</span><span style="color: #6A9955">The flash station status.</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">param</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">remarks</span><span style="color: #808080">&gt;</span><span style="color: #6A9955">If detailed error information is required, </span></span>
<span class="line"><span style="color: #6A9955">        /// check </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">see</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">cref</span><span style="color: #6A9955">=</span><span style="color: #CE9178">&quot;VFlashStationAPI.GetLastErrorMessage&quot;</span><span style="color: #808080">/&gt;</span><span style="color: #6A9955">.</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">remarks</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">StatusCallback</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">long</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ProjectHandle</span><span style="color: #D4D4D4">, </span><span style="color: #4EC9B0">VFlashStationStatus</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">flashStationStatus</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">Status</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">flashStationStatus</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">        /// The ProgressCallback contains progress information about the current</span></span>
<span class="line"><span style="color: #6A9955">        /// reprogramming process containing the progress in percent and the</span></span>
<span class="line"><span style="color: #6A9955">        /// estimated remaining time in seconds to finished the flash process.</span></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">param</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">name</span><span style="color: #6A9955">=</span><span style="color: #CE9178">&quot;ProjectHandle&quot;</span><span style="color: #808080">&gt;</span><span style="color: #6A9955">The project handle.</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">param</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">param</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">name</span><span style="color: #6A9955">=</span><span style="color: #CE9178">&quot;progressInPercent&quot;</span><span style="color: #808080">&gt;</span><span style="color: #6A9955">The progress in percent.</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">param</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">param</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">name</span><span style="color: #6A9955">=</span><span style="color: #CE9178">&quot;remainingTimeInSeconds&quot;</span><span style="color: #808080">&gt;</span><span style="color: #6A9955">The remaining time in seconds.</span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">param</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">void</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">ProgressCallback</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">long</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ProjectHandle</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">progressInPercent</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">remainingTimeInSeconds</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">PercentProgress</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">progressInPercent</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">TimeRemaining</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">remainingTimeInSeconds</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span></code></pre></div>



<p class="wp-block-paragraph">While not shown in this code snippet, I also kept each of the vFlash API calls exposed as individual public methods in my script (like the StartFlash example above). This made my application a little more flexible from the LabVIEW perspective since I could perform the tasks independently in any sequence.</p>



<p class="wp-block-paragraph">Additionally, I also created a class called <strong>ECU</strong>&nbsp;in my C# script. This gave me a great way to group the information for each of my channels and neatly dispose of them when I no longer needed them. Each class stores the data that I need such as project path, project handle, channel ID, status, etc.</p>



<div class="wp-block-kevinbatdorf-code-block-pro cbp-has-line-numbers" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;--cbp-line-number-color:#D4D4D4;--cbp-line-number-width:calc(2 * 0.6 * .875rem);line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:flex;align-items:center;padding:16px 0 0 16px;width:100%;text-align:left;background-color:#1e1e1e"><span style="background:#c7c7c7;padding:0.3rem 0.5rem 0.2rem;border-radius:1rem;font-size:0.8em;line-height:1;height:1.25rem;text-align:center;display:inline-flex;align-items:center;justify-content:center;color:#1e1e1e">C#</span></span><span role="button" tabindex="0" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><pre class="code-block-pro-copy-button-pre" aria-hidden="true"><textarea class="code-block-pro-copy-button-textarea" tabindex="-1" aria-hidden="true" readonly>public class ECU : IDisposable
    {
        public string ECUname { get; private set; }
        public string ProjectPath { get; private set; }
        public long ProjectHandle { get; set; }
        public uint ChannelID { get; private set; }
        public uint PercentProgress { get; private set; }
        public uint TimeRemaining { get; private set; }
        public VFlashStationStatus Status { get; private set; }
        public VFlashStationResult Result { get; private set; }

        /// &lt;summary>
        /// Generate class for each ECU. We get name, project path, and channel ID from LabVIEW
        /// &lt;/summary>
        /// &lt;param name="projectHandle">&lt;/param>
        public ECU(string Name, string projectPath, uint channelID)
        {
            ECUname = Name;
            ProjectPath = projectPath;
            ChannelID = channelID;
            TimeRemaining = 0;
            PercentProgress = 0;
        }</textarea></pre><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M4.5 12.75l6 6 9-13.5"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M16.5 8.25V6a2.25 2.25 0 00-2.25-2.25H6A2.25 2.25 0 003.75 6v8.25A2.25 2.25 0 006 16.5h2.25m8.25-8.25H18a2.25 2.25 0 012.25 2.25V18A2.25 2.25 0 0118 20.25h-7.5A2.25 2.25 0 018.25 18v-1.5m8.25-8.25h-6a2.25 2.25 0 00-2.25 2.25v6"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">ECU</span><span style="color: #D4D4D4"> : </span><span style="color: #4EC9B0">IDisposable</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ECUname</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ProjectPath</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">long</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ProjectHandle</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">ChannelID</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">PercentProgress</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">TimeRemaining</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">VFlashStationStatus</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Status</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">VFlashStationResult</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Result</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">private</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">        /// Generate class for each ECU. We get name, project path, and channel ID from LabVIEW</span></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;/</span><span style="color: #569CD6">summary</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #6A9955">        /// </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">param</span><span style="color: #6A9955"> </span><span style="color: #9CDCFE">name</span><span style="color: #6A9955">=</span><span style="color: #CE9178">&quot;projectHandle&quot;</span><span style="color: #808080">&gt;&lt;/</span><span style="color: #569CD6">param</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">ECU</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Name</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">string</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">projectPath</span><span style="color: #D4D4D4">, </span><span style="color: #569CD6">uint</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">channelID</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">ECUname</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Name</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">ProjectPath</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">projectPath</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">ChannelID</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">channelID</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">TimeRemaining</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">PercentProgress</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">        }</span></span></code></pre></div>



<p class="wp-block-paragraph">I then compiled the script to create my own DLL, titled <strong>StartFlash.dll</strong>. Integrating my wrapper into LabVIEW was simpler since I did not need to worry about the callback delegates.</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Create-DLL-1.png" alt="Create DLL"/></figure>



<h2 class="wp-block-heading" id="h-call-dll-methods-from-labview">Call DLL Methods from LabVIEW</h2>



<p class="wp-block-paragraph">There are two ways to call functions wrapped within a DLL: a Call Library Function Node, or an Invoke Node. A Call Library Function is useful when the DLL is a C/C++ DLL, and an Invoke Node is great for C#/.NET assemblies. You can also view NI’s knowledge article, <a href="https://knowledge.ni.com/KnowledgeArticleDetails?id=kA00Z0000019Ls1SAE&amp;l=en-US"><strong>Calling a DLL from LabVIEW</strong></a>, for more details.</p>



<p class="wp-block-paragraph">In this case, we’ve created a .NET assembly so the correct option is to use the invoke nodes from the .NET palette within LabVIEW.</p>



<ol class="wp-block-list">
<li>Place a .NET Constructor Node on the block diagram to instantiate a class within the .NET assembly.<br>
 
<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Create-NET-Constructor-1.png" alt="Select .NET Constructor Node"/></figure>
</li>



<li>Select the constructor by browsing for the desired .NET assembly DLL. For this example, we need the <strong>StartFlash DLL </strong>I created earlier and my ECU class.<br>
 <br>
 You should now have a constructor node with any required inputs (Name, project path, and channel ID). Wiring controls/constants to these inputs will initialize your class data.<br>
 &nbsp;<br>
 The output of this constructor node is a reference to the newly created class. This reference can now be wired into property nodes or invoke nodes in order to read/write class data or access public methods, respectively.<br>
 &nbsp;
<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Select-Correct-DLL-1.png" alt="Browse Desired .NET Assembly"/></figure>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Configured-Constructor-Node-1.png" alt="Properly Configured Constructor Node"/></figure>
</li>



<li>Wire the class reference to the input of an invoke node. You should see it automatically adapt to the reference type wired in.
 

 

 

 

 

 

 
 
<p class="wp-block-paragraph">&nbsp;&nbsp;<br>
 &nbsp;</p>



<p class="wp-block-paragraph">The available methods will automatically be populated based on the class reference. Select the desired method from the method drop-down menu and any inputs/outputs will automatically be created.<br>
 &nbsp;</p>



<p class="wp-block-paragraph"></p>



<p class="wp-block-paragraph">That’s how simple it is to access public methods within a DLL. The only thing remaining is to organize the LabVIEW application to call the vFlash methods in the proper order in order to flash up to eight ECUs at a time.<br>
 &nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Invoke-Node-Example-1.png" alt="Example of vFlashStation API LabVIEW Call"/></figure>



<p class="wp-block-paragraph">One last piece of advice: It’s always important to properly dispose of any references open in LabVIEW. In this case, we need to dispose of our .NET class and our .NET class reference.<br>
 &nbsp;</p>



<figure class="wp-block-image"><img decoding="async" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Dispose-References-1.png" alt="Dispose of References"/></figure>
</li>
</ol>



<p class="wp-block-paragraph"><a href="https://static.dmcinfo.com/services/test-and-measurement-automation/labview-programming" target="_self">Learn more about DMC&#8217;s LabVIEW programming experience</a>.</p>
<p>The post <a href="https://static.dmcinfo.com/blog/22287/simultaneously-flash-8-ecus-with-labview-and-vector/">Simultaneously Flash 8 ECUs with LabVIEW and Vector</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Creating an Augmented Reality (AR) Demo with the Vuforia Studio Pilot Program</title>
		<link>https://static.dmcinfo.com/blog/25084/creating-an-augmented-reality-ar-demo-with-the-vuforia-studio-pilot-program/</link>
		
		<dc:creator><![CDATA[Cecilia Tetlow]]></dc:creator>
		<pubDate>Thu, 06 Oct 2016 16:15:55 +0000</pubDate>
				<category><![CDATA[Application Development]]></category>
		<category><![CDATA[Embedded Development & Programming]]></category>
		<category><![CDATA[User Interface Design]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[SDK]]></category>
		<guid isPermaLink="false">https://static.dmcinfo.com/blog/25084/creating-an-augmented-reality-ar-demo-with-the-vuforia-studio-pilot-program/</guid>

					<description><![CDATA[<p>Augmented Reality (AR) has been booming the past couple of months, especially with the deployment of Pokémon Go. If you&#8217;re not familiar with it, Pokémon Go is a mobile app that encourages its users to walk around the real world in order to capture virtual Pokémon characters. Aside from making a very addicting mobile phone [&#8230;]</p>
<p>The post <a href="https://static.dmcinfo.com/blog/25084/creating-an-augmented-reality-ar-demo-with-the-vuforia-studio-pilot-program/">Creating an Augmented Reality (AR) Demo with the Vuforia Studio Pilot Program</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<p class="wp-block-paragraph">Augmented Reality (AR) has been booming the past couple of months, especially with the deployment of Pokémon Go. If you&#8217;re not familiar with it, Pokémon Go is a mobile app that encourages its users to walk around the real world in order to capture virtual Pokémon characters.</p>



<p class="wp-block-paragraph">Aside from making a very addicting mobile phone application, AR is now being considered in industrial settings. It can be used to diagnose and&nbsp;troubleshoot machinery, or&nbsp;provide visual instructions for assembly or disassembly. For example, this <a href="https://www.youtube.com/watch?v=mru4tRsjqpk&amp;feature=youtu.be" target="_blank">video</a>&nbsp;shows an AR program walking the user through the steps of changing a circular saw blade. This particular program was created with the Vuforia Studio Pilot Program.</p>



<h2 id="h-vuforia-studio-pilot-program" class="wp-block-heading">Vuforia Studio Pilot Program</h2>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">The Vuforia Studio Pilot Program integrates 3 distinct platforms: ThingWorx, Vuforia, and PTC Creo Illustrate. <a href="http://www.ptc.com/internet-of-things/technology-platform-thingworx" target="_blank">ThingWorx</a> is crucial for transmitting data between devices, such as sensor data collected from a Raspberry Pi to&nbsp;a phone.&nbsp;PTC Creo Illustrate&nbsp;is a technical illustration software that allows you to create 3D sequences and animations with CAD data. <a href="https://developer.vuforia.com/" target="_blank">Vuforia</a> can then import&nbsp;data from ThingWorx and integrate it with the 3D models and animations from PTC Creo Illustrate to create an&nbsp;AR environment. With these three platforms, the Vuforia Studio Pilot Program is capable of creating some really cool AR experiences.</p>



<p class="wp-block-paragraph">I created an AR experience for the 2016 AWC BestFest with the Vuforia Studio Pilot Program. If you&#8217;re interested in using the techniques mentioned in this post to create your very own AR experience, sign up for the <a href="https://www.vuforia.com/studio" type="link" id="https://www.vuforia.com/studio">Vuforia Studio Pilot Program</a>. You&#8217;ll then get a service URL that contains your ThingWorx and Vuforia instance.</p>



<h2 id="h-2016-awc-bestfest-beer-tank-demo" class="wp-block-heading">2016 AWC BestFest Beer Tank Demo</h2>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">The <a href="http://www.bestfest.us/" target="_blank">2016 AWC BestFest</a>&nbsp;is a technology tradeshow held at Saint Arnold&#8217;s brewery in Houston, Texas. The festival is an opportunity for technology partners to mingle, show off new technologies, and drink beer. Another DMC employee gave a seminar on &#8220;Smart Manufacturing&#8221; and how IoT platforms can improve the industrial process. We decided some AR demos with IoT platforms would help illustrate this point. Being at Saint Arnold&#8217;s Brewery, I though it was fitting to have a demo centered around a beer tank.</p>



<p class="wp-block-paragraph"><iframe allowfullscreen="" frameborder="0" height="360" src="https://www.youtube.com/embed/2VB_N0NqFEg" width="640"></iframe></p>



<p class="wp-block-paragraph">For the demo, the user scans a specific &#8220;ThingMark&#8221; with their smartphone. These ThingMarks are essentially QR codes that are tied to unique augmented reality experiences. When you sign up for the pilot program, you get 100 different ThingMarks for your projects.&nbsp;</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="ThingMark for BestFest" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/BestFest_1.png"></p></p>



<p class="wp-block-paragraph">Upon scanning the ThingMark,&nbsp;a 3D CAD model of a beer tank appears on the screen&nbsp;alongside&nbsp;with temperature and tank level values. The temperature and tank level values were simulated through a python script on a Raspberry Pi. Additionally, I created a step-by-step visual sequence that showed the user how to open the lid at the top of the tank.&nbsp;</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="View from smartphone of 2016 BestFest Demo" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Beer-Tank-Augmented-Reality-Vuforia-Pilot.png">&nbsp; &nbsp; &nbsp;&nbsp; &nbsp;<img decoding="async" alt="Snapshot of sequence from 2016 BestFest Demo" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Augmented-Reality-Sequence-Vuforia.png">&nbsp; &nbsp; &nbsp;</p></p>



<p class="wp-block-paragraph">The following sections give a brief overview of how I accomplished it.&nbsp; &nbsp;</p>



<p class="wp-block-paragraph"><em>Setting Up&nbsp;ThingWorks&nbsp;</em></p>



<p class="wp-block-paragraph">ThingWorx Foundation is an Internet of Things (IoT) platform that strives to create a &#8220;smart, and connected world&#8221;. What does this mean exactly? In this smart world, any and all electronic devices would be able to communicate with each other and execute services. For example, your printer would order its own ink cartridges after detecting low ink levels instead of relying on you. Or, your alarm would adjust when it woke you up depending on whether the train was early or late (look at this DMC <a href="https://static.dmcinfo.com/latest-thinking/blog/id/8568/categoryid/134/cta-bus-tracking-with-the-raspberry-pi" target="_blank">blog</a> for a similar project on how to track CTA Buses with a Raspberry Pi). Learn more about how DMC can help you with <a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/iot-solutions/" data-type="link" data-id="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming/iot-solutions/">your IoT projects</a>.  </p>



<p class="wp-block-paragraph"><em>Creating ThingShapes, ThingTemplates, and Things</em></p>



<p class="wp-block-paragraph">ThingWorx is an object-oriented&nbsp;platform centered&nbsp;around &#8220;Things&#8221;. There are&nbsp;Things,&nbsp;Thing Templates, and&nbsp;Thing Shapes. Thing Shapes are the lowest level, and this is where you define properties, services, events, and subscriptions. So I created two Thing Shapes: TankTempShape, and TankFillShape. Here is where I first defined the temperature, fill level, name, and other properties I wanted to keep track of.&nbsp;I&nbsp;then created a Thing Template called TankTemplate that inherits from my two Thing Shapes. Finally, I created TankThing that inherits from my TankTemplate. The advantage to this object-oriented structure is that I do not have to redefine properties for each Thing I want to set up. If I had multiple beer tanks I wanted to track, then I could easily create several TankThing&#8217;s and each one would inherit from&nbsp;TankTemplate and already have the proper configurations. Alternatively, you could define all your properties and configurations within&nbsp;your Thing and it would work fine, but you would not be able to easily scale up your model.&nbsp;Once I created my TankThing, I had to ensure that I could receive data from my Raspberry Pi by setting up an application key.</p>



<p class="wp-block-paragraph"><em>Creating&nbsp;an Application Key</em></p>



<p class="wp-block-paragraph">Each time you access your ThingWorx instance, you must login with your user credentials. So when you make an HTTP request&nbsp;with the Raspberry Pi, you&#8217;ll&nbsp;need to send along the username and password&nbsp;before you can alter the ThingWorx data. Alternatively, you can create an application key within ThingWorx for the specified user. Now when we make the HTTP request&nbsp;you&nbsp;can pass along the application key ID instead. Under&nbsp;the home tab, under security, there is a section for application keys. If there isn&#8217;t one already created, create a new one for the user you want to use (I used Administrator). Make sure your user has the proper read and write access. When you save it, it should generate an application key ID. Save this ID, you will need it in the next section.</p>



<h2 id="h-raspberry-pi-data-simulation" class="wp-block-heading">Raspberry Pi Data Simulation</h2>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">While I chose to simulate data within a python script, you can collect data from a sensor and export that to ThingWorx instead. In order to do that, you&#8217;ll need to utilize the GPIO library. You can use this <a href="https://learn.sparkfun.com/tutorials/raspberry-gpio/python-rpigpio-api" target="_blank">reference</a> to set up your inputs to collect sensor data. While I&#8217;m not going to go over my simulation code (wouldn&#8217;t really help you unless you wanted to run through the exact same numbers as me), I&#8217;m going to show you how to set up the HTTP request.</p>



<p class="wp-block-paragraph"><i>Making an HTTP Request to Edit ThingWorx</i></p>



<p class="wp-block-paragraph">In order to do this, you will need to import the JSON and Requests library. The Requests library is an awesome tool that makes HTTP requests really simple. Everything you need can be condensed into one line of code.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="How to set up JSON and Requests libraries." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Raspberry_Pi_JSON_Requests_libraries.png"></p></p>



<p class="wp-block-paragraph">If you don&#8217;t have the Requests library already installed, enter the following lines&nbsp;into the&nbsp;terminal&nbsp;to get them.</p>



<ol class="wp-block-list">
<li>&nbsp;sudo git clone git://github.com/kennethreitz/requests.git &nbsp;</li>



<li>&nbsp;cd requests (i.e. change directory into the folder that git has just added)</li>



<li>&nbsp;sudo python setup.py install</li>
</ol>



<p class="wp-block-paragraph">Now you&#8217;re ready for the&nbsp;HTTP request. The&nbsp;following&nbsp;lines of code only work for my specific ThingWorx and Vuforia instance.&nbsp;You&#8217;ll&nbsp;need to replace the URL&nbsp;with your service URL, replace the blacked out portion with the application key ID from your ThingWorx, and replace TankThing with the name of your Thing. That will ensure that the Raspberry Pi is sending the data to the correct location.</p>



<p class="wp-block-paragraph">Lastly, you&#8217;ll need to edit the payload line with your own custom variables. The blue text corresponds to the properties within ThingWorx,&nbsp;and the black text corresponds to the variables within the python script.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Variables used in http request to ThingWorx." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Service_URL_ThingWorx_Application_Key_AR.png"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="http request to edit data in ThingWorx instance." src="https://static.dmcinfo.com/wp-content/uploads/2025/05/HTTP_Request_ThingWorx.png"></p></p>



<p class="wp-block-paragraph"><p style="text-align: center;">&nbsp;</p></p>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">Afterwards, save your python script and execute it from the terminal. You can test the script by going into ThingWorx and checking&nbsp;your Thing&#8217;s properties. Hit the blue refresh button next to Values to see the values change. If it&#8217;s not updating, check to make sure the URL, Thing name, application key, and payload terms are correctly typed. Also check that your python script is properly collecting/simulating values.</p>



<h2 id="h-ptc-creo-illustrate" class="wp-block-heading">PTC Creo Illustrate</h2>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph"><em>Import an Existing CAD Model</em></p>



<p class="wp-block-paragraph">PTC Creo Illustrate is a great program for creating animations and visuals, however, you can&#8217;t create CAD models. You can use other programs such as PTC Creo Parametric, PTC Creo Elements, SolidWorks, or AutoCAD to create your own model. Alternatively, you can&nbsp;download a file from GrabCAD or other free sites. Once you&#8217;re ready to import, go to File -&gt; Import and then select your CAD file. When you click Open you should get a&nbsp;window similar to the one below.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="PTC Creo Illustrate Intro" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/PTC_Creo_Illustrate_Beer_Tank_BestFest.png"></p></p>



<p class="wp-block-paragraph">Now you can make edits to your model like&nbsp;rotating&nbsp;or translating&nbsp;your device, creating&nbsp;sections, sequences, and animations. For my particular demo, I created a sequence &nbsp;that shows how to open the lid at the top of the beer tank.</p>



<p class="wp-block-paragraph"><em>Creating a Sequence</em></p>



<p class="wp-block-paragraph">You can create a sequence to showcase anything from assembly, disassembly, movement, or internal components.&nbsp;Once you have your figure imported, click on the &#8220;Sequence&#8221; tab at the top of the window. You&#8217;ll now see a slew of visual manipulation options.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="How to create a sequence in PTC Creo Illustrate" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Creating-Sequences-PTC-Creo-Illustrate-Intro.png"></p></p>



<p class="wp-block-paragraph">Click&nbsp;&#8220;Add Step&#8221; to begin the process. You can now add whatever motions you desire.&nbsp;There are several effects that you can add to individual pieces&nbsp;such as fly in/out, fade in/out, shake, pulse, unscrew, etc. Play around with them to determine what you want. You can add several effects to one step and PTC Creo will do its best to combine them all into one fluid motion. If you want them to be separated, make sure to put them in different steps. Continue to add steps, translations, and effects until you have the desired sequence. You can then go to &#8220;Preview Sequence&#8221; to view your entire sequence.</p>



<p class="wp-block-paragraph"><em>Publishing Your File</em></p>



<p class="wp-block-paragraph">Once you&#8217;re happy with your sequence, you&#8217;ll need to publish your program in order to get two files: .pvz file, and&nbsp;.pvi&nbsp;file. The .pvz file is your 3D model, whereas the .pvi file stores your animation information.&nbsp;</p>



<ol class="wp-block-list">
<li>Go to File -&gt; Publish.&nbsp;</li>



<li>Publish it as a new .pvz file.</li>



<li>Go to your new file and RENAME&nbsp;it as a zip file (do not send to a zip file, for some reason this does not seem to work).</li>



<li>Extract all files</li>
</ol>



<p class="wp-block-paragraph">After extraction, you should be able to see a .pvz file and a .pvi file in your new folder. These files will be imported into Vuforia Studio.</p>



<h2 id="h-vuforia-studio" class="wp-block-heading">Vuforia Studio</h2>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">Here is where all the augmented reality magic happens. Here you&#8217;ll set up&nbsp;your 3D models, 2D and 3D widgets, ThingMark, and import ThingWorx data.&nbsp;&nbsp;&nbsp;</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="Vuforia Studio view with 3D model and widgets" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Vuforia-Studio-Beer-Tank-3D-Model-View.png"></p></p>



<p class="wp-block-paragraph"><i>Importing Your 3D&nbsp;Model and Animation</i></p>



<p class="wp-block-paragraph">In order to use your 3D model and animations, you&#8217;ll need to import your files into Vuforia.</p>



<ol class="wp-block-list">
<li>On the left under Resources, click the blue plus sign.</li>



<li>Click Select File and find your .pvz file and click ADD.</li>



<li>Repeat&nbsp;for the .pvi file.</li>



<li>Close out of that window.&nbsp;</li>



<li>Drag a 3D Model into your environment.</li>



<li>To the right under the &#8220;Properties&#8221; column, go to&nbsp;&#8220;Resource&#8221; and select your .pvz file.</li>



<li>Under &#8220;Sequence URL&#8221;, select your .pvi file.</li>
</ol>



<p class="wp-block-paragraph"><em>Configuring a Button to Control Your Sequence</em></p>



<p class="wp-block-paragraph">Now we have a&nbsp;3D model and sequence imported into Vuforia, but nothing is currently telling it to run. To fix this, I configured&nbsp;toggle buttons that appear on the smartphone screen&nbsp;that execute&nbsp;play/rewind/forward actions.</p>



<ol class="wp-block-list">
<li>Select 2D view under Canvas.</li>



<li>Drag a Toggle Button onto any of the panels (your choice).</li>



<li>Under your Toggle Button properties, drag&nbsp;the blue cross icon next to &#8220;Click&#8221; all the way to the left&nbsp;to your 3D model icon under &#8220;Views&#8221;.</li>



<li>A new window will appear where you can select what action that button will have. Selecting&nbsp;&#8220;Play&#8221; will cause the next&nbsp;step in the sequence to play.</li>
</ol>



<p class="wp-block-paragraph">Add as many buttons as desired. As shown in the images of the 2016 BestFest demo,&nbsp;I had four distinct buttons: play, play all, rewind, and forward.&nbsp;You can also change what your buttons look&nbsp;like by changing &#8220;Image When Pressed&#8221; and &#8220;Image When Not Pressed&#8221; under Properties. You can import your own button images following the procedure for importing the CAD model. Play around with the Toggle Button&#8217;s properties to your heart&#8217;s content.</p>



<p class="wp-block-paragraph"><em>Importing Data from ThingWorx</em></p>



<p class="wp-block-paragraph">There are several widgets available for displaying values. You can use 3D labels and&nbsp;gauges, or 2D gauges and value displays. Once you&#8217;ve selected your widget, you&#8217;ll need to connect the value to the ThingWorx Data. On the right-hand side, there is a tab called &#8220;External Data&#8221;. Click on the plus sign and you&#8217;ll be taken to a search engine as shown below.</p>



<p class="wp-block-paragraph"><p style="text-align: center;"><img decoding="async" alt="How to find your ThingWorx things in Vuforia Studio" src="https://static.dmcinfo.com/wp-content/uploads/2025/05/Finding-Things-Vuforia-Studio.png"></p></p>



<ol class="wp-block-list">
<li>Use the top left search engine&nbsp;to find&nbsp;your Thing by its name.</li>



<li>Click the blue right arrow.&nbsp;</li>



<li>In &#8220;Filter Services&#8221;, type &#8220;GetPropertyValues&#8221; and click the blue plus symbol when it pops up. &nbsp;It should now be added to &#8220;External Data&#8221;.</li>



<li>Close out of the search window.</li>



<li>Expand &#8220;External Data&#8221;.&nbsp;</li>



<li>Expand &#8220;Configurations&#8221;.</li>



<li>Select &#8220;Invoke on Startup&#8221;, and &#8220;Auto-Refresh&#8221;.</li>



<li>Change the Auto-Refresh rate to something that fits your project (I used 1 second).</li>



<li>Go to &#8220;Current Selected Item&#8221; to get a list of all your available properties.&nbsp;</li>



<li>Drag the blue&nbsp;cross icon from the desired property over to the&nbsp;blue circle beside &#8220;Value&#8221; on your 2D/3D widget.&nbsp;</li>
</ol>



<p class="wp-block-paragraph">This will cause the widget to show the value of the&nbsp;property from the ThingWorx Foundation platform. Repeat the last two steps&nbsp;for all of your widgets.&nbsp;</p>



<p class="wp-block-paragraph"><em>Publish Your Experience</em></p>



<p class="wp-block-paragraph">In order to save and publish your experience, you&#8217;ll need to associate a ThingMark to your experience.&nbsp; &nbsp;</p>



<ol class="wp-block-list">
<li>Under 3D view, drag a ThingMark widget (under &#8220;Views&#8221; in the left hand column)&nbsp;into your environment.</li>



<li>Under &#8220;Application Parameters&#8221;, drag the blue cross icon&nbsp;next to ThingMark to the blue circle next to ThingMark under the Properties &nbsp;column for your ThingMark widget.&nbsp;</li>



<li>Change the number to match the number of the ThingMark you&#8217;ll be using for the experience (it&#8217;ll be the name of the file in your ThingMark folder given to you with the pilot program).</li>



<li>Adjust the ThingMark widget&#8217;s location in your 3D canvas so that it is in the same manner it will be placed in real life.</li>
</ol>



<p class="wp-block-paragraph">Now go to &#8220;Experience&#8221; under Configurations. Give your experience a name in the &#8220;Title&#8221; box and retype your ThingMark number from before.</p>



<p class="wp-block-paragraph">Now that everything is set up, it&#8217;s time to save your experience and publish it. Click on &#8220;Save&#8221; in the top left corner, then click on &#8220;Publish&#8221;. Once it has successfully published, your AR experience is ready to be viewed on a smartphone or tablet with the Vuforia View Enterprise application downloaded.</p>



<h2 id="h-vuforia-view-enterprise-nbsp" class="wp-block-heading">Vuforia View Enterprise&nbsp;</h2>



<p class="wp-block-paragraph">&nbsp;</p>



<p class="wp-block-paragraph">Almost finished! The last step is to download Vuforia View Enterprise onto your smartphone or tablet. Once you have it downloaded, open up the application,&nbsp;go to settings, and type your service URL. Now print the ThingMark that you&nbsp;used in Vuforia Studio and scan it with your smartphone or tablet. Open up your experience and enjoy your new augmented reality!<span style="text-align: center;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span></p>



<p class="wp-block-paragraph"><strong><a href="https://static.dmcinfo.com/services/embedded-development-and-embedded-programming"><span style="text-align: center;">Learn more about DMC&#8217;s Custom Hardware and Software development.</span></a></strong></p>
<p>The post <a href="https://static.dmcinfo.com/blog/25084/creating-an-augmented-reality-ar-demo-with-the-vuforia-studio-pilot-program/">Creating an Augmented Reality (AR) Demo with the Vuforia Studio Pilot Program</a> appeared first on <a href="https://static.dmcinfo.com/">DMC, Inc.</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
