<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on Dhiru's Notebook</title><link>https://rfcorner.in/posts/</link><description>Recent content in Posts on Dhiru's Notebook</description><generator>Hugo -- 0.156.0</generator><language>en-us</language><lastBuildDate>Fri, 27 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://rfcorner.in/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Reversing the Huidu HD-R712 FPGA board</title><link>https://rfcorner.in/posts/reversing-huidu-fpga-board/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/reversing-huidu-fpga-board/</guid><description>&lt;p&gt;We are working on reversing the Huidu HD-R712 LED Display Full Color Receiving
Card - a very cost-effective (~1000 INR) and widely available FPGA board.&lt;/p&gt;
&lt;p&gt;We draw inspiration from the &lt;a href="https://github.com/q3k/chubby75"&gt;https://github.com/q3k/chubby75&lt;/a&gt; work.&lt;/p&gt;
&lt;p&gt;&lt;img alt="FPGA board picture 1" loading="lazy" src="https://rfcorner.in/images/Huidu-3.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="FPGA 'IO Constraint' tool 1" loading="lazy" src="https://rfcorner.in/images/Huidu-6.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://rfcorner.in/files/Huidu_Blink_01.zip"&gt;FPGA Blink Project Files 1&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="random-brain-dump"&gt;Random brain dump&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo openFPGALoader --cable dirtyJtag --freq 10000 --detect
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Jtag frequency : requested 10000Hz -&amp;gt; real 10000Hz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;index 0:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; idcode 0x4014c35
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; manufacturer anlogic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; family eagle d20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; model EG4D20EG176
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; irlength 8
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo openFPGALoader --cable dirtyJtag --detect
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Jtag frequency : requested 6000000Hz -&amp;gt; real 6000000Hz
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;index 0:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; idcode 0x4014c35
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; manufacturer anlogic
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; family eagle d20
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; model EG4D20EG176
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; irlength 8
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;JTAG pinout:
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; V
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;┌───────────────────┐
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt; &lt;span class="m"&gt;7&lt;/span&gt; &lt;span class="m"&gt;9&lt;/span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;│ &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="m"&gt;6&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;└───────────────────┘
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;9&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; TCK
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;7&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; TDO
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;5&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; TMS
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;3&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; NC &lt;span class="o"&gt;(&lt;/span&gt;Not Connected&lt;span class="o"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt;&amp;gt; TDI
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The pin mapping work was done using a DMM, the datasheet, and an optical
magnifier.&lt;/p&gt;</description></item><item><title>The Polar Express - Efficient SSB Generation</title><link>https://rfcorner.in/posts/the-polar-express/</link><pubDate>Mon, 16 Feb 2026 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/the-polar-express/</guid><description>&lt;h2 id="polar-modulation-for-the-masses"&gt;Polar Modulation for the masses&lt;/h2&gt;
&lt;p&gt;We have been working on generating SSB signals using &lt;code&gt;Polar Modulation&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Hardware stack: RP2350-Zero MCU board + Fast Si5351 module + AP63301 buck regulator (for 5W mode).&lt;/p&gt;
&lt;p&gt;&lt;img alt="Polar Modulation SSB 1" loading="lazy" src="https://rfcorner.in/images/PolarModulationSSB-Demo-1.png"&gt;&lt;/p&gt;
&lt;p&gt;Please see &lt;a href="https://github.com/kholia/PolarModulationSSB"&gt;https://github.com/kholia/PolarModulationSSB&lt;/a&gt; for more details.&lt;/p&gt;
&lt;p&gt;The audio fidelity and general quality is ok'ish at the moment but it can only
improve from here. We are yet to hookup the amplitude ("envelope") restoration
part.&lt;/p&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;Why should Guido, Hans, and FlexRadio folks have all the fun? ;)&lt;/p&gt;</description></item><item><title>PA0FRI Active Antenna Redux - The final version?</title><link>https://rfcorner.in/posts/active-antenna-pa0fri-2026/</link><pubDate>Thu, 12 Feb 2026 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/active-antenna-pa0fri-2026/</guid><description>&lt;p&gt;I recently worked on a PA0FRI Active Antenna design with fast BFR93A / BFR106 /
BFR193 transistors.&lt;/p&gt;
&lt;h2 id="design"&gt;Design&lt;/h2&gt;
&lt;p&gt;3D render:&lt;/p&gt;
&lt;p&gt;&lt;img alt="PA0FRI Active Antenna 2026 Render" loading="lazy" src="https://rfcorner.in/images/AA-2026-Final-4.png"&gt;&lt;/p&gt;
&lt;p&gt;Schematic:&lt;/p&gt;
&lt;script type="text/javascript" src= '/js/pdf-js/build/pdf.js'&gt;&lt;/script&gt;
&lt;style&gt;
#embed-pdf-container {
position: relative;
width: 100%;
height: auto;
min-height: 20vh;
}
.pdf-canvas {
border: 1px solid black;
direction: ltr;
width: 100%;
height: auto;
display: none;
}
#the-canvas {
border: 1px solid black;
direction: ltr;
width: 100%;
height: auto;
display: none;
}
.pdf-loadingWrapper {
display: none;
justify-content: center;
align-items: center;
width: 100%;
height: 350px;
}
.pdf-loading {
display: inline-block;
width: 50px;
height: 50px;
border: 3px solid #d2d0d0;;
border-radius: 50%;
border-top-color: #383838;
animation: spin 1s ease-in-out infinite;
-webkit-animation: spin 1s ease-in-out infinite;
}
#overlayText {
word-wrap: break-word;
display: grid;
justify-content: end;
}
#overlayText a {
position: relative;
top: 10px;
right: 4px;
color: #000;
margin: auto;
background-color: #eeeeee;
padding: 0.3em 1em;
border: solid 2px;
border-radius: 12px;
border-color: #00000030;
text-decoration: none;
}
#overlayText svg {
height: clamp(1em, 2vw, 1.4em);
width: clamp(1em, 2vw, 1.4em);
}
@keyframes spin {
to { -webkit-transform: rotate(360deg); }
}
@-webkit-keyframes spin {
to { -webkit-transform: rotate(360deg); }
}
&lt;/style&gt;&lt;div class="embed-pdf-container" id="embed-pdf-container-0dd2c623"&gt;
&lt;div class="pdf-loadingWrapper" id="pdf-loadingWrapper-0dd2c623"&gt;
&lt;div class="pdf-loading" id="pdf-loading-0dd2c623"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id="overlayText"&gt;
&lt;a href="https://rfcorner.in/pdfs/AA-2026.02-1.pdf" aria-label="Download" download&gt;
&lt;svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18"&gt;
&lt;path d="M9 13c.3 0 .5-.1.7-.3L15.4 7 14 5.6l-4 4V1H8v8.6l-4-4L2.6 7l5.7 5.7c.2.2.4.3.7.3zm-7 2h14v2H2z" /&gt;
&lt;/svg&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;canvas class="pdf-canvas" id="pdf-canvas-0dd2c623"&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;div class="pdf-paginator" id="pdf-paginator-0dd2c623"&gt;
&lt;button id="pdf-prev-0dd2c623"&gt;Previous&lt;/button&gt;
&lt;button id="pdf-next-0dd2c623"&gt;Next&lt;/button&gt; &amp;nbsp; &amp;nbsp;
&lt;span&gt;
&lt;span class="pdf-pagenum" id="pdf-pagenum-0dd2c623"&gt;&lt;/span&gt; / &lt;span class="pdf-pagecount" id="pdf-pagecount-0dd2c623"&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;a class="pdf-source" id="pdf-source-0dd2c623" href="https://rfcorner.in/pdfs/AA-2026.02-1.pdf"&gt;[pdf]&lt;/a&gt;
&lt;/div&gt;
&lt;noscript&gt;
View the PDF file &lt;a class="pdf-source" id="pdf-source-noscript-0dd2c623" href="https://rfcorner.in/pdfs/AA-2026.02-1.pdf"&gt;here&lt;/a&gt;.
&lt;/noscript&gt;
&lt;script type="text/javascript"&gt;
(function(){
var url = '\/pdfs\/AA-2026.02-1.pdf';
var hidePaginator = "" === "true";
var hideLoader = "true" === "true";
var selectedPageNum = parseInt("") || 1;
var pdfjsLib = window['pdfjs-dist/build/pdf'];
if (pdfjsLib.GlobalWorkerOptions.workerSrc == '')
pdfjsLib.GlobalWorkerOptions.workerSrc = "https:\/\/rfcorner.in\/" + 'js/pdf-js/build/pdf.worker.js';
var pdfDoc = null,
pageNum = selectedPageNum,
pageRendering = false,
pageNumPending = null,
scale = 3,
canvas = document.getElementById('pdf-canvas-0dd2c623'),
ctx = canvas.getContext('2d'),
paginator = document.getElementById("pdf-paginator-0dd2c623"),
loadingWrapper = document.getElementById('pdf-loadingWrapper-0dd2c623');
showPaginator();
showLoader();
function renderPage(num) {
pageRendering = true;
pdfDoc.getPage(num).then(function(page) {
var viewport = page.getViewport({scale: scale});
canvas.height = viewport.height;
canvas.width = viewport.width;
var renderContext = {
canvasContext: ctx,
viewport: viewport
};
var renderTask = page.render(renderContext);
renderTask.promise.then(function() {
pageRendering = false;
showContent();
if (pageNumPending !== null) {
renderPage(pageNumPending);
pageNumPending = null;
}
});
});
document.getElementById('pdf-pagenum-0dd2c623').textContent = num;
}
function showContent() {
loadingWrapper.style.display = 'none';
canvas.style.display = 'block';
}
function showLoader() {
if(hideLoader) return
loadingWrapper.style.display = 'flex';
canvas.style.display = 'none';
}
function showPaginator() {
if(hidePaginator) return
paginator.style.display = 'block';
}
function queueRenderPage(num) {
if (pageRendering) {
pageNumPending = num;
} else {
renderPage(num);
}
}
function onPrevPage() {
if (pageNum &lt;= 1) {
return;
}
pageNum--;
queueRenderPage(pageNum);
}
document.getElementById('pdf-prev-0dd2c623').addEventListener('click', onPrevPage);
function onNextPage() {
if (pageNum &gt;= pdfDoc.numPages) {
return;
}
pageNum++;
queueRenderPage(pageNum);
}
document.getElementById('pdf-next-0dd2c623').addEventListener('click', onNextPage);
pdfjsLib.getDocument(url).promise.then(function(pdfDoc_) {
pdfDoc = pdfDoc_;
var numPages = pdfDoc.numPages;
document.getElementById('pdf-pagecount-0dd2c623').textContent = numPages;
if(pageNum &gt; numPages) {
pageNum = numPages
}
renderPage(pageNum);
});
})();
&lt;/script&gt;
&lt;h2 id="simulation-results"&gt;Simulation Results&lt;/h2&gt;
&lt;p&gt;&lt;img alt="PA0FRI Active Antenna 2026 Sim 1" loading="lazy" src="https://rfcorner.in/images/AA-2026-Sim-1.png"&gt;&lt;/p&gt;</description></item><item><title>Simplest APRS Digipeater and iGate on MCU!</title><link>https://rfcorner.in/posts/simplest-aprs-digipeater-igate-on-mcu/</link><pubDate>Sat, 07 Feb 2026 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/simplest-aprs-digipeater-igate-on-mcu/</guid><description>&lt;h2 id="description"&gt;Description&lt;/h2&gt;
&lt;p&gt;We have built the simplest, power efficient and 'ready-for-solar' APRS
Digipeater and iGate on a MCU (RPi Pico 2 W)!&lt;/p&gt;
&lt;p&gt;&lt;img alt="KISSLink v1 Render" loading="lazy" src="https://rfcorner.in/images/KISSLink-v1-7.png"&gt;&lt;/p&gt;
&lt;p&gt;Our existing &lt;code&gt;KISSLink v1 BLE KISS TNC&lt;/code&gt; device is capable of running in
standalone mode with an alternate firmware!&lt;/p&gt;
&lt;p&gt;Goal(s): Our design prioritizes low power, reliability, and unattended
deployment over flexibility.&lt;/p&gt;
&lt;p&gt;And yes, we want to do this with cheap, widely available BaoFeng radios. This
means a couple of things:&lt;/p&gt;</description></item><item><title>Wireless APRS interface for BaoFeng and other radios!</title><link>https://rfcorner.in/posts/aprs-interface-v2/</link><pubDate>Thu, 29 Jan 2026 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/aprs-interface-v2/</guid><description>&lt;h2 id="description"&gt;Description&lt;/h2&gt;
&lt;p&gt;We have built a Bluetooth-enabled and APRSdroid-compatible digital interface (KISS TNC) for less than 15 USD (for the fully-loaded make including cables). We call it the KISSLink v1.&lt;/p&gt;
&lt;p&gt;&lt;img alt="KISSLink v1" loading="lazy" src="https://rfcorner.in/images/aprsdroid-3.jpg"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="KISSLink v1 Render" loading="lazy" src="https://rfcorner.in/images/KISSLink-v1-7.png"&gt;&lt;/p&gt;
&lt;p&gt;This digital interface can be powered from the USB 5V or the inbuilt battery.&lt;/p&gt;
&lt;h2 id="schematic"&gt;Schematic&lt;/h2&gt;
&lt;div class="embed-pdf-container" id="embed-pdf-container-f1c39fe8"&gt;
&lt;div class="pdf-loadingWrapper" id="pdf-loadingWrapper-f1c39fe8"&gt;
&lt;div class="pdf-loading" id="pdf-loading-f1c39fe8"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id="overlayText"&gt;
&lt;a href="https://rfcorner.in/pdfs/KISSLink-v1.pdf" aria-label="Download" download&gt;
&lt;svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18"&gt;
&lt;path d="M9 13c.3 0 .5-.1.7-.3L15.4 7 14 5.6l-4 4V1H8v8.6l-4-4L2.6 7l5.7 5.7c.2.2.4.3.7.3zm-7 2h14v2H2z" /&gt;
&lt;/svg&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;canvas class="pdf-canvas" id="pdf-canvas-f1c39fe8"&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;div class="pdf-paginator" id="pdf-paginator-f1c39fe8"&gt;
&lt;button id="pdf-prev-f1c39fe8"&gt;Previous&lt;/button&gt;
&lt;button id="pdf-next-f1c39fe8"&gt;Next&lt;/button&gt; &amp;nbsp; &amp;nbsp;
&lt;span&gt;
&lt;span class="pdf-pagenum" id="pdf-pagenum-f1c39fe8"&gt;&lt;/span&gt; / &lt;span class="pdf-pagecount" id="pdf-pagecount-f1c39fe8"&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;a class="pdf-source" id="pdf-source-f1c39fe8" href="https://rfcorner.in/pdfs/KISSLink-v1.pdf"&gt;[pdf]&lt;/a&gt;
&lt;/div&gt;
&lt;noscript&gt;
View the PDF file &lt;a class="pdf-source" id="pdf-source-noscript-f1c39fe8" href="https://rfcorner.in/pdfs/KISSLink-v1.pdf"&gt;here&lt;/a&gt;.
&lt;/noscript&gt;
&lt;script type="text/javascript"&gt;
(function(){
var url = '\/pdfs\/KISSLink-v1.pdf';
var hidePaginator = "" === "true";
var hideLoader = "true" === "true";
var selectedPageNum = parseInt("") || 1;
var pdfjsLib = window['pdfjs-dist/build/pdf'];
if (pdfjsLib.GlobalWorkerOptions.workerSrc == '')
pdfjsLib.GlobalWorkerOptions.workerSrc = "https:\/\/rfcorner.in\/" + 'js/pdf-js/build/pdf.worker.js';
var pdfDoc = null,
pageNum = selectedPageNum,
pageRendering = false,
pageNumPending = null,
scale = 3,
canvas = document.getElementById('pdf-canvas-f1c39fe8'),
ctx = canvas.getContext('2d'),
paginator = document.getElementById("pdf-paginator-f1c39fe8"),
loadingWrapper = document.getElementById('pdf-loadingWrapper-f1c39fe8');
showPaginator();
showLoader();
function renderPage(num) {
pageRendering = true;
pdfDoc.getPage(num).then(function(page) {
var viewport = page.getViewport({scale: scale});
canvas.height = viewport.height;
canvas.width = viewport.width;
var renderContext = {
canvasContext: ctx,
viewport: viewport
};
var renderTask = page.render(renderContext);
renderTask.promise.then(function() {
pageRendering = false;
showContent();
if (pageNumPending !== null) {
renderPage(pageNumPending);
pageNumPending = null;
}
});
});
document.getElementById('pdf-pagenum-f1c39fe8').textContent = num;
}
function showContent() {
loadingWrapper.style.display = 'none';
canvas.style.display = 'block';
}
function showLoader() {
if(hideLoader) return
loadingWrapper.style.display = 'flex';
canvas.style.display = 'none';
}
function showPaginator() {
if(hidePaginator) return
paginator.style.display = 'block';
}
function queueRenderPage(num) {
if (pageRendering) {
pageNumPending = num;
} else {
renderPage(num);
}
}
function onPrevPage() {
if (pageNum &lt;= 1) {
return;
}
pageNum--;
queueRenderPage(pageNum);
}
document.getElementById('pdf-prev-f1c39fe8').addEventListener('click', onPrevPage);
function onNextPage() {
if (pageNum &gt;= pdfDoc.numPages) {
return;
}
pageNum++;
queueRenderPage(pageNum);
}
document.getElementById('pdf-next-f1c39fe8').addEventListener('click', onNextPage);
pdfjsLib.getDocument(url).promise.then(function(pdfDoc_) {
pdfDoc = pdfDoc_;
var numPages = pdfDoc.numPages;
document.getElementById('pdf-pagecount-f1c39fe8').textContent = numPages;
if(pageNum &gt; numPages) {
pageNum = numPages
}
renderPage(pageNum);
});
})();
&lt;/script&gt;
&lt;h2 id="rx-path-simulation-af-front-end"&gt;RX path simulation (AF front-end)&lt;/h2&gt;
&lt;p&gt;&lt;img alt="KISSLink v1 Simulation TX" loading="lazy" src="https://rfcorner.in/images/KISSLink-Sim-TX-1.png"&gt;&lt;/p&gt;</description></item><item><title>APRS interface for BaoFeng and other radios</title><link>https://rfcorner.in/posts/aprs-interface/</link><pubDate>Sat, 17 Jan 2026 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/aprs-interface/</guid><description>&lt;h2 id="the-design"&gt;The design&lt;/h2&gt;
&lt;p&gt;Here is a "safe" APRS interface for BaoFeng and other radios.&lt;/p&gt;
&lt;p&gt;Sample schematic:&lt;/p&gt;
&lt;script type="text/javascript" src= '/js/pdf-js/build/pdf.js'&gt;&lt;/script&gt;
&lt;style&gt;
#embed-pdf-container {
position: relative;
width: 100%;
height: auto;
min-height: 20vh;
}
.pdf-canvas {
border: 1px solid black;
direction: ltr;
width: 100%;
height: auto;
display: none;
}
#the-canvas {
border: 1px solid black;
direction: ltr;
width: 100%;
height: auto;
display: none;
}
.pdf-loadingWrapper {
display: none;
justify-content: center;
align-items: center;
width: 100%;
height: 350px;
}
.pdf-loading {
display: inline-block;
width: 50px;
height: 50px;
border: 3px solid #d2d0d0;;
border-radius: 50%;
border-top-color: #383838;
animation: spin 1s ease-in-out infinite;
-webkit-animation: spin 1s ease-in-out infinite;
}
#overlayText {
word-wrap: break-word;
display: grid;
justify-content: end;
}
#overlayText a {
position: relative;
top: 10px;
right: 4px;
color: #000;
margin: auto;
background-color: #eeeeee;
padding: 0.3em 1em;
border: solid 2px;
border-radius: 12px;
border-color: #00000030;
text-decoration: none;
}
#overlayText svg {
height: clamp(1em, 2vw, 1.4em);
width: clamp(1em, 2vw, 1.4em);
}
@keyframes spin {
to { -webkit-transform: rotate(360deg); }
}
@-webkit-keyframes spin {
to { -webkit-transform: rotate(360deg); }
}
&lt;/style&gt;&lt;div class="embed-pdf-container" id="embed-pdf-container-7475f967"&gt;
&lt;div class="pdf-loadingWrapper" id="pdf-loadingWrapper-7475f967"&gt;
&lt;div class="pdf-loading" id="pdf-loading-7475f967"&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div id="overlayText"&gt;
&lt;a href="https://rfcorner.in/pdfs/TheDigitalInterface-2026.pdf" aria-label="Download" download&gt;
&lt;svg aria-hidden="true" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 18 18"&gt;
&lt;path d="M9 13c.3 0 .5-.1.7-.3L15.4 7 14 5.6l-4 4V1H8v8.6l-4-4L2.6 7l5.7 5.7c.2.2.4.3.7.3zm-7 2h14v2H2z" /&gt;
&lt;/svg&gt;
&lt;/a&gt;
&lt;/div&gt;
&lt;canvas class="pdf-canvas" id="pdf-canvas-7475f967"&gt;&lt;/canvas&gt;
&lt;/div&gt;
&lt;div class="pdf-paginator" id="pdf-paginator-7475f967"&gt;
&lt;button id="pdf-prev-7475f967"&gt;Previous&lt;/button&gt;
&lt;button id="pdf-next-7475f967"&gt;Next&lt;/button&gt; &amp;nbsp; &amp;nbsp;
&lt;span&gt;
&lt;span class="pdf-pagenum" id="pdf-pagenum-7475f967"&gt;&lt;/span&gt; / &lt;span class="pdf-pagecount" id="pdf-pagecount-7475f967"&gt;&lt;/span&gt;
&lt;/span&gt;
&lt;a class="pdf-source" id="pdf-source-7475f967" href="https://rfcorner.in/pdfs/TheDigitalInterface-2026.pdf"&gt;[pdf]&lt;/a&gt;
&lt;/div&gt;
&lt;noscript&gt;
View the PDF file &lt;a class="pdf-source" id="pdf-source-noscript-7475f967" href="https://rfcorner.in/pdfs/TheDigitalInterface-2026.pdf"&gt;here&lt;/a&gt;.
&lt;/noscript&gt;
&lt;script type="text/javascript"&gt;
(function(){
var url = '\/pdfs\/TheDigitalInterface-2026.pdf';
var hidePaginator = "" === "true";
var hideLoader = "true" === "true";
var selectedPageNum = parseInt("") || 1;
var pdfjsLib = window['pdfjs-dist/build/pdf'];
if (pdfjsLib.GlobalWorkerOptions.workerSrc == '')
pdfjsLib.GlobalWorkerOptions.workerSrc = "https:\/\/rfcorner.in\/" + 'js/pdf-js/build/pdf.worker.js';
var pdfDoc = null,
pageNum = selectedPageNum,
pageRendering = false,
pageNumPending = null,
scale = 3,
canvas = document.getElementById('pdf-canvas-7475f967'),
ctx = canvas.getContext('2d'),
paginator = document.getElementById("pdf-paginator-7475f967"),
loadingWrapper = document.getElementById('pdf-loadingWrapper-7475f967');
showPaginator();
showLoader();
function renderPage(num) {
pageRendering = true;
pdfDoc.getPage(num).then(function(page) {
var viewport = page.getViewport({scale: scale});
canvas.height = viewport.height;
canvas.width = viewport.width;
var renderContext = {
canvasContext: ctx,
viewport: viewport
};
var renderTask = page.render(renderContext);
renderTask.promise.then(function() {
pageRendering = false;
showContent();
if (pageNumPending !== null) {
renderPage(pageNumPending);
pageNumPending = null;
}
});
});
document.getElementById('pdf-pagenum-7475f967').textContent = num;
}
function showContent() {
loadingWrapper.style.display = 'none';
canvas.style.display = 'block';
}
function showLoader() {
if(hideLoader) return
loadingWrapper.style.display = 'flex';
canvas.style.display = 'none';
}
function showPaginator() {
if(hidePaginator) return
paginator.style.display = 'block';
}
function queueRenderPage(num) {
if (pageRendering) {
pageNumPending = num;
} else {
renderPage(num);
}
}
function onPrevPage() {
if (pageNum &lt;= 1) {
return;
}
pageNum--;
queueRenderPage(pageNum);
}
document.getElementById('pdf-prev-7475f967').addEventListener('click', onPrevPage);
function onNextPage() {
if (pageNum &gt;= pdfDoc.numPages) {
return;
}
pageNum++;
queueRenderPage(pageNum);
}
document.getElementById('pdf-next-7475f967').addEventListener('click', onNextPage);
pdfjsLib.getDocument(url).promise.then(function(pdfDoc_) {
pdfDoc = pdfDoc_;
var numPages = pdfDoc.numPages;
document.getElementById('pdf-pagecount-7475f967').textContent = numPages;
if(pageNum &gt; numPages) {
pageNum = numPages
}
renderPage(pageNum);
});
})();
&lt;/script&gt;
&lt;h2 id="render"&gt;Render&lt;/h2&gt;
&lt;p&gt;&lt;img alt="TheDigitalInterface-2026" loading="lazy" src="https://rfcorner.in/images/TheDigitalInterface-2026.png"&gt;&lt;/p&gt;</description></item><item><title>A VFM ADS-B receiver</title><link>https://rfcorner.in/posts/vfm-ads-b-receiver/</link><pubDate>Mon, 12 Jan 2026 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/vfm-ads-b-receiver/</guid><description>&lt;h2 id="idea"&gt;Idea&lt;/h2&gt;
&lt;p&gt;Ismo recently shared the &lt;a href="https://github.com/CoolNamesAllTaken/adsbee"&gt;https://github.com/CoolNamesAllTaken/adsbee&lt;/a&gt; project which is pretty cool.&lt;/p&gt;
&lt;h2 id="challenges"&gt;Challenges&lt;/h2&gt;
&lt;p&gt;The ADS-B (Automatic Dependent Surveillance-Broadcast) system uses a data rate of 1 Mbit/s (1 megabit per second) for its aircraft position and identification transmissions on the 1090 MHz frequency. This is too much for HOPERF CMT2300A and related transceiver chips unfortunately!&lt;/p&gt;
&lt;p&gt;This got us thinking about the following VFM ADS-B RX chain.&lt;/p&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;p&gt;Here is a simple ADS-B RX circuit description.&lt;/p&gt;</description></item><item><title>Reasonable MCU ADC performance - STM32H562</title><link>https://rfcorner.in/posts/reasonable-mcu-adc-performance/</link><pubDate>Sat, 10 Jan 2026 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/reasonable-mcu-adc-performance/</guid><description>&lt;p&gt;Ismo (OH2FTG) has praised the STM32's ADC quality multiple times, and I finally decided to give it a go.&lt;/p&gt;
&lt;p&gt;I usually stick with Waveshare RP2350-Zero boards, but the RP2350 ADC performance is limited to under 10 ENOB.&lt;/p&gt;
&lt;p&gt;With the STM32H562RGT6, we're able to achieve ~13 ENOB using 16× hardware ADC oversampling, with potential headroom to push this even further.&lt;/p&gt;
&lt;p&gt;By sampling the Si4732's SSB output using the STM32H562RGT6 ADC and exposing the audio samples to the host via a "virtual" USB UAC-2 device, we get the following RX results:&lt;/p&gt;</description></item><item><title>Alternate to PE4312 Digital Step Attenuator</title><link>https://rfcorner.in/posts/alternate-to-pe4312-attenuator/</link><pubDate>Thu, 08 Jan 2026 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/alternate-to-pe4312-attenuator/</guid><description>&lt;p&gt;The PE4312 is a 50Ω, 6-bit RF digital step attenuator available for around 2
USD. Pretty neat for implementing real digital AGC!&lt;/p&gt;
&lt;p&gt;For half-the-price we can get the alternate Archiwave ARW637 or ARW621A ICs
which work very similarly to PE4312!&lt;/p&gt;
&lt;p&gt;References:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.lcsc.com/product-detail/C49842521.html"&gt;Archiwave ARW637&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.lcsc.com/product-detail/C49842520.html"&gt;Archiwave ARW621A&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>The best power supply for FieldOps</title><link>https://rfcorner.in/posts/best-power-supply-for-fieldops/</link><pubDate>Tue, 06 Jan 2026 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/best-power-supply-for-fieldops/</guid><description>&lt;p&gt;This short article describes a flight-safe power supply for FieldOps.&lt;/p&gt;
&lt;h2 id="component-list"&gt;Component List&lt;/h2&gt;
&lt;p&gt;Simply get these:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://punoscho.in/product/usb-qc-pd-afc-trigger-decoy-board-module-9v/"&gt;USB QC/PD AFC trigger decoy board (9V)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://punoscho.in/product/usb-qc-pd-afc-trigger-decoy-board-module-12v/"&gt;USB QC/PD AFC trigger decoy board (12V)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://punoscho.in/product/usb-qc-pd-afc-trigger-decoy-board-module-15v/"&gt;USB QC/PD AFC trigger decoy board (15V)&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.mi.com/in/product/xiaomi-pocket-power-bank-pro-10000-mah-33w/"&gt;Xiaomi Pocket Power Bank Pro 10000 33W&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This one does 9V, 12V, 15V and 20V without any problems.&lt;/p&gt;
&lt;p&gt;OR&lt;/p&gt;
&lt;p&gt;A 65W USB PD power bank - not needed for 5 to 10W QRP FieldOps&lt;/p&gt;</description></item><item><title>Supporting HOPERF CMT2300A on Linux</title><link>https://rfcorner.in/posts/supporting-cmt2300a-on-linux/</link><pubDate>Tue, 23 Dec 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/supporting-cmt2300a-on-linux/</guid><description>&lt;h2 id="what-this-article-covers"&gt;What This Article Covers&lt;/h2&gt;
&lt;p&gt;This article presents a practical journey to add Linux support for the HOPERF CMT2300A Sub-GHz RF transceiver - starting from extracting register configuration tables out of vendor firmware, to building and testing a Linux driver on real hardware.&lt;/p&gt;
&lt;p&gt;You'll learn:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;How TP-Link's driver situation motivated this effort&lt;/li&gt;
&lt;li&gt;How firmware was extracted and analyzed&lt;/li&gt;
&lt;li&gt;How to build and load the custom driver on Raspberry Pi&lt;/li&gt;
&lt;li&gt;How to verify real on-air packet RX&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This is aimed at embedded Linux developers, reverse engineers, and RF hackers. It is &lt;em&gt;not&lt;/em&gt; a beginner Linux kernel tutorial nor a full CMT2300A datasheet walkthrough - focus is on practical bring-up and reproducibility.&lt;/p&gt;</description></item><item><title>HFDY Active Loop - LZ1AQ loop clone</title><link>https://rfcorner.in/posts/hfdy-active-antenna-lz1aq-clone/</link><pubDate>Sun, 09 Nov 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/hfdy-active-antenna-lz1aq-clone/</guid><description>&lt;p&gt;The HFDY Active Loop is working extremely well and that too from an indoor location in &lt;code&gt;MK68&lt;/code&gt;! Pretty awesome ;)&lt;/p&gt;
&lt;h2 id="design"&gt;Design&lt;/h2&gt;
&lt;p&gt;&lt;img alt="HFDY Active Loop Photo" loading="lazy" src="https://rfcorner.in/images/HFDY-Active-Loop.jpg"&gt;&lt;/p&gt;
&lt;p&gt;I am running the loop at 5V (via a regulated linear power supply) currently where it consumes slightly less than 65mA of current. The recommended voltage is 10V, which I will shift to soon.&lt;/p&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;&lt;img alt="HFDY Active Loop Results" loading="lazy" src="https://rfcorner.in/images/HFDY-Active-Loop-Results-10.png"&gt;&lt;/p&gt;
&lt;p&gt;I am using &lt;code&gt;Airspy HF+ Discovery&lt;/code&gt; SDR for this experiment.&lt;/p&gt;</description></item><item><title>Sustainable Radio Design V2</title><link>https://rfcorner.in/posts/sustainable-radio-design-2/</link><pubDate>Fri, 07 Nov 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/sustainable-radio-design-2/</guid><description>&lt;p&gt;Related articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://rfcorner.in/posts/proper-single-transistor-lna-hf/"&gt;Proper Single Transistor LNA for HF&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://rfcorner.in/posts/sustainable-radio-design/"&gt;A Sustainable Radio Design?&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="design"&gt;Design&lt;/h2&gt;
&lt;p&gt;We are finally going to build a QSD RX!&lt;/p&gt;
&lt;p&gt;Here is the rough schematic I am thinking about:&lt;/p&gt;
&lt;p&gt;&lt;img alt="QSD RX schematic" loading="lazy" src="https://rfcorner.in/images/QSD-Schematic-1.png"&gt;&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.n6qw.com/MC1496.html"&gt;MC1496 Information&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/steve-m/hsdaoh-rp2350"&gt;HSDAOH on RP2350&lt;/a&gt; (see &lt;code&gt;internal_adc&lt;/code&gt; section)&lt;/p&gt;
&lt;p&gt;This way we can continue using &lt;code&gt;RP2350&lt;/code&gt; instead of moving to something like &lt;code&gt;STM32H5&lt;/code&gt; immediately&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/dawsonjon/PicoRX/tree/master/simulations"&gt;PicoRX Simulations&lt;/a&gt; (also for DSP code)&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Writing test cases for PCBs</title><link>https://rfcorner.in/posts/writing-test-cases-for-pcbs/</link><pubDate>Fri, 07 Nov 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/writing-test-cases-for-pcbs/</guid><description>&lt;p&gt;This note demonstrates a small &lt;code&gt;connectivity tester&lt;/code&gt; / &lt;code&gt;check nets&lt;/code&gt; program for
KiCad. This program allows doing checks like: Is the &lt;code&gt;U1:8&lt;/code&gt; pin connected to
&lt;code&gt;GND&lt;/code&gt;?&lt;/p&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;Sometimes visual errors can creep in the schematic (and the PCB subsequently).
This &lt;code&gt;connectivity tester&lt;/code&gt; allows expressing the same connections in a
non-visual way (with a different probability of making errors).&lt;/p&gt;
&lt;p&gt;The ERC and DRC checks in KiCad work great but this non-visual test assertions
provide another level of sanity checking.&lt;/p&gt;</description></item><item><title>Choosing a coax for HF field operations</title><link>https://rfcorner.in/posts/choosing-a-coax-for-field/</link><pubDate>Wed, 05 Nov 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/choosing-a-coax-for-field/</guid><description>&lt;p&gt;Setup: Si5351 RF generator (@ 28 MHz) ➔ GSD-Hacks-v5 digital amplifier ➔ 7th order LPF ➔ {COAX-UNDER-TEST} ➔ Digital RF power meter ➔ Dummy load&lt;/p&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;Results at 13.8V drain:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Coax Type&lt;/th&gt;
&lt;th&gt;Power Reading&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RG-58 (7 meters)&lt;/td&gt;
&lt;td&gt;4.5W&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RG-316 (7 meters)&lt;/td&gt;
&lt;td&gt;3.9W&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RG-188 (7 meters)&lt;/td&gt;
&lt;td&gt;3.9W&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Results at 15V drain:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Coax Type&lt;/th&gt;
&lt;th&gt;Power Reading&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RG-58 (7 meters)&lt;/td&gt;
&lt;td&gt;5.4W&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RG-316 (7 meters)&lt;/td&gt;
&lt;td&gt;4.7W&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RG-188 (7 meters)&lt;/td&gt;
&lt;td&gt;4.7W&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;These measurement results seem to match the ones from &lt;code&gt;Eric, WD8RIF&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Easy reproducible LPF filters</title><link>https://rfcorner.in/posts/easy-lpfs/</link><pubDate>Sat, 01 Nov 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/easy-lpfs/</guid><description>&lt;p&gt;Here is the schematic for a standard 50Ω LPF for the 12-11-10m bands.&lt;/p&gt;
&lt;h2 id="designs"&gt;Designs&lt;/h2&gt;
&lt;p&gt;&lt;img alt="LPF Schematic 3" loading="lazy" src="https://rfcorner.in/images/LPF-Schematic-1.png"&gt;&lt;/p&gt;
&lt;p&gt;PCB Render:&lt;/p&gt;
&lt;p&gt;&lt;img alt="LPF Render" loading="lazy" src="https://rfcorner.in/images/LPF-Render.png"&gt;&lt;/p&gt;
&lt;p&gt;Actual photo:&lt;/p&gt;
&lt;p&gt;&lt;img alt="LPF Board Photo" loading="lazy" src="https://rfcorner.in/images/LPF-Photo-1.jpg"&gt;&lt;/p&gt;
&lt;h2 id="performance"&gt;Performance&lt;/h2&gt;
&lt;p&gt;NanoVNA results of the PCB build:&lt;/p&gt;
&lt;p&gt;&lt;img alt="LPF NanoVNA Result 1" loading="lazy" src="https://rfcorner.in/images/LPF-NanoVNA-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="LPF NanoVNA Result 2" loading="lazy" src="https://rfcorner.in/images/LPF-NanoVNA-2.png"&gt;&lt;/p&gt;
&lt;h2 id="build-notes"&gt;Build Notes&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;These values come from RobG (https://hackaday.io/)
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shunt C: 100pF
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Series L: 12T on T37-6 core, 11T on T50-6, making about 485nH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shunt C: 180pF
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Series L: 13T on T37-6 core, 12T on T50-6, making about 580nH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shunt C: 180pF
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Series L: 12T on T37-6 core, 11T on T50-6, making about 485nH
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Shunt C: 100pF
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Winding wire size: 27 SWG (is non-critical)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Note: We needed to reduce 1T (from the values specified above) when using the T50-6 cores. As usual, use a DE-5000 LCR Meter (or better) to know the exact values.&lt;/p&gt;</description></item><item><title>A proper single transistor LNA for HF</title><link>https://rfcorner.in/posts/proper-single-transistor-lna-hf/</link><pubDate>Tue, 28 Oct 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/proper-single-transistor-lna-hf/</guid><description>&lt;p&gt;Note: This HF LNA design is inspired by PY2OHH designs and mcHF work.&lt;/p&gt;
&lt;p&gt;Previous article: &lt;a href="https://rfcorner.in/posts/single-transistor-lna-hf/"&gt;Single Transistor LNA for HF&lt;/a&gt; - it cut a corner when it came to output impedance matching ;)&lt;/p&gt;
&lt;h2 id="design"&gt;Design&lt;/h2&gt;
&lt;p&gt;The idea that a single-transistor-preamp with 10 dB gain is more than enough for HF comes from Gajendra Kumar (VU2BGS). As a new "designer" I am often overwhelmed by the different possible design paths - so having guidance from an &lt;code&gt;elmer&lt;/code&gt; becomes crucial.&lt;/p&gt;</description></item><item><title>My solar powered WSPR beacon</title><link>https://rfcorner.in/posts/my-solar-powered-wspr-beacon/</link><pubDate>Sun, 26 Oct 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/my-solar-powered-wspr-beacon/</guid><description>&lt;p&gt;My solar powered WSPR beacon is now active on the 12m band!&lt;/p&gt;
&lt;h2 id="tech-stack"&gt;Tech Stack&lt;/h2&gt;
&lt;p&gt;Tech stack: Navitas 100W Solar Panel, Exide Solar Blitz 40AH battery, Skypearll Solar Charge Controller 30A, 200W 20A DC-DC CC CV Buck module (Robu) - set to output 7.5V, Waveshare ESP32-S3 Zero board, Si5351 with 0.5ppm TCXO, &lt;code&gt;GSD-Hacks-v5&lt;/code&gt; amplifier, DFRobot Gravity Digital 5A Relay Module&lt;/p&gt;
&lt;p&gt;Photos of components involved (for reference):&lt;/p&gt;
&lt;p&gt;&lt;img alt="200W CC CV Buck Module" loading="lazy" src="https://rfcorner.in/images/200W-CC-CV-Buck-Module.jpg"&gt;&lt;/p&gt;</description></item><item><title>Headless WSPR Monitoring System (2025)</title><link>https://rfcorner.in/posts/headless-wspr-monitoring-system/</link><pubDate>Wed, 22 Oct 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/headless-wspr-monitoring-system/</guid><description>&lt;h3 id="setup-os-and-sdr"&gt;Setup OS and SDR&lt;/h3&gt;
&lt;p&gt;Please use the latest Raspberry Pi OS 64-bit on RPi 4 or later.&lt;/p&gt;
&lt;p&gt;Using a Raspberry Pi (&amp;lt;=3) is NOT recommended as it has quite a bit of power
supply noise on the USB ports, which reduces the performance of the connected
SDR.&lt;/p&gt;
&lt;p&gt;Install dependencies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install airspyhf &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; soapysdr-tools sox libsox-fmt-all wsjtx &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; pulseaudio-utils git vim fluxbox xterm tightvncserver
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get install cmake pkg-config &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libusb-1.0-0-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libasound2-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libairspy-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libairspyhf-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; librtlsdr-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libsndfile1-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; portaudio19-dev &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libvolk-dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Build &lt;code&gt;airspyhf-fmradion&lt;/code&gt; SDR software:&lt;/p&gt;</description></item><item><title>Inbuilt band-hopping in WSJT-X 3.x</title><link>https://rfcorner.in/posts/wsjtx-band-hopping/</link><pubDate>Sat, 18 Oct 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/wsjtx-band-hopping/</guid><description>&lt;p&gt;WSJT-X 3.x has inbuilt support for band hopping!&lt;/p&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Band hopping in action" loading="lazy" src="https://rfcorner.in/images/WSJTX-Band-Hopping.png"&gt;&lt;/p&gt;
&lt;p&gt;RX results from an experimental version of DDX:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Band hopping in action 2" loading="lazy" src="https://rfcorner.in/images/WSJTX-Band-Hopping-2.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="Super rare island heard" loading="lazy" src="https://rfcorner.in/images/DDX-Rare-Island-2025.png"&gt;&lt;/p&gt;
&lt;p&gt;This is super useful for monitoring FT8 traffic on multiple bands.&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://github.com/kholia/libmirisdr-5"&gt;libmirisdr-5&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://sourceforge.net/projects/wsjt-x-improved/files/"&gt;WSJT-X Improved&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>The (now) poor quality, reliability and longevity of Luminous products</title><link>https://rfcorner.in/posts/poor-reliability-luminous/</link><pubDate>Sat, 18 Oct 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/poor-reliability-luminous/</guid><description>&lt;p&gt;My old Luminous Zelio inverter (bought in ~2013) lasted for close to 8 years.&lt;/p&gt;
&lt;p&gt;Trusting the Luminous brand, I installed two more Luminous Zelio inverters in year 2024 in two different homes.&lt;/p&gt;
&lt;p&gt;Come year 2025 and both these Zelio inverters have conked off and that too in less than a year!&lt;/p&gt;
&lt;p&gt;I guess they don't make the Zelio inverters the way they used to :-(&lt;/p&gt;
&lt;p&gt;For now, I have shifted to &lt;code&gt;Microtek Heavy Duty UPS 1750&lt;/code&gt; and &lt;code&gt;Microtek 1275 12V SW&lt;/code&gt; inverter models.&lt;/p&gt;</description></item><item><title>A Sustainable Radio Design?</title><link>https://rfcorner.in/posts/sustainable-radio-design/</link><pubDate>Fri, 17 Oct 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/sustainable-radio-design/</guid><description>&lt;p&gt;Future radio receiver design ideas (from Ismo, Pete and other folks):&lt;/p&gt;
&lt;p&gt;Antenna ➔ (BPF) ➔ BFR93A based pre-amp from mcHF project ➔ MC1496 (Mixer) ➔ 455 kHz IF ➔ Ceramic filter SMD (HCI) ➔ 'IF amplifier' (20-40 dB gain?) ➔ Overclocked Pico 2's ADC (3+ MSPS) ➔ Digital down-conversion and processing in digital domain ➔ Expose the processed audio samples over USB (Pico 2 acts as a sound card).&lt;/p&gt;
&lt;p&gt;Benefits: This enables reception of SSB and CW signals! The 455 kHz IF with digital processing gives us the best of both analog selectivity (ceramic filter) and digital flexibility.&lt;/p&gt;</description></item><item><title>Emulating a full FT8 band for 'real'</title><link>https://rfcorner.in/posts/busy-ft8-band-simulation/</link><pubDate>Fri, 17 Oct 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/busy-ft8-band-simulation/</guid><description>&lt;p&gt;&lt;a href="https://github.com/kholia/ConsensusBasedTimeSync/tree/master/Wide-FT8-Tester"&gt;This code&lt;/a&gt; generates a .wav file which emulates a fully-populated FT8 band!&lt;/p&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;p&gt;This .wav file can then be played with &lt;code&gt;rpitx&lt;/code&gt; on actual air (well on a dummy load) for receiver testing purposes.&lt;/p&gt;
&lt;p&gt;&lt;img alt="FT8 Full-Band Demo 1" loading="lazy" src="https://rfcorner.in/images/Wide-FT8-Tester-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="FT8 Full-Band Demo 2" loading="lazy" src="https://rfcorner.in/images/Wide-FT8-Tester-2.png"&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rm mixed.wav&lt;span class="p"&gt;;&lt;/span&gt; sox -m *.wav mixed.wav
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sox mixed.wav -r &lt;span class="m"&gt;48000&lt;/span&gt; sampleaudio.wav
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now play sampleaudio.wav using &lt;a href="https://github.com/F5OEO/rpitx"&gt;rpitx&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="testing"&gt;Testing&lt;/h2&gt;
&lt;p&gt;I have tested &lt;a href="https://github.com/F5OEO/rpitx"&gt;rpitx&lt;/a&gt; on Raspberry Pi Zero 2W TX'ing @ 14.074 MHz.&lt;/p&gt;</description></item><item><title>433 MHz CW signal source</title><link>https://rfcorner.in/posts/uhf-signal-source/</link><pubDate>Sat, 04 Oct 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/uhf-signal-source/</guid><description>&lt;p&gt;For HF and amateur VHF bands our &lt;a href="https://rfcorner.in/posts/wifi-vfo/"&gt;WiFi VFO&lt;/a&gt; works great.&lt;/p&gt;
&lt;p&gt;But we didn't have a cost-effective UHF signal source until now&amp;hellip;&lt;/p&gt;
&lt;h2 id="design"&gt;Design&lt;/h2&gt;
&lt;p&gt;Thanks to Ismo (OH2FTG), we recently experimented with a HopeRF CMT2119A powered board called &lt;code&gt;HOPERF RF module RFM119W-433S1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here is the CMT2119A powered board in action producing a CW (OOK) signal at ~433 MHz.&lt;/p&gt;
&lt;p&gt;&lt;img alt="UHF CW Demo 1" loading="lazy" src="https://rfcorner.in/images/433-CW-Beacon.png"&gt;&lt;/p&gt;
&lt;p&gt;The stability is pretty good and a bit surprising considering that the board uses a 20ppm 26 MHz regular quartz crystal - not bad!&lt;/p&gt;</description></item><item><title>Making Manhattan constructions easier, better, cost-effective and almost tool-free</title><link>https://rfcorner.in/posts/easier-manhattan-construction/</link><pubDate>Sat, 04 Oct 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/easier-manhattan-construction/</guid><description>&lt;p&gt;Instead of punching islands or using commercial pads (islands) or making traditional pads myself, I simply make use of small pieces of single-sided PCBs to create the pads / islands easily for my boards.&lt;/p&gt;
&lt;h2 id="the-technique"&gt;The Technique&lt;/h2&gt;
&lt;p&gt;&lt;img alt="TX-BPF Manhattan build results" loading="lazy" src="https://rfcorner.in/images/TX-BPF-Demo.jpg"&gt;&lt;/p&gt;
&lt;p&gt;This technique has a huge advantage over the &lt;code&gt;punched islands&lt;/code&gt; or &lt;code&gt;scored and divided boards&lt;/code&gt; techniques as it keeps the bottom ground plane perfectly 100% intact!&lt;/p&gt;
&lt;p&gt;Also, it is almost a tool-free process to create the pads by breaking or cutting the single-sided PCBs. Single-sided prototyping boards also happen to be very reasonably priced.&lt;/p&gt;</description></item><item><title>The future of DDX - 2025 version</title><link>https://rfcorner.in/posts/ddx-future-2025/</link><pubDate>Sat, 04 Oct 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/ddx-future-2025/</guid><description>&lt;p&gt;Shipping hardware internationally is a hard, labor intensive, and overall a frustrating process - especially more so these days.&lt;/p&gt;
&lt;p&gt;Here is our plan to supply the DDX to customers:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Make the hardware files free / low-cost. The users will be able to order fully assembled boards from JLCPCB or other vendors on their own.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Required a small licensing fee for the software firmware part. This is how we get to keep the hobby self-sustaining!&lt;/p&gt;</description></item><item><title>Another cool SiC part for HF amplifiers</title><link>https://rfcorner.in/posts/another-cool-rf-part/</link><pubDate>Mon, 29 Sep 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/another-cool-rf-part/</guid><description>&lt;p&gt;I recently spotted the &lt;code&gt;Tokmas CI7N170SM&lt;/code&gt; TO-247 part on LCSC. It seems like a pretty neat part for building non-QRP HF amplifiers!&lt;/p&gt;
&lt;p&gt;This could be a better part for our &lt;a href="https://rfcorner.in/posts/baby-qro-switching-amplifier/"&gt;Baby QRO amplifier&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="datasheet-excerpts"&gt;Datasheet Excerpts&lt;/h2&gt;
&lt;p&gt;&lt;img alt="New hotness 1" loading="lazy" src="https://rfcorner.in/images/Tokmas-CI7N170SM-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="New hotness 2" loading="lazy" src="https://rfcorner.in/images/Tokmas-CI7N170SM-2.png"&gt;&lt;/p&gt;
&lt;p&gt;The full datasheet is available &lt;a href="https://rfcorner.in/pdfs/CI7N170SM.pdf"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="comparison"&gt;Comparison&lt;/h2&gt;
&lt;p&gt;In comparison, here is what a professional RF part (MRF300AN) looks like:&lt;/p&gt;
&lt;p&gt;&lt;img alt="MRF300 1" loading="lazy" src="https://rfcorner.in/images/MRF300-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="MRF300 2" loading="lazy" src="https://rfcorner.in/images/MRF300-2.png"&gt;&lt;/p&gt;
&lt;p&gt;That &lt;code&gt;272W&lt;/code&gt; maximum power dissipation figure is crazy good but switching characteristics are not that great (fast).&lt;/p&gt;</description></item><item><title>Debugging gaming pads on Linux</title><link>https://rfcorner.in/posts/debugging-controllers-linux/</link><pubDate>Mon, 29 Sep 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/debugging-controllers-linux/</guid><description>&lt;p&gt;While running &lt;a href="https://github.com/fhoedemakers/pico-infonesPlus"&gt;https://github.com/fhoedemakers/pico-infonesPlus&lt;/a&gt;, I found that my SNES gaming pad was not fully supported.&lt;/p&gt;
&lt;p&gt;Specifically, the UP/DOWN and LEFT/RIGHT keys were not working.&lt;/p&gt;
&lt;p&gt;Let's debug this a bit:&lt;/p&gt;
&lt;p&gt;Plug in the gaming pad on a Linux box and run the following command (&lt;code&gt;hidraw5&lt;/code&gt; will need to be changed as needed):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ lsusb
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Bus &lt;span class="m"&gt;001&lt;/span&gt; Device 063: ID 0810:e501 Personal Communication Systems, Inc. SNES Gamepad
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;$ sudo hexdump -C /dev/hidraw5
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;...
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00004a50 &lt;span class="m"&gt;01&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; 7f 7f 0f &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="m"&gt;01&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; 7f &lt;span class="m"&gt;00&lt;/span&gt; 0f &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;................&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00004a60 &lt;span class="m"&gt;01&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; 7f &lt;span class="m"&gt;00&lt;/span&gt; 0f &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="m"&gt;01&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; 7f &lt;span class="m"&gt;00&lt;/span&gt; 0f &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;................&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;00004a80 &lt;span class="m"&gt;01&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; 7f 7f 0f &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="m"&gt;01&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt; 7f 7f 0f &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="m"&gt;00&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;................&lt;span class="p"&gt;|&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is what I see when pressing the &lt;code&gt;UP&lt;/code&gt; key.&lt;/p&gt;</description></item><item><title>FT8 Decoding Challenges on Android</title><link>https://rfcorner.in/posts/ft8-decoding-challenges/</link><pubDate>Mon, 29 Sep 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/ft8-decoding-challenges/</guid><description>&lt;p&gt;Here is the &lt;a href="https://github.com/kgoba/ft8_lib/blob/master/test/wav/20m_busy/test_01.wav"&gt;FT8 WAV test file&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;On an AMD64 machine:&lt;/p&gt;
&lt;p&gt;&lt;img alt="MSHV PC" loading="lazy" src="https://rfcorner.in/images/MSHV-PC-1.png"&gt;&lt;/p&gt;
&lt;p&gt;1 second using the &lt;code&gt;fast decode&lt;/code&gt; settings.&lt;/p&gt;
&lt;p&gt;We were able to get the MSHV's FT8 engine to work on Android, thanks to the work done by &lt;a href="https://github.com/sannysanoff/SDRPlusPlusBrown"&gt;https://github.com/sannysanoff/SDRPlusPlusBrown&lt;/a&gt; folks.&lt;/p&gt;
&lt;p&gt;&lt;img alt="MSHV FT8 decoder on Android" loading="lazy" src="https://rfcorner.in/images/MSHV-Engine-Android-1.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Around ~4.5 seconds to decode the same file.&lt;/p&gt;
&lt;p&gt;This is why we can't really have full-blown realtime FT8 decoder(s) on Android just yet!&lt;/p&gt;
&lt;p&gt;Idea: But we can surely use this full-blown FT8 decoder in our &lt;code&gt;FT8 Decoder&lt;/code&gt; app which has no realtime requirements!&lt;/p&gt;</description></item><item><title>Success with 2m WSPR!</title><link>https://rfcorner.in/posts/wspr-success-on-2m/</link><pubDate>Thu, 25 Sep 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/wspr-success-on-2m/</guid><description>&lt;p&gt;OCXO's are awesome - this is what I learned while trying to get WSPR working reliably on the 2m band.&lt;/p&gt;
&lt;h2 id="hardware"&gt;Hardware&lt;/h2&gt;
&lt;p&gt;Here is all you need for reliable WSPR'ing on the 2m band:&lt;/p&gt;
&lt;p&gt;&lt;img alt="OCXO PCB Module 1" loading="lazy" src="https://rfcorner.in/images/OCXO-PCB-Module-1.png"&gt;&lt;/p&gt;
&lt;p&gt;A RAW OCXO "can" works fine too!&lt;/p&gt;
&lt;p&gt;&lt;img alt="Modded Si5351 board" loading="lazy" src="https://rfcorner.in/images/si5351-board-modified.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Note: This modded Si5351 board image comes from &lt;a href="https://www.simonsdialogs.com"&gt;SimonsDialogs&lt;/a&gt;. Essentially we are modding the CLK2 output port to become an input port which accepts the OCXO's output signal.&lt;/p&gt;</description></item><item><title>Black Box output characterization of CD2003 DCR receiver</title><link>https://rfcorner.in/posts/black-box-cd2003-characterization/</link><pubDate>Sun, 21 Sep 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/black-box-cd2003-characterization/</guid><description>&lt;p&gt;Circuit: DDX-Commercial-7&lt;/p&gt;
&lt;p&gt;Antenna: Small jumper cable attached&lt;/p&gt;
&lt;p&gt;&lt;img alt="DDX-Commercial-7" loading="lazy" src="https://rfcorner.in/images/DDX-Commercial-7.png"&gt;&lt;/p&gt;
&lt;h2 id="initial-results"&gt;Initial Results&lt;/h2&gt;
&lt;p&gt;10m: 36 dB on WSJT-X audio meter, on quiet and also with nearby beacon on !!!&lt;/p&gt;
&lt;p&gt;12m: 36 dB on audio meter, on quiet and also with nearby beacon on !!!&lt;/p&gt;
&lt;p&gt;15m: 46 dB on audio meter on quiet, 65 dB with nearby beacon on - OK&lt;/p&gt;
&lt;p&gt;20m: 44 dB on quiet, 65 dB with beacon on - OK&lt;/p&gt;
&lt;p&gt;40m: 40 dB on quiet, 60 dB with beacon on - OK&lt;/p&gt;</description></item><item><title>Running Vivado 2025.1 on Ubuntu 25.04 (plucky)</title><link>https://rfcorner.in/posts/vivado-on-plucky/</link><pubDate>Sun, 21 Sep 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/vivado-on-plucky/</guid><description>&lt;h3 id="notes-to-get-vivado-20251-running-on-ubuntu-2504-plucky-linux-distribution"&gt;Notes to get Vivado 2025.1 running on Ubuntu 25.04 (plucky) Linux distribution.&lt;/h3&gt;
&lt;p&gt;Original reference: &lt;a href="https://pavel-demin.github.io/qmtech-xc7z020-notes/led-blinker-77-76/"&gt;QMTech XC7Z020 Notes&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="setup"&gt;Setup&lt;/h2&gt;
&lt;p&gt;Install dependencies:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt-get --no-install-recommends install &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; bc binfmt-support bison build-essential ca-certificates curl &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; debootstrap device-tree-compiler dosfstools flex fontconfig git &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; libncurses-dev libssl-dev libtinfo6 parted qemu-user-static &lt;span class="se"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; squashfs-tools u-boot-tools x11-utils xvfb zerofree zip
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Hack deps a bit:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ln -s /lib/x86_64-linux-gnu/libtinfo.so.6 /lib/x86_64-linux-gnu/libtinfo.so.5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can now go ahead and run the Vivado installer.&lt;/p&gt;</description></item><item><title>Single Transistor LNA for HF</title><link>https://rfcorner.in/posts/single-transistor-lna-hf/</link><pubDate>Sun, 21 Sep 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/single-transistor-lna-hf/</guid><description>&lt;p&gt;Note: This HF LNA design is inspired by Charlie Morris ZL2CTM's prior work.&lt;/p&gt;
&lt;h2 id="design"&gt;Design&lt;/h2&gt;
&lt;p&gt;The idea that a single-transistor-preamp with 10 dB gain is more than enough for HF comes from Gajendra Kumar (VU2BGS). As a new "designer" I am often overwhelmed by the different possible design paths - so having guidance from an &lt;code&gt;elmer&lt;/code&gt; becomes crucial.&lt;/p&gt;
&lt;p&gt;&lt;img alt="HF LNA 1" loading="lazy" src="https://rfcorner.in/images/HF-LNA-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="HF LNA 2" loading="lazy" src="https://rfcorner.in/images/HF-LNA-2.png"&gt;&lt;/p&gt;
&lt;p&gt;It seems even MMBT2222A should work for building a HF LNA!&lt;/p&gt;</description></item><item><title>WSPR Decoding Challenges</title><link>https://rfcorner.in/posts/wspr-decoding-challenges/</link><pubDate>Sun, 21 Sep 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/wspr-decoding-challenges/</guid><description>&lt;p&gt;The &lt;a href="https://github.com/rxt1077/wspr_spread"&gt;wspr_spread&lt;/a&gt; work is pretty awesome.&lt;/p&gt;
&lt;h2 id="doppler-spread"&gt;Doppler Spread&lt;/h2&gt;
&lt;p&gt;It helped us debug why our TCXO-powered-WSPR beacon was pretty decent on 4m band but flaky on 2m.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Doppler spread&lt;/code&gt; value on 70 MHz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;... 70.0924994 VU3CER MK68 23 0 0.29 1 1 0 1 44 1 810 0.517
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now see the problem on 144 MHz:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;... 144.4905417 VU3CER MK68 23 -3 0.12 1 1 0 1 39 1 810 0.865
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img alt="WSPR Spread My" loading="lazy" src="https://rfcorner.in/images/VU3CER_region_of_interest.png"&gt;&lt;/p&gt;</description></item><item><title>WSPRing on higher bands</title><link>https://rfcorner.in/posts/wspring-on-higher-bands/</link><pubDate>Sat, 30 Aug 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/wspring-on-higher-bands/</guid><description>&lt;p&gt;Our WSPR beacon design works fine even on the 4m band (~70 MHz) . The key is to use a 25 MHz high-quality TCXO, like the 25 MHz HCI 0.5ppm TCXO!&lt;/p&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Demo 1" loading="lazy" src="https://rfcorner.in/images/WSPR-4m-HCI-25-TCXO.png"&gt;
&lt;img alt="Demo 2" loading="lazy" src="https://rfcorner.in/images/WSPR-4m-HCI-25-TCXO-2.png"&gt;&lt;/p&gt;
&lt;h2 id="challenges"&gt;Challenges&lt;/h2&gt;
&lt;p&gt;2m WSPR is still out of reach for now - see the following &lt;code&gt;sporadic&lt;/code&gt; decodes.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Drifty 1" loading="lazy" src="https://rfcorner.in/images/WSPR-2m-tough-August-2025.png"&gt;
&lt;img alt="Drifty 2" loading="lazy" src="https://rfcorner.in/images/WSPR-2m-tough-August-2025-2.png"&gt;&lt;/p&gt;
&lt;p&gt;Of course, the next challenge is to get 2m WSPR beacons working 100% reliably at a low cost.&lt;/p&gt;</description></item><item><title>Notes on coupled inductors</title><link>https://rfcorner.in/posts/notes-on-coupled-inductors/</link><pubDate>Sun, 17 Aug 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/notes-on-coupled-inductors/</guid><description>&lt;p&gt;The usage of ready-made coupled inductors in RF designs was pioneered by Jim Veatch in his award-winning RF amplifier designs.&lt;/p&gt;
&lt;h2 id="applications"&gt;Applications&lt;/h2&gt;
&lt;p&gt;For &lt;code&gt;Baby-QRO&lt;/code&gt; applications, we can use &lt;code&gt;Wurth 744851330&lt;/code&gt; coupled inductor. For 5W / 10W RF amplifier applications, we can use &lt;code&gt;Bourns SRF1260A-4R7Y&lt;/code&gt; coupled inductor.&lt;/p&gt;
&lt;p&gt;Recently we were able to utilize very cost-effective &lt;code&gt;YJYCOIN YPRH1207C-4R7M&lt;/code&gt; Chinese coupled inductor with excellent results.&lt;/p&gt;
&lt;p&gt;With our current &lt;code&gt;Digital Amplifier&lt;/code&gt; designs, this Chinese coupled inductor works even at ~75 MHz.&lt;/p&gt;</description></item><item><title>Initial success with cost-effective 6m WSPR + 2m FT8 beacons</title><link>https://rfcorner.in/posts/6m-wspr-beacon-success/</link><pubDate>Sat, 16 Aug 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/6m-wspr-beacon-success/</guid><description>&lt;p&gt;Our 6m WSPR beacon design works fine now. The key is to use a 25 MHz high-quality TCXO, like the 25 MHz HCI 0.5ppm TCXO!&lt;/p&gt;
&lt;p&gt;&lt;img alt="6m WSPR Demo 1" loading="lazy" src="https://rfcorner.in/images/6m-WSPR-Beacon-1.png"&gt;
&lt;img alt="6m WSPR Demo 2" loading="lazy" src="https://rfcorner.in/images/6m-WSPR-Beacon-2.png"&gt;
&lt;img alt="6m WSPR Demo 3" loading="lazy" src="https://rfcorner.in/images/6m-WSPR-Beacon-3.png"&gt;
&lt;img alt="6m WSPR Demo 4" loading="lazy" src="https://rfcorner.in/images/6m-WSPR-Beacon-4.png"&gt;
&lt;img alt="6m WSPR Demo 5" loading="lazy" src="https://rfcorner.in/images/6m-WSPR-Beacon-5.png"&gt;&lt;/p&gt;
&lt;p&gt;2m WSPR is still out of reach for this VFO design - see the following &lt;code&gt;drifty&lt;/code&gt; screenshots:&lt;/p&gt;
&lt;p&gt;&lt;img alt="2m Drift 1" loading="lazy" src="https://rfcorner.in/images/2m-drift-1.png"&gt;
&lt;img alt="2m Drift 2" loading="lazy" src="https://rfcorner.in/images/2m-drift-2.png"&gt;
&lt;img alt="2m Drift 3" loading="lazy" src="https://rfcorner.in/images/2m-drift-3.png"&gt;&lt;/p&gt;
&lt;p&gt;While WSPR is no good, 2m FT8 works pretty fine!&lt;/p&gt;</description></item><item><title>Checking Zoom latency externally</title><link>https://rfcorner.in/posts/checking-zoom-latency-externally/</link><pubDate>Fri, 08 Aug 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/checking-zoom-latency-externally/</guid><description>&lt;p&gt;Here is a handy script that I often use to check the quality of the Zoom connection. It measures &lt;code&gt;TCP latency&lt;/code&gt; instead of the usual ICMP stuff (which is often blocked).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="ch"&gt;#!/usr/bin/env python3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;TCP Ping Test (defaults to port 80, 10000 packets)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;Usage: ./tcpping.py host [port] [maxCount]
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;- Ctrl-C Exits with Results
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;pip3 install matplotlib numpy
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;python3 ./tcp_ping_grapher.py 115.114.56.202 443 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;python3 ./tcp_ping_grapher.py teams.microsoft.com 443 100
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;socket&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;signal&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;timeit&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;default_timer&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# https://matplotlib.org/examples/animation/animate_decay.html&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;numpy&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;np&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.pyplot&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;plt&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;matplotlib.animation&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;animation&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Default to 10000 connections max&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;maxCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;## Inputs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Required Host&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;host&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# host = &amp;#34;115.114.56.202&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Usage: tcpping.py host [port] [maxCount]&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Optional Port&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# port = 443&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Error: Port Must be Integer:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Optional maxCount&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;maxCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Error: Max Count Value Must be Integer&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;argv&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;IndexError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;pass&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Pass/Fail counters&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;passed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;getResults&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34; Summarize Results &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lRate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lRate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;lRate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;lRate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;TCP Ping Results: Connections (Total/Pass/Fail): [&lt;/span&gt;&lt;span class="si"&gt;{:}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{:}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="si"&gt;{:}&lt;/span&gt;&lt;span class="s2"&gt;] (Failed: &lt;/span&gt;&lt;span class="si"&gt;{:}&lt;/span&gt;&lt;span class="s2"&gt;%)&amp;#34;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;format&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;passed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lRate&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;signal_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;&amp;#34;&amp;#34; Catch Ctrl-C and Exit &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;getResults&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;sys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Register SIGINT Handler&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;signal&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SIGINT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;signal_handler&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;work&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;passed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;maxCount&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;3200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Loop while less than max count or until Ctrl-C caught&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;maxCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Increment Counter&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# New Socket&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AF_INET&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SOCK_STREAM&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# 1sec Timeout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;settimeout&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Start a timer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s_start&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Try to Connect&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;shutdown&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SHUT_RD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;success&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Connection Timed Out&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Connection timed out!&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;OSError&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;OS Error:&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;failed&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Stop Timer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s_stop&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;s_runtime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s_stop&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;s_start&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;success&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Connected to &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;[&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;]: tcp_seq=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; time=&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; ms&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;host&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;s_runtime&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;passed&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# Sleep for 1sec&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;maxCount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# time.sleep(0.5)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# time.sleep(1)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s_runtime&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Output Results if maxCount reached&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# getResults()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;data_gen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cnt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;cnt&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;cnt&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mf"&gt;0.1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;yield&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;np&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;10.&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;init&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_ylim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;128&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;ydata&lt;/span&gt;&lt;span class="p"&gt;[:]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ydata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;subplots&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;plot&lt;/span&gt;&lt;span class="p"&gt;([],&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="n"&gt;lw&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;grid&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ydata&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[],&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;# update the data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ydata&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;xmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;xmax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_xlim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;xmax&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_xlim&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xmin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;xmax&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ax&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;figure&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;canvas&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;xdata&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ydata&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;ani&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;animation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FuncAnimation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fig&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;work&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;blit&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;interval&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;repeat&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;init_func&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;plt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Usage:&lt;/p&gt;</description></item><item><title>WiFi VFO, beacon and signal generator</title><link>https://rfcorner.in/posts/wifi-vfo/</link><pubDate>Sat, 05 Jul 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/wifi-vfo/</guid><description>&lt;p&gt;We make heavy use of &lt;a href="https://github.com/kholia/Easy-Digital-Beacons-v1"&gt;Easy-Digital-Beacons-v1&lt;/a&gt; for testing RF amplifiers.&lt;/p&gt;
&lt;p&gt;This single board is a versatile WiFi VFO and FT8 / FT4 / WSPR beacon.&lt;/p&gt;
&lt;p&gt;&lt;img alt="WiFi VFO 1" loading="lazy" src="https://rfcorner.in/images/WiFi-VFO-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="WiFi VFO 2" loading="lazy" src="https://rfcorner.in/images/10mW-Beacon.png"&gt;&lt;/p&gt;
&lt;p&gt;You can also use our &lt;a href="https://github.com/kholia/HF-PA-v10/tree/master/CW-SigGen"&gt;CW-SigGen&lt;/a&gt; project to generate a suitable test signal.&lt;/p&gt;</description></item><item><title>New RF parts and new promises - part 2</title><link>https://rfcorner.in/posts/new-rf-parts-new-potential-2/</link><pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/new-rf-parts-new-potential-2/</guid><description>&lt;p&gt;&lt;code&gt;Tokmas CID9N65E3&lt;/code&gt; rocks!&lt;/p&gt;
&lt;h2 id="performance"&gt;Performance&lt;/h2&gt;
&lt;p&gt;It is CRAZY how efficient this GaN FET is in TO-252 (DPAK) package. It generates 5W @ 28 MHz with 13.8V at drain without even warming up! Close to 4W @ 50 MHz with 12.0V at drain. 5W+ @ 50 MHz with 13.8V at drain. 11W+ @ 50 MHz with 20V at drain.&lt;/p&gt;
&lt;p&gt;It even produces ~3W at 70 MHz with 13V at drain - w00t!&lt;/p&gt;</description></item><item><title>The poor quality, reliability and longevity of MOONDROP products</title><link>https://rfcorner.in/posts/poor-reliability-moondrop/</link><pubDate>Sun, 15 Jun 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/poor-reliability-moondrop/</guid><description>&lt;p&gt;I had bought two pairs of MOONDROP Aria 2 IEMs after auditioning them at a Headphone Connect event.&lt;/p&gt;
&lt;p&gt;After a few months of usage, one of the Aria 2 earphones lost audio in the left earpiece. We got it 'serviced' under warranty from &lt;a href="https://www.headphonezone.in"&gt;Headphone Zone&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After a year of almost no usage, the other pair of Aria 2 IEMs lost audio in one of the earpieces too!&lt;/p&gt;
&lt;p&gt;I have never seen this poor quality, reliability and longevity before!&lt;/p&gt;</description></item><item><title>Fast(est) gate drivers in the West</title><link>https://rfcorner.in/posts/fastest-gate-drivers/</link><pubDate>Tue, 03 Jun 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/fastest-gate-drivers/</guid><description>&lt;p&gt;I recently found some FET gate drivers which are quite fast!&lt;/p&gt;
&lt;h2 id="the-drivers"&gt;The Drivers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.lcsc.com/product-detail/GaN-Transistors-GaN-HEMT_Wuxi-Maxinmicro-MX1025D_C5341121.html"&gt;Wuxi Maxinmicro MX1025D&lt;/a&gt; - Favorite!&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;BD2311NVX-LBE2 from ROHM Semiconductor&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.ti.com/lit/ds/symlink/lmg1020.pdf"&gt;TI LMG1020&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://www.lcsc.com/product-detail/C6423790.html"&gt;Tokmas LMG1020YFFR&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usage"&gt;Usage&lt;/h2&gt;
&lt;p&gt;They are perfect for driving the fast Tokmas GaN FETs that we recently discussed on this site.&lt;/p&gt;
&lt;p&gt;Our 'workhorse' gate driver for the recent experiments has been the Onsemi's NCP81074ADR2G in a friendly SOIC-8 package.&lt;/p&gt;
&lt;p&gt;And we have shifted to &lt;code&gt;MX1025D&lt;/code&gt; gate driver in our latest amplifier designs.&lt;/p&gt;</description></item><item><title>Debugging / reversing Firebase gRPC traffic with mitmproxy</title><link>https://rfcorner.in/posts/debugging-grpc-traffic-with-mitmproxy/</link><pubDate>Wed, 16 Apr 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/debugging-grpc-traffic-with-mitmproxy/</guid><description>&lt;p&gt;Recently, I was stuck in figuring out how the Firebase gRPC calls worked and how I could generate, modify, and replay them. Trapping and modifying the existing gRPC traffic was not working too well. Finally, I took a step back and spent some time on learning how to build and debug simple Firebase applications. This approach helped me tremendously and I was able to make further progress with my original task in almost no time.&lt;/p&gt;</description></item><item><title>Ideas for a 2m (144 MHz) WSPR / FT8 beacon</title><link>https://rfcorner.in/posts/2m-wspr-beacon-ideas/</link><pubDate>Tue, 15 Apr 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/2m-wspr-beacon-ideas/</guid><description>&lt;p&gt;I am posting an early design sketch of a 2m WSPR beacon.&lt;/p&gt;
&lt;h2 id="key-points"&gt;Key Points&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;25 MHz HCI 0.5ppm TCXO powering the Si5351 module instead of the 26 MHz TCXO.
If this fails, we can use a 10 MHz OCXO instead (a bit out of spec but works fine).&lt;/li&gt;
&lt;li&gt;Tokmas CID10N65F GaN FET might work @ 144 MHz as the 'final'. If not, use Mitsubishi RD15HVF1-501 MOSFET as backup.&lt;/li&gt;
&lt;li&gt;2SK3475 as the driver with variable DC bias at the gate&lt;/li&gt;
&lt;li&gt;The whole VCC to this amplifier will be PTT switched&lt;/li&gt;
&lt;li&gt;Ideally, we would want to keep the driver stage linear but the final stage as switched (Class C/D)
Alternate: Perhaps by DC coupling the Si5351 input to 2SK3475, we can avoid the need for DC gate bias&lt;/li&gt;
&lt;li&gt;The "RFC" (bifilar coil still needed?) part will need to be figured out for VHF!&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="status"&gt;Status&lt;/h2&gt;
&lt;p&gt;Results: To be built and tested soon!&lt;/p&gt;</description></item><item><title>Easily verifying certificate chains</title><link>https://rfcorner.in/posts/verifying-certificate-chain/</link><pubDate>Mon, 14 Apr 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/verifying-certificate-chain/</guid><description>&lt;p&gt;Here is a quick script to verify that the certificate chain is valid and will work.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;% cat verify-cert-key.sh
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#!/usr/bin/env bash&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;certFile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;keyFile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;2&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;caFile&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;certPubKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;openssl x509 -noout -pubkey -in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;certFile&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nv"&gt;keyPubKey&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;openssl pkey -pubout -in &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;keyFile&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;certPubKey&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;keyPubKey&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="o"&gt;]]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;then&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PASS: key and cert match&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;else&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;FAIL: key and cert DO NOT match&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;fi&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;openssl verify -CAfile &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;3&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Reimagining the 'Tangara' music player - Part 2</title><link>https://rfcorner.in/posts/rethinking-tangara-music-player-part-2/</link><pubDate>Fri, 11 Apr 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/rethinking-tangara-music-player-part-2/</guid><description>&lt;p&gt;&lt;a href="https://www.crowdsupply.com/cool-tech-zone/tangara"&gt;Tangara&lt;/a&gt; is a pretty awesome project!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://rfcorner.in/posts/rethinking-tangara-music-player/"&gt;It recently inspired us&lt;/a&gt; to build a similar FOSS DAP product but at a much lower cost of &amp;lt;= 40 USD. Our initial tech stack: RP2350-Zero, PCM5102A 32-bit 384kHz DAC, Burr-Brown OPA1662 (specified for 3.3v) as the unity gain buffer and headphone driver, no explicit DC-DC converters anywhere, microSD card, everything will be a module if possible&lt;/p&gt;
&lt;p&gt;We quickly got this prototype working on a breadboard and discovered some limitations:&lt;/p&gt;</description></item><item><title>Ideas for a 6m WSPR beacon</title><link>https://rfcorner.in/posts/6m-wspr-beacon-idea/</link><pubDate>Thu, 10 Apr 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/6m-wspr-beacon-idea/</guid><description>&lt;p&gt;I am posting an early design sketch of a 6m WSPR beacon.&lt;/p&gt;
&lt;h2 id="key-points"&gt;Key Points&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;25 MHz HCI 0.5ppm TCXO powering the Si5351 module instead of the 26 MHz TCXO.
If this fails, we can use a 10 MHz OCXO instead (a bit out of spec but works fine).&lt;/li&gt;
&lt;li&gt;Tokmas CID10N65F GaN FET should work @ 50 MHz&lt;/li&gt;
&lt;li&gt;TI UCC27614 or Onsemi NCP81074 gate driver&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="status"&gt;Status&lt;/h2&gt;
&lt;p&gt;Results: To be built and tested soon!&lt;/p&gt;</description></item><item><title>My WSPR beacon results - April 2025</title><link>https://rfcorner.in/posts/my-wspr-beacon-results/</link><pubDate>Thu, 10 Apr 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/my-wspr-beacon-results/</guid><description>&lt;p&gt;This ~1W to ~5W WSPR beacon runs continuously on the 10m band. It handles extreme environmental temperatures pretty well (it is 42°C plus here).&lt;/p&gt;
&lt;p&gt;Our article on this beacon's design and operation will appear in the May/June 2025 issue of the &lt;a href="https://www.arrl.org/qex"&gt;QEX&lt;/a&gt; magazine soon.&lt;/p&gt;
&lt;p&gt;&lt;img alt="WSPR Beacon Results" loading="lazy" src="https://rfcorner.in/images/Beacon-Results.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="WSPR Beacon Results 2" loading="lazy" src="https://rfcorner.in/images/10m-WSPR-Results.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="WSPR Beacon Results 3" loading="lazy" src="https://rfcorner.in/images/10m-WSPR-Results-2.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="WSPR Beacon Results 4" loading="lazy" src="https://rfcorner.in/images/WSPR-Results-2025-1.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="WSPR Beacon Results 5" loading="lazy" src="https://rfcorner.in/images/WSPR-Results-2025-2.png"&gt;&lt;/p&gt;
&lt;h2 id="references"&gt;References&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="http://www.carnut.info/WSPR_Tx/WSPR_Tx.htm"&gt;WSPR TX by G0UPL&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;a href="https://rfcorner.in/pdfs/QEX-May-June-2025-TOC.pdf"&gt;QEX May-June 2025 TOC&lt;/a&gt;&lt;/p&gt;</description></item><item><title>New RF parts and new promises</title><link>https://rfcorner.in/posts/new-rf-parts-new-potential/</link><pubDate>Thu, 20 Mar 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/new-rf-parts-new-potential/</guid><description>&lt;p&gt;Ismo (OH2FTG) recently introduced me to a bunch of Tokmas RF parts. Out of these, the &lt;code&gt;Tokmas CID10N65F GaN FET&lt;/code&gt; stood out. It seems to have a lot of potential (for HF + 6m) at a very low price point.&lt;/p&gt;
&lt;p&gt;This RF MOSFET part can be purchased from LCSC.&lt;/p&gt;
&lt;p&gt;It seems &lt;code&gt;Tokmas CID10N65F&lt;/code&gt; has the potential to completely replace the &lt;code&gt;RD16HHF1&lt;/code&gt; part from Mitsubishi Electric!&lt;/p&gt;
&lt;h2 id="datasheet"&gt;Datasheet&lt;/h2&gt;
&lt;p&gt;Datasheet excerpt:&lt;/p&gt;
&lt;p&gt;&lt;img alt="New hotness" loading="lazy" src="https://rfcorner.in/images/Tokmas-CID10N65F-1.png"&gt;&lt;/p&gt;</description></item><item><title>1W WSPR beacon @ 5V (2025)</title><link>https://rfcorner.in/posts/1w-5v-wspr-beacon/</link><pubDate>Fri, 14 Mar 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/1w-5v-wspr-beacon/</guid><description>&lt;p&gt;I have designed, built and tested an all-HF WSPR beacon which produces 1W @ 5V and is rugged and cost-effective.&lt;/p&gt;
&lt;p&gt;&lt;img alt="1W WSPR Beacon Board" loading="lazy" src="https://rfcorner.in/images/1W-5V-Beacon.png"&gt;&lt;/p&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;Power consumption: Around 420mA @ 5V.&lt;/p&gt;
&lt;h2 id="cost"&gt;Cost&lt;/h2&gt;
&lt;p&gt;Cost: Around 500 INR.&lt;/p&gt;
&lt;h2 id="time-to-build"&gt;Time to build&lt;/h2&gt;
&lt;p&gt;Time to build: Less than 30 minutes.&lt;/p&gt;
&lt;h2 id="files"&gt;Files&lt;/h2&gt;
&lt;p&gt;The files for this project are &lt;a href="https://github.com/kholia/HF-PA-v10"&gt;published here&lt;/a&gt; for personal (non-commercial) usage.&lt;/p&gt;
&lt;p&gt;For a 5W (QRO) WSPR beacon, please hold on for our upcoming QEX magazine article ;)&lt;/p&gt;</description></item><item><title>Testing small power supplies</title><link>https://rfcorner.in/posts/testing-small-power-supplies/</link><pubDate>Tue, 18 Feb 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/testing-small-power-supplies/</guid><description>&lt;p&gt;I found this &lt;code&gt;60W Electronic Load&lt;/code&gt; to be quite useful for testing small power adapters and supplies.&lt;/p&gt;
&lt;p&gt;&lt;img alt="Small Electronic Load" loading="lazy" src="https://rfcorner.in/images/Electronic-Load-Small.jpg"&gt;&lt;/p&gt;
&lt;p&gt;While it is &lt;a href="https://github.com/kholia/Adjustable-Load-v1.1"&gt;possible to homebrew an adjustable electronic load&lt;/a&gt; we recommend getting this electronic load module or a &lt;a href="https://www.toolworld.in/product.php?pid=12296"&gt;better-but-costlier one&lt;/a&gt; like the UNI-T UTL8212+ electronic load.&lt;/p&gt;
&lt;h2 id="observations"&gt;Observations&lt;/h2&gt;
&lt;p&gt;You can stress-test power supplies using this electronic load quite easily and conveniently.&lt;/p&gt;
&lt;p&gt;It turns out that the &lt;code&gt;Orange&lt;/code&gt; branded 12V 2A or 3A adapters from Robu are of really poor quality. The output voltage drops to less than 2V when the load current is increased to around 1A. This is NOT the first time that the &lt;code&gt;Orange&lt;/code&gt; branded stuff has turned out to be of poor quality. In the end, you get what you pay for.&lt;/p&gt;</description></item><item><title>Reimagining the 'Tangara' music player</title><link>https://rfcorner.in/posts/rethinking-tangara-music-player/</link><pubDate>Sat, 15 Feb 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/rethinking-tangara-music-player/</guid><description>&lt;p&gt;&lt;a href="https://www.crowdsupply.com/cool-tech-zone/tangara"&gt;Tangara&lt;/a&gt; is a pretty awesome project - no doubts about it. I found &lt;a href="https://halestrom.net/darksleep/blog/053_tangara/"&gt;this review of Tangara's design&lt;/a&gt; pretty interesting and educational.&lt;/p&gt;
&lt;p&gt;It has inspired us to build a similar FOSS DAP product but at a much lower cost of 40 USD (that being the launch price of Sansa Clip in year 2007). The idea is to deliver '90% of the value' of Tangara in a slightly smaller (but fatter) and more cost-effective package.&lt;/p&gt;</description></item><item><title>100mW WSPR beacon (2025)</title><link>https://rfcorner.in/posts/100mw-wspr-beacon/</link><pubDate>Fri, 14 Feb 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/100mw-wspr-beacon/</guid><description>&lt;p&gt;I have built probably the easiest, reasonably rugged and most cost-effective 100mW WSPR (or FT8) beacon.&lt;/p&gt;
&lt;p&gt;&lt;img alt="100mW WSPR Beacon" loading="lazy" src="https://rfcorner.in/images/Pico-100mW-Direct-RF.png"&gt;&lt;/p&gt;
&lt;h2 id="the-build"&gt;The Build&lt;/h2&gt;
&lt;p&gt;Here is my quick and dirty build with whatever I had lying around:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Quick-N-Dirty Build" loading="lazy" src="https://rfcorner.in/images/Quick-Dirty-100mW.jpg"&gt;&lt;/p&gt;
&lt;p&gt;We have replaced the traditional expensive Mini-Circuits transformer with a cost-effective Bourns coupled inductor.&lt;/p&gt;
&lt;h2 id="analysis"&gt;Analysis&lt;/h2&gt;
&lt;p&gt;Power consumption: Before RF generation starts ➔ 20mA @ 5v. After RF generation starts ➔ 52mA @ 5v. So the power input consumed in the RF generation process is more than 150mW it seems (which is good).&lt;/p&gt;</description></item><item><title>Easy WSPR Encoder</title><link>https://rfcorner.in/posts/wspr-web-encoder/</link><pubDate>Fri, 14 Feb 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/wspr-web-encoder/</guid><description>&lt;p&gt;The &lt;code&gt;Easy WSPR Encoder&lt;/code&gt; can be accessed &lt;a href="https://rfcorner.in/wspr_encoder.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Update: You may find &lt;a href="https://swharden.com/software/wspr-code-generator/"&gt;this software&lt;/a&gt; more useful.&lt;/p&gt;</description></item><item><title>Budget RF Lab for HF</title><link>https://rfcorner.in/posts/budget-rf-hf-lab/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/budget-rf-hf-lab/</guid><description>&lt;p&gt;Bharath and I have written our thoughts on building an RF lab on a budget. It is geared towards homebrewers and new amateur radio operators.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/kholia/Budget-RF-Lab/blob/master/README.md"&gt;Budget RF Lab Documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Have fun! :-)&lt;/p&gt;</description></item><item><title>Easy FT8 Encoder</title><link>https://rfcorner.in/posts/ft8-web-encoder/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/ft8-web-encoder/</guid><description>&lt;p&gt;The &lt;code&gt;Easy FT8 Encoder&lt;/code&gt; can be accessed &lt;a href="https://rfcorner.in/ft8_encoder.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In the near future, we want to add the K1JT's original FT8 encoder functionality as well.&lt;/p&gt;
&lt;p&gt;Update: &lt;a href="https://pengowray.github.io/ft8play/"&gt;FT8Play&lt;/a&gt; is crazy good!&lt;/p&gt;</description></item><item><title>RSP1 Clone SDR Notes (2025)</title><link>https://rfcorner.in/posts/rsp1-clone-notes/</link><pubDate>Thu, 13 Feb 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/rsp1-clone-notes/</guid><description>&lt;p&gt;Notes to get RSP1 working on Linux and macOS using FOSS drivers (2025)&lt;/p&gt;
&lt;p&gt;&lt;img alt="Reference photo" loading="lazy" src="https://rfcorner.in/images/RSP1-Clone-SDR.jpg"&gt;&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Please use a mainstream Linux distribution like Ubuntu 24.04 LTS (or later) or
the latest Raspberry Pi OS.&lt;/p&gt;
&lt;p&gt;Using a Raspberry Pi is NOT recommended as it has quite a bit of power supply
noise on the USB ports, which reduces the performance of the connected SDR.&lt;/p&gt;
&lt;h2 id="linux-setup"&gt;Linux Setup&lt;/h2&gt;
&lt;p&gt;On Linux, add the following lines to the &lt;code&gt;/etc/modprobe.d/blacklist.conf&lt;/code&gt; file&lt;/p&gt;</description></item><item><title>Easy reproducible TX-BPF filters</title><link>https://rfcorner.in/posts/easy-tx-bpfs/</link><pubDate>Mon, 10 Feb 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/easy-tx-bpfs/</guid><description>&lt;p&gt;Some weeks back, we published our designs for building reproducible TX-BPF filters easily.&lt;/p&gt;
&lt;h2 id="designs"&gt;Designs&lt;/h2&gt;
&lt;p&gt;10m TX-BPF:&lt;/p&gt;
&lt;p&gt;&lt;img alt="TX-BPF render" loading="lazy" src="https://rfcorner.in/images/TX-BPF-Render.png"&gt;&lt;/p&gt;
&lt;p&gt;Results of the &lt;code&gt;Dhiru's Manhattan&lt;/code&gt; build:&lt;/p&gt;
&lt;p&gt;&lt;img alt="TX-BPF Manhattan build results" loading="lazy" src="https://rfcorner.in/images/TX-BPF-Demo.jpg"&gt;&lt;/p&gt;
&lt;p&gt;Results of the PCB build:&lt;/p&gt;
&lt;p&gt;&lt;img alt="TX-BPF results" loading="lazy" src="https://rfcorner.in/images/PCB-Build-28.png"&gt;&lt;/p&gt;
&lt;p&gt;&lt;img alt="TX-BPF PCB build results" loading="lazy" src="https://rfcorner.in/images/TX-BPF-PCB-Demo.jpg"&gt;&lt;/p&gt;
&lt;h2 id="why-use-bpfs"&gt;Why use BPFs?&lt;/h2&gt;
&lt;p&gt;While many amateur radio operators focus &lt;em&gt;solely&lt;/em&gt; on antenna optimization, the significant benefits of TX-BPF filters are often overlooked or under-discussed in the hobby! Even with HOA antenna restrictions, you can still optimize your station's performance through proper TX-BPF filtering.&lt;/p&gt;</description></item><item><title>250mW WSPR beacon (2025)</title><link>https://rfcorner.in/posts/250mw-wspr-beacon/</link><pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/250mw-wspr-beacon/</guid><description>&lt;p&gt;I am building an easy-to-use and cost-effective WSPR pHAT for Raspberry Pi Zero 2 W.&lt;/p&gt;
&lt;h2 id="design"&gt;Design&lt;/h2&gt;
&lt;p&gt;3D render:&lt;/p&gt;
&lt;p&gt;&lt;img alt="250mW WSPR Beacon Render" loading="lazy" src="https://rfcorner.in/images/WSPR-Beacon-250mW.png"&gt;&lt;/p&gt;
&lt;p&gt;We have replaced the traditional expensive Mini-Circuits transformer with a cost-effective Bourns coupled inductor.&lt;/p&gt;
&lt;h2 id="status"&gt;Status&lt;/h2&gt;
&lt;p&gt;Results: To be built and tested soon!&lt;/p&gt;
&lt;p&gt;Time to build: Less than 20 minutes&lt;/p&gt;</description></item><item><title>Ubuntu Going Downhill</title><link>https://rfcorner.in/posts/ubuntu-going-downhill/</link><pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/ubuntu-going-downhill/</guid><description>&lt;p&gt;I am a bit late to realize that Ubuntu is going downhill and has been for a while.&lt;/p&gt;
&lt;h2 id="why"&gt;Why?&lt;/h2&gt;
&lt;p&gt;Here are a couple of things I have noticed about Canonical/Ubuntu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Forced paid updates even for &lt;code&gt;active life&lt;/code&gt; OS versions&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Series of bad decisions (Mir, Unity, Upstart, Snaps) causing pain all around&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Inflicting slow and buggy &lt;code&gt;snap&lt;/code&gt; applications on their users. Not listening to feedback from users - Firefox Snap is really slow to launch, especially on older computers.&lt;/p&gt;</description></item><item><title>My PA0FRI Active Antenna</title><link>https://rfcorner.in/posts/active-antenna-pa0fri-results/</link><pubDate>Sat, 08 Feb 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/active-antenna-pa0fri-results/</guid><description>&lt;p&gt;My homebrewed PA0FRI Active Antenna is working well from a very physically constrained location.&lt;/p&gt;
&lt;h2 id="design"&gt;Design&lt;/h2&gt;
&lt;p&gt;3D render:&lt;/p&gt;
&lt;p&gt;&lt;img alt="PA0FRI Active Antenna Render" loading="lazy" src="https://rfcorner.in/images/PA0FRI-Active-Antenna-Render.png"&gt;&lt;/p&gt;
&lt;p&gt;Schematic:&lt;/p&gt;
&lt;p&gt;&lt;img alt="PA0FRI Active Antenna Schematic" loading="lazy" src="https://rfcorner.in/images/PA0FRI-Active-Antenna-Schematic.png"&gt;&lt;/p&gt;
&lt;h2 id="results"&gt;Results&lt;/h2&gt;
&lt;p&gt;&lt;img alt="PA0FRI Active Antenna Results" loading="lazy" src="https://rfcorner.in/images/FT8-Reception-Results-4.png"&gt;&lt;/p&gt;
&lt;p&gt;The antenna is connected to a RSP1 Clone SDR which is running custom FT8-band-hopping software. I am using a &lt;code&gt;SOLID 4-Way 5-2400 MHz RF splitter&lt;/code&gt; to connect multiple SDRs to the same active antenna. NB: Plug in 75-ohms dummy loads (terminators) on the unused ports of the RF splitter - MX-282 / MX-280 75-ohms dummy loads work fine.&lt;/p&gt;</description></item><item><title>Baby-QRO RF switching amplifier</title><link>https://rfcorner.in/posts/baby-qro-switching-amplifier/</link><pubDate>Fri, 31 Jan 2025 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/baby-qro-switching-amplifier/</guid><description>&lt;p&gt;Sometimes we all need a bit of QRO - Life's too short for QRP sometimes. So we give you the Baby-QRO switching amplifier!&lt;/p&gt;
&lt;p&gt;This Baby-QRO switching RF amplifier design is inspired by the wonderful &lt;a href="https://sites.google.com/site/rfpowertools/rf-power-tools"&gt;Single NXP MRF-101 Eval Board&lt;/a&gt; project by Jim Veatch. Thank you Jim!&lt;/p&gt;
&lt;p&gt;Instead of using the expensive MRF101 MOSFET, we use fast SiC MOSFET(s) from Wolfspeed / SUPSiC.&lt;/p&gt;
&lt;h2 id="design"&gt;Design&lt;/h2&gt;
&lt;p&gt;3D render:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Baby-QRO amplifier render" loading="lazy" src="https://rfcorner.in/images/Baby-QRO-Amplifier.png"&gt;&lt;/p&gt;
&lt;p&gt;Actual picture:&lt;/p&gt;
&lt;p&gt;&lt;img alt="Baby-QRO amplifier picture" loading="lazy" src="https://rfcorner.in/images/Baby-QRO-Build.jpg"&gt;&lt;/p&gt;</description></item><item><title>Easy Taint Tracking - Finding Heartbleed in 2024</title><link>https://rfcorner.in/posts/taintanalysis/</link><pubDate>Fri, 01 Nov 2024 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/taintanalysis/</guid><description>&lt;h2 id="aim"&gt;Aim&lt;/h2&gt;
&lt;p&gt;Finding 'Heartbleed' class of bugs with taint analysis.&lt;/p&gt;
&lt;p&gt;Background reading: &lt;a href="https://heartbleed.com/"&gt;https://heartbleed.com/&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="motivation"&gt;Motivation&lt;/h2&gt;
&lt;p&gt;While &lt;code&gt;Coverity&lt;/code&gt; is now able to detect this bug, we wanted to evaluate the
state of open-source security tooling in 2024.&lt;/p&gt;
&lt;p&gt;Have we been able to reduce the cost of finding such bugs after all these
years?&lt;/p&gt;
&lt;h2 id="the-idea"&gt;The Idea&lt;/h2&gt;
&lt;p&gt;Can we find an &lt;code&gt;execution path&lt;/code&gt; from the tainted data in the &lt;code&gt;n2s&lt;/code&gt; function to
sensitive functions?&lt;/p&gt;
&lt;p&gt;Since &lt;code&gt;n2s&lt;/code&gt; typically operates on network received bytes, it can serve as a
taint source.&lt;/p&gt;</description></item><item><title>My solar powered website</title><link>https://rfcorner.in/posts/my-solar-powered-notebook/</link><pubDate>Fri, 01 Jan 1999 00:00:00 +0000</pubDate><guid>https://rfcorner.in/posts/my-solar-powered-notebook/</guid><description>&lt;p&gt;This notebook (aka 'blog') is powered by free solar energy!&lt;/p&gt;
&lt;p&gt;I was (and am) inspired to start writing again by reading &lt;a href="https://solar.lowtechmagazine.com/power/"&gt;this excellent article by 'LOW←TECH MAGAZINE'&lt;/a&gt;. Imitation is the sincerest form of flattery&amp;hellip;&lt;/p&gt;
&lt;h2 id="tech-stack"&gt;Tech Stack&lt;/h2&gt;
&lt;p&gt;Tech stack: Navitas 100W Solar Panel, Exide solar charge controller (10A), Exide Solar Blitz 40AH battery, 200W 20A DC-DC CC CV Buck module (Robu), Cuzor Mini Pro RouterUPS (12V), LM2596S DC-DC 24V/12V to 5V 5A Step Down USB module, Raspberry Pi Zero 2W&lt;/p&gt;</description></item></channel></rss>