Generates a test signal on an AnalogOut and monitors a signal on an AnalogIn, plotting the test signal or the actual signal depending on a conditional compile. The wait() and wait_ms() library calls for this board are highly inaccurate so a new function is provided to wait for X number of milliseconds -- which is not very accurate.

Dependencies:   LCD_DISCO_F429ZI mbed TS_DISCO_F429ZI mbed-os BSP_DISCO_F429ZI

Revision:
0:1ebe7d222470
Child:
1:b9d4b9b8884c
diff -r 000000000000 -r 1ebe7d222470 LaserMon-TestOutput.cpp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LaserMon-TestOutput.cpp	Mon Jun 10 17:10:01 2019 +0000
@@ -0,0 +1,191 @@
+
+// ----------------------------------------------------------------------
+// LaserMon-TestOutput.cpp
+//
+// Fredric L. Rice, June 2019
+//
+// For testing purposes only, this test output wave form can be
+// jumpered in to the laser scan analog input signal so that the
+// software can be developed without the need for an ISEM.
+//
+// This thread will set an analog output signal to contain a porch
+// and then a ramp which increments from an initial step value up 
+// to 3.3 volts, with the step being at 0.0 volts.
+//
+// ----------------------------------------------------------------------
+
+#include "mbed.h"                   // The mbed operating system
+#include "LCD_DISCO_F429ZI.h"       // For controlling the LCD
+#include "TS_DISCO_F429ZI.h"        // For controlling the touch screen
+#include "LaserMon-Main.h"          // For data exported to us
+
+// ----------------------------------------------------------------------
+// We describe the shape of the waveform
+//
+// ----------------------------------------------------------------------
+
+#define PORCH_WIDTH     40                          // In milliseconds
+#define RAMP_WIDTH      216                         // In milliseconds
+#define SCAN_LENGTH     (PORCH_WIDTH + RAMP_WIDTH)  // In milliseconds
+#define STEP_HEIGHT     2.5f                        // In volts
+
+// ----------------------------------------------------------------------
+// Local data storage
+//
+// ----------------------------------------------------------------------
+
+    // We create an analog output
+    static AnalogOut st_testSignalOut(TEST_SIGNAL_OUT);
+    
+    // We will be creating a thread
+    static Thread st_testSignalOutThread;
+    
+    // For diagnostic purposes to show that the test output is working
+    static DigitalOut st_testSignalLED(LED1);
+    
+    // To drive the porch
+    static bool     b_onPorch;
+    static uint16_t u16_countRemaining;
+    
+    // Across the ramp we increment the voltage starting from the
+    // initial step up to 3.3 volts. Here we compute what the
+    // incremental voltage should be so that when the ramp has
+    // been completed, we end up at 3.3 volts, starting from the
+    // initial step.
+    static const float f_stepIncrement = ((3.3f - STEP_HEIGHT) / (float)RAMP_WIDTH);
+    
+// ----------------------------------------------------------------------
+// Data that we will export globally
+//
+// ----------------------------------------------------------------------
+
+    // This is the value we maintain for ramp, adding to it the
+    // incremental value every millisecond. We make it global so
+    // that we can use the value for software development
+    float f_rampVoltage = 0.0f;
+    
+// ----------------------------------------------------------------------
+// TestOutputDriveWaveformAT1Millisecond()
+//
+// ----------------------------------------------------------------------
+static void TestOutputDriveWaveformAT1Millisecond(void)
+{
+    static uint8_t u8_ledTimeoutTimer = 0;
+    
+    // Do we need to turn the scan-completed LED off?
+    if (u8_ledTimeoutTimer > 0)
+    {
+        // Count down the timer and see if it expired
+        if (0 == --u8_ledTimeoutTimer)
+        {
+            // Turn the LED off now that 10 milliseconds has expired
+            st_testSignalLED = 0;
+        }
+    }
+
+    // Are we stepping out the porch?
+    if (true == b_onPorch)
+    {
+        // Yes, are we just now starting on the porch?
+        if (PORCH_WIDTH == u16_countRemaining)
+        {
+            // Yes, so drive the voltage down to zero for porch
+            st_testSignalOut.write(0.0);
+        }
+        
+        // Is the porch time remaining still have some time?
+        if (u16_countRemaining > 0)
+        {
+            // Yes, so count it down 1 millisecond and see if it expired
+            if (0 == --u16_countRemaining)
+            {
+                // The porch time has expired so now we're on ramp
+                b_onPorch = false;
+                
+                // Set the ramp duration
+                u16_countRemaining = RAMP_WIDTH;
+                
+                // Set the output voltage to the step height
+                f_rampVoltage = STEP_HEIGHT;
+                
+                // Set the initial step height
+                st_testSignalOut.write(f_rampVoltage / 3.3f);
+            }
+        }
+    }
+    else
+    {
+        // We are stepping out the ramp. We go from the step height
+        // all the way up to 3.3 volts, incrementally across the
+        // entire length of the ramp.
+        //
+        // Add the incremental value to the ramp voltage going out
+        f_rampVoltage += f_stepIncrement;
+        
+        // Write that voltage out
+        st_testSignalOut.write(f_rampVoltage / 3.3f);
+
+        // Is there any more ramp to go out?
+        if (u16_countRemaining > 0)
+        {
+            // There is so count it down
+            u16_countRemaining--;
+        }
+        
+        // Is there no more ramp left to step out?
+        if (0 == u16_countRemaining)
+        {
+            // No more ramp so we're back to porch
+            b_onPorch = true;
+            
+            // 1 millisecond from now we start counting down porch again
+            u16_countRemaining = PORCH_WIDTH;
+            
+            // At the completion of a scan we drive the LED
+            st_testSignalLED = 1;
+            
+            // We flash the LED for 10 milliseconds
+            u8_ledTimeoutTimer = 10;
+        }
+    }
+}
+
+// ----------------------------------------------------------------------
+// TestOutputThread()
+//
+// This thread sleeps for 1 millisecond and then calls the function 
+// that sends the wavefor out the analog output pin.
+//
+// ----------------------------------------------------------------------
+static void TestOutputThread(void)
+{
+
+    while(true)
+    {
+        // Wait for 1 millisecond
+        accurate_wait_ms(1);
+                
+        // Call the routine which drives the wave form output
+        // one millisecond at a time.
+        TestOutputDriveWaveformAT1Millisecond();
+    }
+}
+
+// ----------------------------------------------------------------------
+// TestOutputInit()
+//
+// This function initializes this module and then launches the thread
+//
+// ----------------------------------------------------------------------
+void TestOutputInit(void)
+{
+    // Initialize this module
+    b_onPorch          = true;
+    u16_countRemaining = PORCH_WIDTH;
+    
+    // Start the test output thread
+    st_testSignalOutThread.start(TestOutputThread);
+}
+
+// End of file
+