<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/" rel="alternate" type="text/html" /><updated>2026-06-08T10:04:33+00:00</updated><id>https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/feed.xml</id><title type="html">Sayantan Maity - GNU Radio GSoC 2026</title><subtitle>Weekly development diary for GNU Radio Hardware-in-the-Loop CI using CortexLab</subtitle><entry><title type="html">Gnuradio Executationi Task Monitor Design</title><link href="https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/06/08/gnuradio-executationi-task-monitor-design.html" rel="alternate" type="text/html" title="Gnuradio Executationi Task Monitor Design" /><published>2026-06-08T00:00:00+00:00</published><updated>2026-06-08T00:00:00+00:00</updated><id>https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/06/08/gnuradio-executationi-task-monitor-design</id><content type="html" xml:base="https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/06/08/gnuradio-executationi-task-monitor-design.html"><![CDATA[<h1 id="weekly-progress-report-gnu-radio-execution-and-task-monitoring-design">Weekly Progress Report: GNU Radio Execution and Task Monitoring Design</h1>

<h2 id="overview">Overview</h2>

<p>This week I focused on learning the CorteXlab workflow for running GNU Radio applications on remote USRP nodes. Along the way, I encountered and resolved several execution issues related to task packaging, container environments, and GNU Radio configuration. I also designed an initial concept for a task monitoring system that can track experiment status and collect success/failure information across multiple nodes.</p>

<hr />

<h2 id="1-creating-and-running-a-gnu-radio-flowgraph">1. Creating and Running a GNU Radio Flowgraph</h2>

<p>I created a GNU Radio flowgraph using GNU Radio Companion (GRC) based on the tutorial provided by my mentor.</p>

<p>After generating the Python file, I packaged it into a MINUS task and submitted it to a USRP-equipped node on CorteXlab.</p>

<p>This helped me understand:</p>

<ul>
  <li>GNU Radio Companion (GRC)</li>
  <li>Generated Python flowgraphs</li>
  <li>MINUS task creation and submission</li>
  <li>Running experiments on remote nodes</li>
</ul>

<hr />

<h2 id="2-debugging-task-execution">2. Debugging Task Execution</h2>

<h3 id="file-location-issue">File Location Issue</h3>

<p>My first attempt failed because the container could not find the Python file.</p>

<p>Error:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3: can't open file '/root/test_recieve.py'
</code></pre></div></div>

<p>To investigate, I used a temporary command inside the container to locate the file.</p>

<p>The actual path was:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>/cortexlab/homes/sayantan_maity/test_reciever/test_recieve.py
</code></pre></div></div>

<p>This confirmed that the task package was transferred correctly and helped identify the correct execution path.</p>

<hr />

<h3 id="gnu-radio-import-failure">GNU Radio Import Failure</h3>

<p>After fixing the file path issue, the next error was:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ModuleNotFoundError: No module named 'gnuradio'
</code></pre></div></div>

<p>Initially, I suspected a problem with the Docker image, but further testing showed that GNU Radio was installed correctly.</p>

<p>The issue was that the GNU Radio environment was not initialized when Python was executed directly.</p>

<p>This failed:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>python3 test_recieve.py
</code></pre></div></div>

<p>This worked:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>bash <span class="nt">-lc</span> <span class="s2">"python3 test_recieve.py"</span>
</code></pre></div></div>

<p>The solution was to launch Python through <code class="language-plaintext highlighter-rouge">bash -lc</code>, which correctly loads the GNU Radio environment inside the container.</p>

<hr />

<h3 id="successful-usrp-initialization">Successful USRP Initialization</h3>

<p>Once the environment issue was resolved, the flowgraph successfully started and connected to the USRP.</p>

<p>The logs showed:</p>

<ul>
  <li>UHD initialization</li>
  <li>USRP device detection</li>
  <li>Successful communication with the radio hardware</li>
</ul>

<p>This confirmed that:</p>

<ul>
  <li>The Docker image was correct</li>
  <li>GNU Radio was installed properly</li>
  <li>UHD was functioning correctly</li>
  <li>The node could access the USRP</li>
</ul>

<hr />

<h3 id="flowgraph-waiting-for-user-input">Flowgraph Waiting for User Input</h3>

<p>The next issue appeared after startup.</p>

<p>The flowgraph printed:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Press Enter to quit:
</code></pre></div></div>

<p>The generated Python file had been created with the <strong>Prompt for Exit</strong> option in GRC.</p>

<p>Since tasks run non-interactively inside containers, the program waited indefinitely for keyboard input.</p>

<p>My mentor suggested using:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Run to Completion
</code></pre></div></div>

<p>instead of:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Prompt for Exit
</code></pre></div></div>

<p>when generating the Python flowgraph.</p>

<p>This removes the interactive prompt and allows automated execution.</p>

<hr />

<h2 id="3-container-debugging-techniques-learned">3. Container Debugging Techniques Learned</h2>

<p>During the debugging process, I learned several useful techniques:</p>

<ul>
  <li>Reading task logs (<code class="language-plaintext highlighter-rouge">stdout</code> and <code class="language-plaintext highlighter-rouge">stderr</code>)</li>
  <li>Inspecting result directories</li>
  <li>Locating files inside containers</li>
  <li>Understanding container execution environments</li>
  <li>Diagnosing GNU Radio startup issues</li>
</ul>

<p>These techniques significantly improved my understanding of remote experiment execution.</p>

<hr />

<h1 id="4-proposed-task-monitoring-system">4. Proposed Task Monitoring System</h1>

<h2 id="motivation">Motivation</h2>

<p>As the number of experiments grows, manually checking each task becomes inefficient.</p>

<p>I wanted a way to answer:</p>

<ul>
  <li>Which tasks are currently running?</li>
  <li>Which nodes are being used?</li>
  <li>Which tasks passed?</li>
  <li>Which tasks failed?</li>
  <li>Why did a task fail?</li>
</ul>

<hr />

<h2 id="proposed-solution-json-based-task-registry">Proposed Solution: JSON-Based Task Registry</h2>

<p>I propose maintaining a centralized JSON registry on the controlling machine.</p>

<p>When a task is submitted, it is automatically added to the registry.</p>

<p>Example:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"24360"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"RUNNING"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"nodes"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"node17"</span><span class="p">:</span><span class="w"> </span><span class="p">{},</span><span class="w">
      </span><span class="nl">"node03"</span><span class="p">:</span><span class="w"> </span><span class="p">{}</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="monitoring-process">Monitoring Process</h2>

<p>A Python monitoring service periodically checks task status using:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>minus task info &lt;task_id&gt;
</code></pre></div></div>

<p>and updates the registry.</p>

<p>Possible task states:</p>

<ul>
  <li>WAITING</li>
  <li>RUNNING</li>
  <li>FINISHED</li>
  <li>ABORTED</li>
</ul>

<hr />

<h2 id="multi-node-task-support">Multi-Node Task Support</h2>

<p>For tasks running on multiple nodes, each node is monitored independently.</p>

<p>Example:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"24360"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"nodes"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
      </span><span class="nl">"node17"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"PASS"</span><span class="w">
      </span><span class="p">},</span><span class="w">
      </span><span class="nl">"node03"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
        </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"FAIL"</span><span class="p">,</span><span class="w">
        </span><span class="nl">"reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ModuleNotFoundError: No module named 'gnuradio'"</span><span class="w">
      </span><span class="p">}</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="nl">"overall_status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"FAIL"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<p>This makes it easy to identify exactly which node failed.</p>

<hr />

<h2 id="failure-reason-collection">Failure Reason Collection</h2>

<p>When a task completes, the monitoring service inspects:</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">stdout</code></li>
  <li><code class="language-plaintext highlighter-rouge">stderr</code></li>
</ul>

<p>and extracts useful failure information such as:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ModuleNotFoundError
RuntimeError
FileNotFoundError
UHD initialization errors
</code></pre></div></div>

<p>The extracted error message is stored in the registry.</p>

<p>Example:</p>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">{</span><span class="w">
  </span><span class="nl">"node03"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
    </span><span class="nl">"status"</span><span class="p">:</span><span class="w"> </span><span class="s2">"FAIL"</span><span class="p">,</span><span class="w">
    </span><span class="nl">"reason"</span><span class="p">:</span><span class="w"> </span><span class="s2">"ModuleNotFoundError: No module named 'gnuradio'"</span><span class="w">
  </span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div></div>

<hr />

<h2 id="example-dashboard-view">Example Dashboard View</h2>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Task 24359
└── node24 : PASS

Task 24360
├── node17 : PASS
└── node03 : FAIL
    Reason: ModuleNotFoundError: No module named 'gnuradio'

Task 24361
├── node08 : RUNNING
└── node12 : RUNNING
</code></pre></div></div>

<hr />

<h2 id="future-extensions">Future Extensions</h2>

<p>Because the registry is stored as JSON, it can later be integrated with:</p>

<ul>
  <li>CI/CD pipelines</li>
  <li>Web dashboards</li>
  <li>Databases</li>
  <li>Experiment management tools</li>
</ul>

<p>without significant redesign.</p>

<hr />

<h2 id="conclusion">Conclusion</h2>

<p>This week I successfully learned how to deploy and debug GNU Radio experiments on CorteXlab. I resolved issues related to file paths, container environments, GNU Radio initialization, and flowgraph execution.</p>

<p>Additionally, I designed a JSON-based task monitoring architecture capable of tracking task states, node-level success/failure information, and failure reasons. This provides a foundation for future automation and experiment monitoring capabilities.</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Weekly Progress Report: GNU Radio Execution and Task Monitoring Design]]></summary></entry><entry><title type="html">Improve Oar Reservation</title><link href="https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/06/01/improve-oar-reservation.html" rel="alternate" type="text/html" title="Improve Oar Reservation" /><published>2026-06-01T00:00:00+00:00</published><updated>2026-06-01T00:00:00+00:00</updated><id>https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/06/01/improve-oar-reservation</id><content type="html" xml:base="https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/06/01/improve-oar-reservation.html"><![CDATA[<h1 id="improving-the-oar-reservation-orchestrator">Improving the OAR Reservation Orchestrator</h1>

<p>This week, I improved the initial HIL orchestration prototype by making the OAR reservation process more user-friendly and flexible.</p>

<p>The script now supports three reservation modes:</p>

<ul>
  <li>Best Allocation</li>
  <li>Preferred Nodes</li>
  <li>Future Reservation</li>
</ul>

<p>Users can configure walltime and reservation parameters interactively, while the script automatically generates the appropriate OAR command.</p>

<p>To simplify node selection, users only need to enter node numbers (e.g., <code class="language-plaintext highlighter-rouge">31,36</code>), and the script converts them into the corresponding CortexLab hostnames automatically.</p>

<p>I also added an interactive TX/RX assignment step. After nodes are allocated, the script displays the available nodes and allows users to choose which node should act as the transmitter (TX) and which should act as the receiver (RX). This provides more flexibility when preparing HIL experiments involving multiple nodes.</p>

<p>LINK: https://github.com/Sayantan-Maity-hub/gnuradio-hardware-in-loop/blob/main/cortexlab/orchestration.py</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Improving the OAR Reservation Orchestrator]]></summary></entry><entry><title type="html">Automatic Oar Node Allocation</title><link href="https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/05/26/automatic-oar-node-allocation.html" rel="alternate" type="text/html" title="Automatic Oar Node Allocation" /><published>2026-05-26T00:00:00+00:00</published><updated>2026-05-26T00:00:00+00:00</updated><id>https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/05/26/automatic-oar-node-allocation</id><content type="html" xml:base="https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/05/26/automatic-oar-node-allocation.html"><![CDATA[<p>Automating OAR Node Allocation Using Python</p>

<p>In my HIL/GNU Radio workflow, I created a small Python automation script to submit an OAR job, extract the job ID, and retrieve allocated compute nodes automatically.</p>

<p>The main purpose of this script is:</p>

<p>Extract the Job ID for getting detailed information about the submitted OAR job
Extract allocated hostnames/nodes for future automatic scenario YAML generation
Dynamically assign TX and RX nodes for SDR experiments</p>

<p>Link: https://github.com/Sayantan-Maity-hub/gnuradio-hardware-in-loop</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Automating OAR Node Allocation Using Python]]></summary></entry><entry><title type="html">Hello GNU Radio GSoC!</title><link href="https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/05/11/introduction.html" rel="alternate" type="text/html" title="Hello GNU Radio GSoC!" /><published>2026-05-11T00:00:00+00:00</published><updated>2026-05-11T00:00:00+00:00</updated><id>https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/05/11/introduction</id><content type="html" xml:base="https://sayantan-maity-hub.github.io/gnuradio-gsoc-blog/2026/05/11/introduction.html"><![CDATA[<h1 id="hello-gnu-radio-community">Hello GNU Radio Community</h1>

<p>Hi! I am Sayantan Maity, a B.S. Electronics Systems student at IIT Madras.</p>

<p>This summer, I will be working on the GNU Radio GSoC project:</p>

<p><strong>Hardware-in-the-Loop CI Using CortexLab</strong></p>

<p>The goal of the project is to extend GNU Radio’s software-only CI system with automated SDR hardware validation using the CortexLab wireless experimentation platform.</p>

<p>During the community bonding period, I am:</p>
<ul>
  <li>studying existing GNU Radio CI workflows,</li>
  <li>understanding CortexLab infrastructure,</li>
  <li>refining experiment architecture,</li>
  <li>and preparing the implementation roadmap with mentors.</li>
</ul>

<p>I’m excited to work with the GNU Radio community this summer!</p>]]></content><author><name></name></author><summary type="html"><![CDATA[Hello GNU Radio Community]]></summary></entry></feed>