<?xml version="1.0" encoding="UTF-8"?>        <rss version="2.0"
             xmlns:atom="http://www.w3.org/2005/Atom"
             xmlns:dc="http://purl.org/dc/elements/1.1/"
             xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
             xmlns:admin="http://webns.net/mvcb/"
             xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
             xmlns:content="http://purl.org/rss/1.0/modules/content/">
        <channel>
            <title>
									Geometrics Forum - Recent Topics				            </title>
            <link>https://www.geometrics.com/community/</link>
            <description>Geometrics Discussion Board</description>
            <language>en-US</language>
            <lastBuildDate>Mon, 13 Jul 2026 06:33:28 +0000</lastBuildDate>
            <generator>wpForo</generator>
            <ttl>60</ttl>
							                    <item>
                        <title>How to use SeisImager 2D seismic profiles to be used in real world models</title>
                        <link>https://www.geometrics.com/community/seisimager-software/how-to-use-seisimager-2d-seismic-profiles-to-be-used-in-real-world-models/</link>
                        <pubDate>Tue, 07 Jul 2026 21:32:24 +0000</pubDate>
                        <description><![CDATA[Q. We are now often being asked to provide our 2D seismic profiles to be used in real world models. When the inversion is done it has distance along line and depth/elevation as the output. I...]]></description>
                        <content:encoded><![CDATA[<p>Q. We are now often being asked to provide our 2D seismic profiles to be used in real world models. When the inversion is done it has distance along line and depth/elevation as the output. Is there a way to add real world Northing/Easting coordinates into the data file so it can be more simply reference to the real world location the data was collected?<br /><br />A. Thank you very much for using SeisImager.<br />So you want to add coordinate to 2D Vp or Vs cross sections.<br />You can use GeoPlot to add the coordinates either lat-lon or UTM.<br />GeoPlot can import cross sections from PlotRefa (.vs) and WaveEq (.pvs).<br />Use "Edit", "XY coordinates (latitude-longitude)" to add the coordinates.<br />See GeoPlot manual for more details.<br /><br />https://seisimager.com/download/Geoplot_Manual_v2.0_ENGLISH.pdf <br /><br />If you have several cross-sections, you may use GeoPlot3D to interpolate 2D cross sections to a 3D volume.</p>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/"></category>                        <dc:creator>Randl Rivera</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/seisimager-software/how-to-use-seisimager-2d-seismic-profiles-to-be-used-in-real-world-models/</guid>
                    </item>
				                    <item>
                        <title>Using UART4 to stream data to a Rpi4</title>
                        <link>https://www.geometrics.com/community/mfam-software/using-uart4-to-stream-data-to-a-rpi4/</link>
                        <pubDate>Thu, 02 Jul 2026 04:25:11 +0000</pubDate>
                        <description><![CDATA[Hello,
I saw in a previous post that the current firmware only supports MFAM streaming via Ethernet, and that UART5 isn&#039;t supported. I&#039;m modifying the Dev Kit firmware to add TX output on U...]]></description>
                        <content:encoded><![CDATA[<p>Hello,</p>
<p class="font-claude-response-body break-words whitespace-normal">I saw in a previous post that the current firmware only supports MFAM streaming via Ethernet, and that UART5 isn't supported. I'm modifying the Dev Kit firmware to add TX output on UART4 instead, by adding a parallel <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded- px-1 py-px text-">Mailbox_post</code> in <code class="bg-text-200/5 border border-0.5 border-border-300 text-danger-000 whitespace-pre-wrap rounded- px-1 py-px text-">spiTaskFxns.c</code> to a new UART4 TX task/mailbox, at 460800 bps.</p>
<p class="font-claude-response-body break-words whitespace-normal">Before going further, I wanted to ask:</p>
<ol class=":mb-0 :mt-1 :gap-1 :pb-1 :pb-1 list-decimal flex flex-col gap-1 pl-8 mb-3">
<li class="font-claude-response-body whitespace-normal break-words pl-2">Is there any hardware-level reason UART4 wouldn't work here, beyond it just not being implemented in the stock firmware?</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Does the existing SPI→Ethernet pipeline assume a single consumer, in a way that could cause timing issues if I add a second parallel mailbox post for UART4?</li>
<li class="font-claude-response-body whitespace-normal break-words pl-2">Has anyone tried UART-based streaming from the Dev Kit before, and if so, any known pitfalls?</li>
</ol>
<p class="font-claude-response-body break-words whitespace-normal">Thanks in advance!</p>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/"></category>                        <dc:creator>Ana Teresa Falcão</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/mfam-software/using-uart4-to-stream-data-to-a-rpi4/</guid>
                    </item>
				                    <item>
                        <title>MFAM Dev Kit TIVA example code</title>
                        <link>https://www.geometrics.com/community/mfam-software/mfam-dev-kit-tiva-example-code/</link>
                        <pubDate>Thu, 28 May 2026 21:47:28 +0000</pubDate>
                        <description><![CDATA[We will provide the example source code for MFAM Dev Kit &#039;as-is&#039; for your reference and review. Please note that we do not provide any technical support, maintenance, debugging, or updates f...]]></description>
                        <content:encoded><![CDATA[<p>We will provide the example source code for MFAM Dev Kit 'as-is' for your reference and review. Please note that we do not provide any technical support, maintenance, debugging, or updates for this code.</p>
<p>Click below to download:</p>
154]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/"></category>                        <dc:creator>Rui Zhang</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/mfam-software/mfam-dev-kit-tiva-example-code/</guid>
                    </item>
				                    <item>
                        <title>Methods for obtaining underwater positioning data during towing MagElement</title>
                        <link>https://www.geometrics.com/community/magarrow-magarrow-hardware/methods-for-obtaining-underwater-positioning-data-during-towing-magelement/</link>
                        <pubDate>Mon, 25 May 2026 05:04:52 +0000</pubDate>
                        <description><![CDATA[If there are any practical examples of methods for acquiring underwater position information when towing a MagElement, please let me know.
For example, if acoustic positioning using transpo...]]></description>
                        <content:encoded><![CDATA[<p>If there are any practical examples of methods for acquiring underwater position information when towing a MagElement, please let me know.</p>
<p>For example, if acoustic positioning using transponders is employed, could you explain how it is implemented?</p>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/"></category>                        <dc:creator>Shinji Matsuda</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/magarrow-magarrow-hardware/methods-for-obtaining-underwater-positioning-data-during-towing-magelement/</guid>
                    </item>
				                    <item>
                        <title>How to download or delete raw data from MagStation micro-SD card</title>
                        <link>https://www.geometrics.com/community/magex-magex-software/how-to-download-or-delete-raw-data-from-magstation-micro-sd-card/</link>
                        <pubDate>Wed, 22 Apr 2026 00:27:28 +0000</pubDate>
                        <description><![CDATA[1. Establish WIFI connection between your PC and the MagStation.
2. Open a web browser and type in

3. Click &quot;Delete project storage&quot; or &quot;Download survey data&quot; to delete or down raw data ...]]></description>
                        <content:encoded><![CDATA[<p>1. Establish WIFI connection between your PC and the MagStation.</p>
<p>2. Open a web browser and type in <span style="text-decoration: underline">http://192.168.1.1/supporttools.htm</span>. </p>
153
<p>3. Click "Delete project storage" or "Download survey data" to delete or down raw data from micro-SD card. We recommend deleting raw data files after 700 hours data collection. </p>
<p>4. The downloaded survey data is in .magdata format. To convert it to CSV, open Survey Manager and create a new MagStation project. Inside the project, create a new survey. Select the survey name, click "Import Data" and then choose the .magdata file. After successful import, click "Export CSV".</p>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/"></category>                        <dc:creator>Rui Zhang</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/magex-magex-software/how-to-download-or-delete-raw-data-from-magstation-micro-sd-card/</guid>
                    </item>
				                    <item>
                        <title>Why does my mobile device sometimes disconnect from instrument WIFI?</title>
                        <link>https://www.geometrics.com/community/general-magnetometer/why-does-my-mobile-device-sometimes-disconnect-from-instrument-wifi/</link>
                        <pubDate>Tue, 21 Apr 2026 19:38:13 +0000</pubDate>
                        <description><![CDATA[Geometrics instruments, such as G-864, MagEx, MagArrow, MagStation et al, communicate with a mobile device via WIFI. But because the instrument WIFI has NO internet access, some Android devi...]]></description>
                        <content:encoded><![CDATA[<p>Geometrics instruments, such as G-864, MagEx, MagArrow, MagStation et al, communicate with a mobile device via WIFI. But because the instrument WIFI has NO internet access, some Android device, after connecting to the instrument for a while, will automatically start searching for another WIFI access point. To prevent this from happening, when the No Internet Access warning window pops up after first WiFi connection, choose "Tap for options". On the following window, check the “Don’t ask again for this network” box and press “Yes” .</p>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/"></category>                        <dc:creator>Rui Zhang</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/general-magnetometer/why-does-my-mobile-device-sometimes-disconnect-from-instrument-wifi/</guid>
                    </item>
				                    <item>
                        <title>Teensy 4.1 with MFAM</title>
                        <link>https://www.geometrics.com/community/mfam/teensy-4-1-with-mfam/</link>
                        <pubDate>Wed, 25 Mar 2026 09:21:36 +0000</pubDate>
                        <description><![CDATA[Hi All,
&nbsp;
We are using the Teensy 4.1 as a logger (Adafruit GPS is linked with the Teensy) for the MFAM SX. Below is the code for the Arduino IDE (Teensy), for people who might find i...]]></description>
                        <content:encoded><![CDATA[<p>Hi All,</p>
<p>&nbsp;</p>
<p>We are using the Teensy 4.1 as a logger (Adafruit GPS is linked with the Teensy) for the MFAM SX. Below is the code for the Arduino IDE (Teensy), for people who might find it useful,</p>
<p>Roi</p>
<p>&nbsp;</p>
<div>
<div><span>#include</span><span> </span><span>&lt;NativeEthernet.h&gt;</span></div>
<div><span>#include</span><span> </span><span>&lt;SD.h&gt;</span></div>
<br />
<div><span>// ---- NETWORK CONFIGURATION ----</span></div>
<div><span>byte mac[] = </span><span>{</span><span> 0x</span><span>DE</span><span>, 0x</span><span>AD</span><span>, 0x</span><span>BE</span><span>, 0x</span><span>EF</span><span>, 0x</span><span>FE</span><span>, 0x</span><span>ED</span><span> </span><span>}</span><span>;</span></div>
<div><span>IPAddress </span><span>ip</span><span>(</span><span>192</span><span>, </span><span>168</span><span>, </span><span>2</span><span>, </span><span>10</span><span>)</span><span>;</span></div>
<div><span>IPAddress </span><span>mfamIP</span><span>(</span><span>192</span><span>, </span><span>168</span><span>, </span><span>2</span><span>, </span><span>2</span><span>)</span><span>;</span></div>
<div><span>uint16_t</span><span> mfamPort = </span><span>1000</span><span>;</span></div>
<br />
<div><span>EthernetClient client;</span></div>
<br />
<div><span>// ---- PACKET STRUCTURE ----</span></div>
<div><span>const</span><span> </span><span>int</span><span> PACKET_SIZE = </span><span>1380</span><span>;</span></div>
<div><span>const</span><span> </span><span>int</span><span> SAMPLE_SIZE = </span><span>32</span><span>;</span></div>
<div><span>const</span><span> </span><span>int</span><span> HEADER_SIZE = </span><span>16</span><span>;</span></div>
<div><span>const</span><span> </span><span>int</span><span> NUM_SAMPLES = </span><span>40</span><span>;</span></div>
<div><span>const</span><span> </span><span>int</span><span> SD_CHIP_SELECT = BUILTIN_SDCARD;</span></div>
<br />
<div><span>uint8_t</span><span> </span><span>buffer</span><span>;</span></div>
<div><span>int</span><span> bufferPos = </span><span>0</span><span>;</span></div>
<br />
<div><span>// ---- SD CARD ----</span></div>
<div><span>File logFile;</span></div>
<div><span>bool</span><span> sdReady = </span><span>false</span><span>;</span></div>
<div><span>unsigned</span><span> </span><span>long</span><span> sampleCount = </span><span>0</span><span>;</span></div>
<div><span>unsigned</span><span> </span><span>long</span><span> fileStartTime = </span><span>0</span><span>;</span></div>
<div><span>char</span><span> </span><span>filename</span><span>;</span></div>
<br />
<div><span>// ---- AUXILIARY CHANNEL STORAGE ----</span></div>
<div><span>double</span><span> gyroX = </span><span>0</span><span>, gyroY = </span><span>0</span><span>, gyroZ = </span><span>0</span><span>, gyroT = </span><span>0</span><span>;</span></div>
<div><span>double</span><span> accelX = </span><span>0</span><span>, accelY = </span><span>0</span><span>, accelZ = </span><span>0</span><span>, accelT = </span><span>0</span><span>;</span></div>
<div><span>double</span><span> compassX = </span><span>0</span><span>, compassY = </span><span>0</span><span>, compassZ = </span><span>0</span><span>, compassT = </span><span>0</span><span>;</span></div>
<br />
<div><span>// ---- GPS FROM ADAFRUIT MODULE ON SERIAL1 (Pin 0 = RX) ----</span></div>
<div><span>char</span><span> </span><span>gpsBuffer</span><span>;</span></div>
<div><span>int</span><span> gpsBufferPos = </span><span>0</span><span>;</span></div>
<div><span>char</span><span> </span><span>gpsString</span><span> = </span><span>""</span><span>;</span></div>
<div><span>char</span><span> </span><span>gpsDate</span><span> = </span><span>"00/00/00"</span><span>;</span></div>
<div><span>char</span><span> </span><span>gpsTime</span><span> = </span><span>"00:00:00.000"</span><span>;</span></div>
<div><span>bool</span><span> gpsFix = </span><span>false</span><span>;</span></div>
<div><span>uint8_t</span><span> tsStatus = </span><span>0</span><span>;</span></div>
<br />
<div><span>// ---- OUTPUT CONTROL ----</span></div>
<div><span>// Set to 1 to log every sample, 10 for 100Hz, 20 for 50Hz, etc.</span></div>
<div><span>const</span><span> </span><span>int</span><span> DOWNSAMPLE_FACTOR = </span><span>1</span><span>;</span><span> // 50 Hz output</span></div>
<div><span>int</span><span> downsampleCounter = </span><span>0</span><span>;</span></div>
<br />
<div><span>// How many minutes per file. Set to 10, 20, 60, etc.</span></div>
<div><span>const</span><span> </span><span>int</span><span> FILE_MINUTES = </span><span>10</span><span>;</span></div>
<br />
<div><span>// ---- LED INDICATOR ----</span></div>
<div><span>// Off = starting up</span></div>
<div><span>// Very slow blink (every 3 sec) = connected and logging</span></div>
<div><span>// Fast blink (4/sec) = connected but no data arriving</span></div>
<div><span>// Solid on = no SD card</span></div>
<div><span>// 3 quick flashes then pause = cannot connect to MFAM</span></div>
<div><span>const</span><span> </span><span>int</span><span> LED_PIN = </span><span>13</span><span>;</span></div>
<div><span>unsigned</span><span> </span><span>long</span><span> lastBlinkTime = </span><span>0</span><span>;</span></div>
<div><span>bool</span><span> ledState = </span><span>false</span><span>;</span></div>
<div><span>unsigned</span><span> </span><span>long</span><span> lastDataTime = </span><span>0</span><span>;</span></div>
<br />
<div><span>// ---- FUNCTION PROTOTYPES ----</span></div>
<div><span>void</span><span> </span><span>createNewFile</span><span>()</span><span>;</span></div>
<div><span>void</span><span> </span><span>parsePacket</span><span>(</span><span>uint8_t*</span><span> </span><span>pkt)</span><span>;</span></div>
<div><span>void</span><span> </span><span>parseAuxChannels</span><span>(</span><span>uint8_t*</span><span> </span><span>sample</span><span>, </span><span>uint16_t</span><span> </span><span>frameID)</span><span>;</span></div>
<div><span>void</span><span> </span><span>readGPS</span><span>()</span><span>;</span></div>
<div><span>void</span><span> </span><span>parseGPRMC</span><span>(</span><span>char*</span><span> </span><span>sentence)</span><span>;</span></div>
<div><span>void</span><span> </span><span>writeSample</span><span>(</span><span>unsigned</span><span> </span><span>long</span><span> </span><span>timestamp</span><span>, </span><span>uint16_t</span><span> </span><span>fiducial</span><span>, </span><span>double</span><span> </span><span>mag1</span><span>, </span><span>uint16_t</span><span> </span><span>mag1s</span><span>,</span></div>
<div><span> </span><span>double</span><span> </span><span>mag2</span><span>, </span><span>uint16_t</span><span> </span><span>mag2s</span><span>, </span><span>uint16_t</span><span> </span><span>sysStatus)</span><span>;</span></div>
<div><span>int16_t</span><span> </span><span>toSigned16</span><span>(</span><span>uint16_t</span><span> </span><span>val)</span><span>;</span></div>
<br />
<div><span>void</span><span> </span><span>createNewFile</span><span>()</span><span> </span><span>{</span></div>
<div><span> </span><span>static</span><span> </span><span>int</span><span> fileNumber = </span><span>0</span><span>;</span></div>
<div><span> // On first call, find the next available file number</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>fileNumber == </span><span>0</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>char</span><span> </span><span>testName</span><span>;</span></div>
<div><span> </span><span>for</span><span> </span><span>(</span><span>int</span><span> i = </span><span>1</span><span>; i &lt;= </span><span>99999</span><span>; i++</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>testName, sizeof</span><span>(</span><span>testName</span><span>)</span><span>, </span><span>"MFAM_%05d.txt"</span><span>, i</span><span>)</span><span>;</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>!</span><span>SD</span><span>.</span><span>exists</span><span>(</span><span>testName</span><span>))</span><span> </span><span>{</span></div>
<div><span> fileNumber = i - </span><span>1</span><span>;</span><span> // Will be incremented below</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> fileNumber++;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>filename, sizeof</span><span>(</span><span>filename</span><span>)</span><span>, </span><span>"MFAM_%05d.txt"</span><span>, fileNumber</span><span>)</span><span>;</span></div>
<br />
<div><span> logFile = </span><span>SD</span><span>.</span><span>open</span><span>(</span><span>filename, FILE_WRITE</span><span>)</span><span>;</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>logFile</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>println</span><span>(</span><span>"Mag 1,Mag 2,Fid,SysS,Mg1S,Mg2S,Gyro X,Gyro Y,Gyro Z,Gyro T,Accel X,Accel Y,Accel Z,Accel T,CompassX,CompassY,CompassZ,Comp T,Date,Time,TS Status,GPS"</span><span>)</span><span>;</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>flush</span><span>()</span><span>;</span></div>
<div><span> fileStartTime = </span><span>millis</span><span>()</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>"Logging to: "</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>filename</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span><span> </span><span>else</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>"ERROR: Could not create "</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>filename</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>setup</span><span>()</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>begin</span><span>(</span><span>115200</span><span>)</span><span>;</span></div>
<div><span> </span><span>delay</span><span>(</span><span>2000</span><span>)</span><span>;</span></div>
<br />
<div><span> // Start GPS serial port (Adafruit Ultimate GPS defaults to 9600 baud)</span></div>
<div><span> </span><span>Serial1</span><span>.</span><span>begin</span><span>(</span><span>9600</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>pinMode</span><span>(</span><span>LED_PIN, OUTPUT</span><span>)</span><span>;</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, LOW</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>memset</span><span>(</span><span>gpsString, </span><span>0</span><span>, sizeof</span><span>(</span><span>gpsString</span><span>))</span><span>;</span></div>
<br />
<div><span> // Initialize SD card</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>SD</span><span>.</span><span>begin</span><span>(</span><span>SD_CHIP_SELECT</span><span>))</span><span> </span><span>{</span></div>
<div><span> sdReady = </span><span>true</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"SD card ready."</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span><span> </span><span>else</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"WARNING: No SD card found. Serial output only."</span><span>)</span><span>;</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, HIGH</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> // Initialize Ethernet</span></div>
<div><span> </span><span>Ethernet</span><span>.</span><span>begin</span><span>(</span><span>mac, ip</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>Ethernet</span><span>.</span><span>hardwareStatus</span><span>()</span><span> == EthernetNoHardware</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"ERROR: No Ethernet hardware found!"</span><span>)</span><span>;</span></div>
<div><span> </span><span>while</span><span> </span><span>(</span><span>true</span><span>)</span><span> </span><span>{}</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>"Teensy IP: "</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>Ethernet</span><span>.</span><span>localIP</span><span>())</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>"Connecting to MFAM at "</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>mfamIP</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>print</span><span>(</span><span>":"</span><span>)</span><span>;</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>mfamPort</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>client</span><span>.</span><span>connect</span><span>(</span><span>mfamIP, mfamPort</span><span>))</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"Connected to MFAM!"</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span><span> </span><span>else</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"Connection failed!"</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"Waiting for GPS fix..."</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>sdReady</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>createNewFile</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"Mag 1,Mag 2,Fid,SysS,Mg1S,Mg2S,Gyro X,Gyro Y,Gyro Z,Gyro T,Accel X,Accel Y,Accel Z,Accel T,CompassX,CompassY,CompassZ,Comp T,Date,Time,TS Status,GPS"</span><span>)</span><span>;</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>loop</span><span>()</span><span> </span><span>{</span></div>
<div><span> // Always read GPS data from Serial1</span></div>
<div><span> </span><span>readGPS</span><span>()</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>!</span><span>client</span><span>.</span><span>connected</span><span>())</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>"Disconnected. Reconnecting..."</span><span>)</span><span>;</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>sdReady &amp;&amp; logFile</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>flush</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>for</span><span> </span><span>(</span><span>int</span><span> i = </span><span>0</span><span>; i &lt; </span><span>3</span><span>; i++</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, HIGH</span><span>)</span><span>;</span></div>
<div><span> </span><span>delay</span><span>(</span><span>100</span><span>)</span><span>;</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, LOW</span><span>)</span><span>;</span></div>
<div><span> </span><span>delay</span><span>(</span><span>100</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>delay</span><span>(</span><span>1400</span><span>)</span><span>;</span></div>
<div><span> </span><span>client</span><span>.</span><span>connect</span><span>(</span><span>mfamIP, mfamPort</span><span>)</span><span>;</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>client</span><span>.</span><span>connected</span><span>())</span><span> </span><span>{</span></div>
<div><span> lastDataTime = </span><span>millis</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>return</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>while</span><span> </span><span>(</span><span>client</span><span>.</span><span>available</span><span>())</span><span> </span><span>{</span></div>
<div><span> </span><span>buffer</span><span> = </span><span>client</span><span>.</span><span>read</span><span>()</span><span>;</span></div>
<div><span> bufferPos++;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>bufferPos &gt;= PACKET_SIZE</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>parsePacket</span><span>(</span><span>buffer</span><span>)</span><span>;</span></div>
<div><span> bufferPos = </span><span>0</span><span>;</span></div>
<div><span> lastDataTime = </span><span>millis</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> // LED patterns</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>sdReady</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>millis</span><span>()</span><span> - lastDataTime &gt; </span><span>3000</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>millis</span><span>()</span><span> - lastBlinkTime &gt; </span><span>125</span><span>)</span><span> </span><span>{</span></div>
<div><span> ledState = !ledState;</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, ledState ? HIGH : LOW</span><span>)</span><span>;</span></div>
<div><span> lastBlinkTime = </span><span>millis</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span><span> </span><span>else</span><span> </span><span>{</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>millis</span><span>()</span><span> - lastBlinkTime &gt; </span><span>1500</span><span>)</span><span> </span><span>{</span></div>
<div><span> ledState = !ledState;</span></div>
<div><span> </span><span>digitalWrite</span><span>(</span><span>LED_PIN, ledState ? HIGH : LOW</span><span>)</span><span>;</span></div>
<div><span> lastBlinkTime = </span><span>millis</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> // New file every FILE_MINUTES minutes</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>sdReady &amp;&amp; logFile &amp;&amp; </span><span>(</span><span>millis</span><span>()</span><span> - fileStartTime &gt; </span><span>(</span><span>unsigned</span><span> </span><span>long</span><span>)</span><span>FILE_MINUTES * </span><span>60</span><span>UL * </span><span>1000</span><span>UL</span><span>))</span><span> </span><span>{</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>close</span><span>()</span><span>;</span></div>
<div><span> </span><span>createNewFile</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>// ---- GPS READING FROM ADAFRUIT MODULE ON SERIAL1 ----</span></div>
<div><span>void</span><span> </span><span>readGPS</span><span>()</span><span> </span><span>{</span></div>
<div><span> </span><span>while</span><span> </span><span>(</span><span>Serial1</span><span>.</span><span>available</span><span>())</span><span> </span><span>{</span></div>
<div><span> </span><span>char</span><span> c = </span><span>Serial1</span><span>.</span><span>read</span><span>()</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>c == </span><span>'$'</span><span>)</span><span> </span><span>{</span></div>
<div><span> gpsBufferPos = </span><span>0</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>gpsBufferPos &lt; </span><span>(</span><span>int</span><span>)</span><span>sizeof</span><span>(</span><span>gpsBuffer</span><span>)</span><span> - </span><span>1</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>gpsBuffer</span><span> = c;</span></div>
<div><span> gpsBufferPos++;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>c == </span><span>'</span><span>\n</span><span>'</span><span> || c == </span><span>'</span><span>\r</span><span>'</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>gpsBuffer</span><span> = </span><span>'</span><span>\0</span><span>'</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>strncmp</span><span>(</span><span>gpsBuffer, </span><span>"$GPRMC"</span><span>, </span><span>6</span><span>)</span><span> == </span><span>0</span><span> || </span><span>strncmp</span><span>(</span><span>gpsBuffer, </span><span>"$GNRMC"</span><span>, </span><span>6</span><span>)</span><span> == </span><span>0</span><span>)</span><span> </span><span>{</span></div>
<div><span> // Save full sentence for logging</span></div>
<div><span> </span><span>strncpy</span><span>(</span><span>gpsString, gpsBuffer, sizeof</span><span>(</span><span>gpsString</span><span>)</span><span> - </span><span>1</span><span>)</span><span>;</span></div>
<div><span> </span><span>gpsString</span><span> = </span><span>'</span><span>\0</span><span>'</span><span>;</span></div>
<br />
<div><span> // Remove trailing newline/carriage return</span></div>
<div><span> </span><span>int</span><span> slen = </span><span>strlen</span><span>(</span><span>gpsString</span><span>)</span><span>;</span></div>
<div><span> </span><span>while</span><span> </span><span>(</span><span>slen &gt; </span><span>0</span><span> &amp;&amp; </span><span>(</span><span>gpsString</span><span> == </span><span>'</span><span>\n</span><span>'</span><span> || </span><span>gpsString</span><span> == </span><span>'</span><span>\r</span><span>'</span><span>))</span><span> </span><span>{</span></div>
<div><span> </span><span>gpsString</span><span> = </span><span>'</span><span>\0</span><span>'</span><span>;</span></div>
<div><span> slen--;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>parseGPRMC</span><span>(</span><span>gpsBuffer</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> gpsBufferPos = </span><span>0</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>parseGPRMC</span><span>(</span><span>char*</span><span> </span><span>sentence)</span><span> </span><span>{</span></div>
<div><span> // $GPRMC,HHMMSS.sss,A,lat,N,lon,W,speed,course,DDMMYY,...</span></div>
<div><span> </span><span>char</span><span> </span><span>copy</span><span>;</span></div>
<div><span> </span><span>strncpy</span><span>(</span><span>copy, sentence, sizeof</span><span>(</span><span>copy</span><span>)</span><span> - </span><span>1</span><span>)</span><span>;</span></div>
<div><span> </span><span>copy</span><span> = </span><span>'</span><span>\0</span><span>'</span><span>;</span></div>
<br />
<div><span> </span><span>char</span><span>* token = </span><span>strtok</span><span>(</span><span>copy, </span><span>","</span><span>)</span><span>;</span></div>
<div><span> </span><span>int</span><span> field = </span><span>0</span><span>;</span></div>
<br />
<div><span> </span><span>while</span><span> </span><span>(</span><span>token != </span><span>NULL</span><span> &amp;&amp; field &lt; </span><span>10</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>switch</span><span> </span><span>(</span><span>field</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>case</span><span> </span><span>1</span><span>:</span><span> // Time</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>strlen</span><span>(</span><span>token</span><span>)</span><span> &gt;= </span><span>6</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>gpsTime, sizeof</span><span>(</span><span>gpsTime</span><span>)</span><span>, </span><span>"%c%c:%c%c:%s"</span><span>,</span></div>
<div><span> </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span>, token + </span><span>4</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>case</span><span> </span><span>2</span><span>:</span><span> // Fix status</span></div>
<div><span> gpsFix = </span><span>(</span><span>token</span><span> == </span><span>'A'</span><span>)</span><span>;</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>case</span><span> </span><span>9</span><span>:</span><span> // Date</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>strlen</span><span>(</span><span>token</span><span>)</span><span> &gt;= </span><span>6</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>gpsDate, sizeof</span><span>(</span><span>gpsDate</span><span>)</span><span>, </span><span>"%c%c/%c%c/%c%c"</span><span>,</span></div>
<div><span> </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span>, </span><span>token</span><span></span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> token = </span><span>strtok</span><span>(</span><span>NULL</span><span>, </span><span>","</span><span>)</span><span>;</span></div>
<div><span> field++;</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> // Update GPS bits of tsStatus</span></div>
<div><span> tsStatus = </span><span>(</span><span>tsStatus &amp; 0x</span><span>0C</span><span>)</span><span>;</span><span> // Keep MFAM PPS bits (3,2)</span></div>
<div><span> tsStatus |= 0x</span><span>01</span><span>;</span><span> // Bit 0: RMC sentence received</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>gpsFix</span><span>)</span><span> </span><span>{</span></div>
<div><span> tsStatus |= 0x</span><span>02</span><span>;</span><span> // Bit 1: GPS fix valid</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>// ---- MFAM DATA PARSING ----</span></div>
<div><span>int16_t</span><span> </span><span>toSigned16</span><span>(</span><span>uint16_t</span><span> </span><span>val)</span><span> </span><span>{</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>val &gt; </span><span>32767</span><span>)</span><span> </span><span>return</span><span> </span><span>(</span><span>int16_t</span><span>)(</span><span>val - </span><span>65536</span><span>)</span><span>;</span></div>
<div><span> </span><span>return</span><span> </span><span>(</span><span>int16_t</span><span>)</span><span>val;</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>parseAuxChannels</span><span>(</span><span>uint8_t*</span><span> </span><span>sample</span><span>, </span><span>uint16_t</span><span> </span><span>frameID)</span><span> </span><span>{</span></div>
<div><span> </span><span>uint8_t</span><span> auxID = </span><span>(</span><span>frameID &gt;&gt; </span><span>11</span><span>)</span><span> &amp; 0x</span><span>07</span><span>;</span></div>
<br />
<div><span> </span><span>uint16_t</span><span> aux0 = </span><span>sample</span><span> | </span><span>(</span><span>sample</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<div><span> </span><span>uint16_t</span><span> aux1 = </span><span>sample</span><span> | </span><span>(</span><span>sample</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<div><span> </span><span>uint16_t</span><span> aux2 = </span><span>sample</span><span> | </span><span>(</span><span>sample</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<div><span> </span><span>uint16_t</span><span> aux3 = </span><span>sample</span><span> | </span><span>(</span><span>sample</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>switch</span><span> </span><span>(</span><span>auxID</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>case</span><span> </span><span>1</span><span>:</span></div>
<div><span> compassX = </span><span>toSigned16</span><span>(</span><span>aux0</span><span>)</span><span> / </span><span>0.01333333</span><span>;</span></div>
<div><span> compassY = </span><span>toSigned16</span><span>(</span><span>aux1</span><span>)</span><span> / </span><span>0.01333333</span><span>;</span></div>
<div><span> compassZ = </span><span>toSigned16</span><span>(</span><span>aux2</span><span>)</span><span> / </span><span>0.01333333</span><span>;</span></div>
<div><span> compassT = </span><span>toSigned16</span><span>(</span><span>aux3</span><span>)</span><span> / </span><span>128.0</span><span> + </span><span>25.0</span><span>;</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>case</span><span> </span><span>2</span><span>:</span></div>
<div><span> gyroX = </span><span>toSigned16</span><span>(</span><span>aux0</span><span>)</span><span> / </span><span>16.384</span><span>;</span></div>
<div><span> gyroY = </span><span>toSigned16</span><span>(</span><span>aux1</span><span>)</span><span> / </span><span>16.384</span><span>;</span></div>
<div><span> gyroZ = </span><span>toSigned16</span><span>(</span><span>aux2</span><span>)</span><span> / </span><span>16.384</span><span>;</span></div>
<div><span> gyroT = </span><span>toSigned16</span><span>(</span><span>aux3</span><span>)</span><span> / </span><span>512.0</span><span> + </span><span>23.0</span><span>;</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>case</span><span> </span><span>4</span><span>:</span></div>
<div><span> accelX = </span><span>toSigned16</span><span>(</span><span>aux0</span><span>)</span><span> / </span><span>16384.0</span><span>;</span></div>
<div><span> accelY = </span><span>toSigned16</span><span>(</span><span>aux1</span><span>)</span><span> / </span><span>16384.0</span><span>;</span></div>
<div><span> accelZ = </span><span>toSigned16</span><span>(</span><span>aux2</span><span>)</span><span> / </span><span>16384.0</span><span>;</span></div>
<div><span> accelT = </span><span>toSigned16</span><span>(</span><span>aux3</span><span>)</span><span> / </span><span>512.0</span><span> + </span><span>23.0</span><span>;</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>default</span><span>:</span></div>
<div><span> </span><span>break</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>writeSample</span><span>(</span><span>unsigned</span><span> </span><span>long</span><span> </span><span>timestamp</span><span>, </span><span>uint16_t</span><span> </span><span>fiducial</span><span>, </span><span>double</span><span> </span><span>mag1</span><span>, </span><span>uint16_t</span><span> </span><span>mag1s</span><span>,</span></div>
<div><span> </span><span>double</span><span> </span><span>mag2</span><span>, </span><span>uint16_t</span><span> </span><span>mag2s</span><span>, </span><span>uint16_t</span><span> </span><span>sysStatus)</span><span> </span><span>{</span></div>
<br />
<div><span> </span><span>char</span><span> </span><span>tsStr</span><span>;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>tsStr, sizeof</span><span>(</span><span>tsStr</span><span>)</span><span>, </span><span>"%d%d%d%d%d%d%d%d"</span><span>,</span></div>
<div><span> </span><span>(</span><span>tsStatus &gt;&gt; </span><span>7</span><span>)</span><span> &amp; </span><span>1</span><span>, </span><span>(</span><span>tsStatus &gt;&gt; </span><span>6</span><span>)</span><span> &amp; </span><span>1</span><span>, </span><span>(</span><span>tsStatus &gt;&gt; </span><span>5</span><span>)</span><span> &amp; </span><span>1</span><span>, </span><span>(</span><span>tsStatus &gt;&gt; </span><span>4</span><span>)</span><span> &amp; </span><span>1</span><span>,</span></div>
<div><span> </span><span>(</span><span>tsStatus &gt;&gt; </span><span>3</span><span>)</span><span> &amp; </span><span>1</span><span>, </span><span>(</span><span>tsStatus &gt;&gt; </span><span>2</span><span>)</span><span> &amp; </span><span>1</span><span>, </span><span>(</span><span>tsStatus &gt;&gt; </span><span>1</span><span>)</span><span> &amp; </span><span>1</span><span>, tsStatus &amp; </span><span>1</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>char</span><span> </span><span>sysHex</span><span>, </span><span>m1sHex</span><span>, </span><span>m2sHex</span><span>;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>sysHex, sizeof</span><span>(</span><span>sysHex</span><span>)</span><span>, </span><span>"%04X"</span><span>, sysStatus</span><span>)</span><span>;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>m1sHex, sizeof</span><span>(</span><span>m1sHex</span><span>)</span><span>, </span><span>"%04X"</span><span>, mag1s</span><span>)</span><span>;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>m2sHex, sizeof</span><span>(</span><span>m2sHex</span><span>)</span><span>, </span><span>"%04X"</span><span>, mag2s</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>char</span><span> </span><span>line</span><span>;</span></div>
<div><span> </span><span>snprintf</span><span>(</span><span>line, sizeof</span><span>(</span><span>line</span><span>)</span><span>,</span></div>
<div><span> </span><span>"%10.4f,%10.4f,%4d,%s,%s,%s,%10.2f,%10.2f,%10.2f,%5.1f,%8.5f,%8.5f,%8.5f,%5.1f,%8.1f,%8.1f,%8.1f,%5.1f,%s,%s,%s,%s"</span><span>,</span></div>
<div><span> mag1, mag2, fiducial, sysHex, m1sHex, m2sHex,</span></div>
<div><span> gyroX, gyroY, gyroZ, gyroT,</span></div>
<div><span> accelX, accelY, accelZ, accelT,</span></div>
<div><span> compassX, compassY, compassZ, compassT,</span></div>
<div><span> gpsDate, gpsTime, tsStr, gpsString</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>sdReady &amp;&amp; logFile</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>println</span><span>(</span><span>line</span><span>)</span><span>;</span></div>
<div><span> </span><span>if</span><span> </span><span>(</span><span>sampleCount % </span><span>1000</span><span> == </span><span>0</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>logFile</span><span>.</span><span>flush</span><span>()</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>sampleCount % </span><span>500</span><span> == </span><span>0</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>Serial</span><span>.</span><span>println</span><span>(</span><span>line</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
<br />
<div><span>void</span><span> </span><span>parsePacket</span><span>(</span><span>uint8_t*</span><span> </span><span>pkt)</span><span> </span><span>{</span></div>
<div><span> // Get PPS bits from MFAM system status</span></div>
<div><span> </span><span>uint16_t</span><span> firstSysStatus = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<div><span> </span><span>uint8_t</span><span> mfamPPSbits = </span><span>(</span><span>firstSysStatus &gt;&gt; </span><span>12</span><span>)</span><span> &amp; 0x</span><span>0C</span><span>;</span></div>
<div><span> tsStatus = </span><span>(</span><span>tsStatus &amp; 0x</span><span>03</span><span>)</span><span> | mfamPPSbits;</span></div>
<br />
<div><span> </span><span>for</span><span> </span><span>(</span><span>int</span><span> i = </span><span>0</span><span>; i &lt; NUM_SAMPLES; i++</span><span>)</span><span> </span><span>{</span></div>
<div><span> </span><span>int</span><span> offset = HEADER_SIZE + </span><span>(</span><span>i * SAMPLE_SIZE</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>uint16_t</span><span> frameID = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<div><span> </span><span>uint16_t</span><span> fiducial = frameID &amp; 0x</span><span>07FF</span><span>;</span></div>
<br />
<div><span> </span><span>uint16_t</span><span> sysStatus = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>uint32_t</span><span> mag1raw = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span> |</span></div>
<div><span> </span><span>((</span><span>uint32_t</span><span>)</span><span>pkt</span><span> &lt;&lt; </span><span>16</span><span>)</span><span> | </span><span>((</span><span>uint32_t</span><span>)</span><span>pkt</span><span> &lt;&lt; </span><span>24</span><span>)</span><span>;</span></div>
<div><span> </span><span>double</span><span> mag1 = mag1raw * </span><span>0.05</span><span> / </span><span>1000.0</span><span>;</span></div>
<br />
<div><span> </span><span>uint16_t</span><span> mag1status = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>uint32_t</span><span> mag2raw = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span> |</span></div>
<div><span> </span><span>((</span><span>uint32_t</span><span>)</span><span>pkt</span><span> &lt;&lt; </span><span>16</span><span>)</span><span> | </span><span>((</span><span>uint32_t</span><span>)</span><span>pkt</span><span> &lt;&lt; </span><span>24</span><span>)</span><span>;</span></div>
<div><span> </span><span>double</span><span> mag2 = mag2raw * </span><span>0.05</span><span> / </span><span>1000.0</span><span>;</span></div>
<br />
<div><span> </span><span>uint16_t</span><span> mag2status = </span><span>pkt</span><span> | </span><span>(</span><span>pkt</span><span> &lt;&lt; </span><span>8</span><span>)</span><span>;</span></div>
<br />
<div><span> </span><span>parseAuxChannels</span><span>(</span><span>pkt + offset, frameID</span><span>)</span><span>;</span></div>
<br />
<div><span> sampleCount++;</span></div>
<div><span> downsampleCounter++;</span></div>
<br />
<div><span> </span><span>if</span><span> </span><span>(</span><span>downsampleCounter &gt;= DOWNSAMPLE_FACTOR</span><span>)</span><span> </span><span>{</span></div>
<div><span> downsampleCounter = </span><span>0</span><span>;</span></div>
<div><span> </span><span>writeSample</span><span>(</span><span>millis</span><span>()</span><span>, fiducial, mag1, mag1status, mag2, mag2status, sysStatus</span><span>)</span><span>;</span></div>
<div><span> </span><span>}</span></div>
<div><span> </span><span>}</span></div>
<div><span>}</span></div>
</div>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/"></category>                        <dc:creator>Roi Granot</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/mfam/teensy-4-1-with-mfam/</guid>
                    </item>
				                    <item>
                        <title>Survey Manager quits when exporting to Montaj/GDB format</title>
                        <link>https://www.geometrics.com/community/general-magnetometer/survey-manager-quits-when-exporting-to-montaj-gdb-format/</link>
                        <pubDate>Wed, 17 Dec 2025 18:26:02 +0000</pubDate>
                        <description><![CDATA[Survey Manager 3.5.1433 and earlier versions may exit unexpectedly after the user has selected &quot;Export GDB&quot; to export magnetometer survey data to a Montaj-compatible database.[&quot;Export GDB&quot; i...]]></description>
                        <content:encoded><![CDATA[<p>Survey Manager 3.5.1433 and earlier versions may exit unexpectedly after the user has selected "Export GDB" to export magnetometer survey data to a Montaj-compatible database..</p>
<p>Survey Manager may exit without notice or it may show some information about the failure, including steps to open a service request with Seequent.</p>
<p>On systems with Montaj 2025.1 or earlier, this issue may be fixed by updating Montaj to the most recent version (2025.2 at the time of this post) and verifying that Survey Manager is at its most recent version (3.5.1433 at the time of this post).</p>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/"></category>                        <dc:creator>Magnetics SW</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/general-magnetometer/survey-manager-quits-when-exporting-to-montaj-gdb-format/</guid>
                    </item>
				                    <item>
                        <title>Quickstart Guide Now Available</title>
                        <link>https://www.geometrics.com/community/magarrow-magarrow-hardware/quickstart-guide-now-available-2/</link>
                        <pubDate>Wed, 29 Oct 2025 16:31:38 +0000</pubDate>
                        <description><![CDATA[Find the most recent version of the Quickstart Guide on the MagElement product page, or click the link here]]></description>
                        <content:encoded><![CDATA[Find the most recent version of the Quickstart Guide on the MagElement product page, or click the link <p><a href="https://www.geometrics.com/wp-content/uploads/2025/10/MagElement_Quickstart_Guide_RevA.pdf">here</a></p>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/"></category>                        <dc:creator>Gretchen Schmauder</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/magarrow-magarrow-hardware/quickstart-guide-now-available-2/</guid>
                    </item>
				                    <item>
                        <title>Quickstart Guide Now Available</title>
                        <link>https://www.geometrics.com/community/magex-magex-application/quickstart-guide-now-available/</link>
                        <pubDate>Wed, 29 Oct 2025 16:24:06 +0000</pubDate>
                        <description><![CDATA[Find the most recent version of the Quickstart Guide on the MagStation product page, or click the link here]]></description>
                        <content:encoded><![CDATA[Find the most recent version of the Quickstart Guide on the MagStation product page, or click the link <p><a href="https://www.geometrics.com/wp-content/uploads/2025/10/MagStation_Quickstart_Guide_A0.pdf">here</a></p>]]></content:encoded>
						                            <category domain="https://www.geometrics.com/community/"></category>                        <dc:creator>Gretchen Schmauder</dc:creator>
                        <guid isPermaLink="true">https://www.geometrics.com/community/magex-magex-application/quickstart-guide-now-available/</guid>
                    </item>
							        </channel>
        </rss>
		