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
Diff: LaserMon-Main.cpp
- Revision:
- 2:cbcf2695a4a1
- Parent:
- 1:b9d4b9b8884c
--- a/LaserMon-Main.cpp Fri Jun 14 21:11:31 2019 +0000
+++ b/LaserMon-Main.cpp Mon Jun 17 17:11:07 2019 +0000
@@ -11,6 +11,7 @@
#include "TS_DISCO_F429ZI.h" // For controlling the touch screen
#include "LaserMon-TestOutput.h" // For generating test output signal
#include "LaserMon-ScanInput.h" // For monitoring laser power pin
+#include "LaserMon-TEC.h" // For monitoring the TEC output
#include "LaserMon-Main.h" // Always include ourself
// ----------------------------------------------------------------------
@@ -19,8 +20,30 @@
// ----------------------------------------------------------------------
const char * pch_firstMessage = "Test signal on PA_5";
- const char * pch_secondMessage = "Laser Scan on PC_1";
+ const char * pch_secondMessage = "Laser Scan on PC_1";
+ const char * pch_thirdMessage = "TEC signal on PC_3";
+
+ // Instantiate a digitial input mapped as our push button
+ static DigitalIn st_pushButton(PA_0);
+ // We must see the button down for a period of time, we
+ // do a debounce even though the class may do one already
+ static uint16_t u16_buttonDownCount;
+
+ // This flag informs the laser scan input module whether
+ // it is permitted to plot the scan input or not
+ static bool b_allowPlotting;
+
+ // We store the scan length in milliseconds offered to this
+ // module by the laser scanner, and we store the TEC voltage
+ // offered by the TEC scanner
+ static uint16_t u16_scanLength;
+ static uint16_t u16_TECVoltage;
+ static uint16_t u16_scanCount;
+
+ // We talk to Jenkins through an RS232 serial interface
+ static Serial st_Serial1(USE_SERIAL_TX, USE_SERIAL_RX);
+
// ----------------------------------------------------------------------
// Define global data storage which we will export
//
@@ -38,6 +61,13 @@
// ----------------------------------------------------------------------
static void MainInit(void)
{
+ // Initialize locally-held data
+ u16_buttonDownCount = 0;
+ b_allowPlotting = true;
+ u16_scanLength = 0;
+ u16_TECVoltage = 0;
+ u16_scanCount = 0;
+
// Bring the LCD up
st_lcd.Clear(LCD_COLOR_WHITE);
@@ -49,6 +79,168 @@
// Set the default font size
BSP_LCD_SetFont(&Font16);
+
+ // Set the push button to not have an internal pull-up or down
+ st_pushButton.mode(PullNone);
+
+ // We configure the serial interface
+ st_Serial1.baud(115200);
+ st_Serial1.format(8, SerialBase::None, 1);
+}
+
+// ----------------------------------------------------------------------
+//
+//
+// ----------------------------------------------------------------------
+static void MainCheckInbound(void)
+{
+ // See if there is inbound serial data
+ if (st_Serial1.readable())
+ {
+
+ }
+}
+
+// ----------------------------------------------------------------------
+//
+//
+// ----------------------------------------------------------------------
+static void MainTransmitOutput(uint8_t * pu8_thisFrame, uint16_t u16_thisCount)
+{
+ st_Serial1.write(pu8_thisFrame, u16_thisCount, NULL);
+}
+
+// ----------------------------------------------------------------------
+// LaserMonMainInformScanInformation()
+//
+//
+// ----------------------------------------------------------------------
+void LaserMonMainInformScanInformation(uint16_t u16_thisScanLength, uint16_t u16_thisScanCount)
+{
+ // If we arte displaying information, the scan gets slowed down
+ // while we print the information to the screen, making the scan
+ // information inaccurate. To avoid displaying inaccurate values
+ // we refrain from storing the scan rate while displaying the
+ // information
+ if (true == b_allowPlotting)
+ {
+ // Allow the scan information to get updated
+ u16_scanLength = u16_thisScanLength;
+ }
+
+ // Always store the scan counter value
+ u16_scanCount = u16_thisScanCount;
+}
+
+// ----------------------------------------------------------------------
+// LaserMonMainInformTECVoltage()
+//
+// ----------------------------------------------------------------------
+void LaserMonMainInformTECVoltage(uint16_t u16_thisVoltage)
+{
+ u16_TECVoltage = u16_thisVoltage;
+}
+
+// ----------------------------------------------------------------------
+// MainReportValues()
+//
+// ----------------------------------------------------------------------
+static void MainReportValues(void)
+{
+ char pch_holdMessage[101] = { 0 };
+
+ (void)sprintf(pch_holdMessage, "Scan duration %u", u16_scanLength);
+ st_lcd.DisplayStringAt(1, LINE(1), (uint8_t *)pch_holdMessage, LEFT_MODE);
+
+ (void)sprintf(pch_holdMessage, "Scan count %u", u16_scanCount);
+ st_lcd.DisplayStringAt(1, LINE(2), (uint8_t *)pch_holdMessage, LEFT_MODE);
+
+ (void)sprintf(pch_holdMessage, "TEC voltage %1.02f", (float)u16_TECVoltage / 100.0f);
+ st_lcd.DisplayStringAt(1, LINE(3), (uint8_t *)pch_holdMessage, LEFT_MODE);
+
+ (void)sprintf(pch_holdMessage, "TEC average %1.02f", (float)TECGetLastTenAverage() / 100.0f);
+ st_lcd.DisplayStringAt(1, LINE(4), (uint8_t *)pch_holdMessage, LEFT_MODE);
+
+ // Build a report for Jenkins or anything else to monitor
+ (void)sprintf(pch_holdMessage, "%u,%1.02f,%1.02f,%u%c%c",
+ u16_scanLength,
+ ((float)u16_TECVoltage / 100.0f),
+ ((float)TECGetLastTenAverage() / 100.0f),
+ u16_scanCount,
+ 0x0d, 0x0a);
+
+ // Send that report out the serial interface
+ MainTransmitOutput((uint8_t *)pch_holdMessage, (uint16_t)strlen(pch_holdMessage));
+}
+
+// ----------------------------------------------------------------------
+// MainHandleButtonDown()
+//
+// ----------------------------------------------------------------------
+static void MainHandleButtonDown(void)
+{
+ // Are we currently allowing the laser scan input to be plotted?
+ if (true == b_allowPlotting)
+ {
+ // Flag the fact that we are not allowing the plot
+ b_allowPlotting = false;
+
+ // Make sure that the display is cleared
+ st_lcd.Clear(LCD_COLOR_WHITE);
+
+ // Report the lasr scan and TEC voltage values
+ MainReportValues();
+ }
+ else
+ {
+ // Clear the display
+ st_lcd.Clear(LCD_COLOR_WHITE);
+
+ // Clear the flag so that the plot of the scan may be displayed
+ b_allowPlotting = true;
+ }
+}
+
+// ----------------------------------------------------------------------
+// MainThread()
+//
+// ----------------------------------------------------------------------
+static bool MainThread(void)
+{
+ bool b_restartOneSecondTimer = false;
+
+ // Acquire / poll the state of the push button
+ int i_buttonState = st_pushButton.read();
+
+ // Is the button down?
+ if (1 == i_buttonState)
+ {
+ // The button is not down, was the button down before?
+ // We need to see if the button is down for 10 milliseconds
+ // before we agree that the button is down
+ if (u16_buttonDownCount < 10)
+ {
+ if (10 == ++u16_buttonDownCount)
+ {
+ // The button has been held down long enough
+ MainHandleButtonDown();
+
+ // We want to have the one second timer restarted
+ b_restartOneSecondTimer = true;
+ }
+ }
+ }
+ else
+ {
+ // The button is not down so clear the down counter
+ u16_buttonDownCount = 0;
+ }
+
+ // See if there is inbouns serial data to be processed
+ MainCheckInbound();
+
+ // Indicate whether we are displaying the running information or not
+ return b_restartOneSecondTimer;
}
// ----------------------------------------------------------------------
@@ -58,26 +250,65 @@
// ----------------------------------------------------------------------
int main(void)
{
+ uint16_t u16_oneSecondCounter = 0;
+ bool b_restartOneSecondTimer = false;
+
// Perform local module initialization, if any
MainInit();
- // Start generating the putput test signal
+ // Initialize the generating of the output test signal module
TestOutputInit();
- // Start scanning the laser drive power
+ // Initialize the scanning of the the laser drive power module
ScanInputInit();
+ // Initialize the scanning of the TEC input and launch thread
+ TECInit();
+
// Display information about what signal pigs have what
- st_lcd.DisplayStringAt(1, LINE(1), (uint8_t *)pch_firstMessage, LEFT_MODE);
- st_lcd.DisplayStringAt(1, LINE(2), (uint8_t *)pch_secondMessage, LEFT_MODE);
+ st_lcd.DisplayStringAt(1, LINE(0), (uint8_t *)pch_firstMessage, LEFT_MODE);
+ st_lcd.DisplayStringAt(1, LINE(1), (uint8_t *)pch_secondMessage, LEFT_MODE);
+ st_lcd.DisplayStringAt(1, LINE(2), (uint8_t *)pch_thirdMessage, LEFT_MODE);
// Go in to a forever loop for the main thread which does nothing
while(true)
{
// Wait for 1 millisecond
wait_us(899);
+
+ // Instead of launching threads whose timing is a problem,
+ // we merely call the once-a-millisecond "thread" functions
+ // to drive the test signal out and the laser scan signal in
TestOutputThread();
- ScanInputThread();
+ ScanInputThread(b_allowPlotting);
+ b_restartOneSecondTimer = MainThread();
+ TECThread();
+
+ // Have we just started displaying collected information?
+ if (true == b_restartOneSecondTimer)
+ {
+ // Yes, so we will count down the timer
+ u16_oneSecondCounter = 1000;
+ }
+ else
+ {
+ // In case the one second timer is running, stop it
+ b_restartOneSecondTimer = 0;
+ }
+
+ // Is the one second counter running?
+ if (u16_oneSecondCounter > 0 && false == b_allowPlotting)
+ {
+ // Count down the one second timer and see if it's expired
+ if (0 == --u16_oneSecondCounter)
+ {
+ // Report the current values again
+ MainReportValues();
+
+ // Restart the one second timer
+ u16_oneSecondCounter = 1000;
+ }
+ }
}
}