From bd337aced3b1888373030878bf1a49367bc37ab5 Mon Sep 17 00:00:00 2001
From: Dean Camera <dean@fourwalledcubicle.com>
Date: Wed, 20 Oct 2010 07:39:11 +0000
Subject: [PATCH] Added default test tone generation mode to the Device mode
 AudioInput demos.

---
 .../ClassDriver/AudioInput/AudioInput.c       | 33 ++++++++++++++-----
 .../ClassDriver/AudioInput/AudioInput.h       |  1 +
 .../ClassDriver/AudioInput/AudioInput.txt     | 16 ++++++---
 Demos/Device/ClassDriver/AudioInput/makefile  |  1 +
 Demos/Device/LowLevel/AudioInput/AudioInput.c | 29 ++++++++++++----
 Demos/Device/LowLevel/AudioInput/AudioInput.h |  1 +
 .../Device/LowLevel/AudioInput/AudioInput.txt | 16 ++++++---
 Demos/Device/LowLevel/AudioInput/makefile     |  1 +
 LUFA/ManPages/ChangeLog.txt                   |  1 +
 LUFA/ManPages/FutureChanges.txt               |  5 +--
 10 files changed, 78 insertions(+), 26 deletions(-)

diff --git a/Demos/Device/ClassDriver/AudioInput/AudioInput.c b/Demos/Device/ClassDriver/AudioInput/AudioInput.c
index dc7a076e4..54e70f6b1 100644
--- a/Demos/Device/ClassDriver/AudioInput/AudioInput.c
+++ b/Demos/Device/ClassDriver/AudioInput/AudioInput.c
@@ -82,9 +82,10 @@ void SetupHardware(void)
 
 	/* Hardware Initialization */
 	LEDs_Init();
-	USB_Init();
+	Buttons_Init();
 	ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32);
 	ADC_SetupChannel(MIC_IN_ADC_CHANNEL);
+	USB_Init();
 
 	/* Start the ADC conversion in free running mode */
 	ADC_StartReading(ADC_REFERENCE_AVCC | ADC_RIGHT_ADJUSTED | MIC_IN_ADC_MUX_MASK);
@@ -100,15 +101,29 @@ void ProcessNextSample(void)
 	{
 		/* Clear the sample reload timer compare flag, ready for the next interval */
 		TIFR0 |= (1 << OCF0A);
-
-		/* Audio sample is ADC value scaled to fit the entire range */
-		int16_t AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult());
-
-		#if defined(MICROPHONE_BIASED_TO_HALF_RAIL)
-		/* Microphone is biased to half rail voltage, subtract the bias from the sample value */
-		AudioSample -= (SAMPLE_MAX_RANGE / 2);
+		
+		int16_t AudioSample;
+
+		#if defined(USE_TEST_TONE)
+			static uint8_t SquareWaveSampleCount;
+			static int16_t CurrentWaveValue;
+			
+			/* In test tone mode, generate a square wave at 1/256 of the sample rate */
+			if (SquareWaveSampleCount++ == 0xFF)
+			  CurrentWaveValue ^= 0x8000;
+			
+			/* Only generate audio if the board button is being pressed */
+			AudioSample = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? CurrentWaveValue : 0;
+		#else
+			/* Audio sample is ADC value scaled to fit the entire range */
+			AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult());
+
+			#if defined(MICROPHONE_BIASED_TO_HALF_RAIL)
+			/* Microphone is biased to half rail voltage, subtract the bias from the sample value */
+			AudioSample -= (SAMPLE_MAX_RANGE / 2);
+			#endif
 		#endif
-
+		
 		Audio_Device_WriteSample16(&Microphone_Audio_Interface, AudioSample);
 	}
 }
diff --git a/Demos/Device/ClassDriver/AudioInput/AudioInput.h b/Demos/Device/ClassDriver/AudioInput/AudioInput.h
index 8ed6096f0..741a091d0 100644
--- a/Demos/Device/ClassDriver/AudioInput/AudioInput.h
+++ b/Demos/Device/ClassDriver/AudioInput/AudioInput.h
@@ -44,6 +44,7 @@
 
 		#include <LUFA/Version.h>
 		#include <LUFA/Drivers/Board/LEDs.h>
+		#include <LUFA/Drivers/Board/Buttons.h>
 		#include <LUFA/Drivers/Peripheral/ADC.h>
 		#include <LUFA/Drivers/USB/USB.h>
 		#include <LUFA/Drivers/USB/Class/Audio.h>
diff --git a/Demos/Device/ClassDriver/AudioInput/AudioInput.txt b/Demos/Device/ClassDriver/AudioInput/AudioInput.txt
index 830163f3b..fea31b66e 100644
--- a/Demos/Device/ClassDriver/AudioInput/AudioInput.txt
+++ b/Demos/Device/ClassDriver/AudioInput/AudioInput.txt
@@ -50,11 +50,13 @@
  *  basic USB Audio 1.0 drivers in all modern OSes (i.e. no special drivers
  *  required).
  *
- *  On start-up the system will automatically enumerate and function
- *  as a USB microphone. Incoming audio from the ADC channel 1 will
- *  be sampled and sent to the host computer.
+ *  On start-up the system will automatically enumerate and function as a 
+ *  USB microphone. By default, the demo will produce a square wave test tone
+ *  when the board button is pressed. If USE_TEST_TONE is not defined in the
+ *  project makefile, incoming audio from the ADC channel 1 will be sampled
+ *  and sent to the host computer instead.
  *
- *  To use, connect a microphone to the ADC channel 1.
+ *  When in microphone mode, connect a microphone to the ADC channel 2.
  *
  *  Under Windows, if a driver request dialogue pops up, select the option
  *  to automatically install the appropriate drivers.
@@ -70,6 +72,12 @@
  *    <td><b>Description:</b></td>
  *   </tr>
  *   <tr>
+ *    <td>USE_TEST_TONE</td>
+ *    <td>Makefile LUFA_OPTS</td>
+ *    <td>When defined, this alters the demo to produce a square wave test tone when the first board button is pressed
+ *        instead of sampling the board microphone.</td>
+ *   </tr>
+ *   <tr>
  *    <td>MICROPHONE_BIASED_TO_HALF_RAIL</td>
  *    <td>Makefile LUFA_OPTS</td>
  *    <td>When defined, this alters the demo so that the half VCC bias of the microphone input is subtracted.</td>
diff --git a/Demos/Device/ClassDriver/AudioInput/makefile b/Demos/Device/ClassDriver/AudioInput/makefile
index 8eda3c68b..3c26c97ed 100644
--- a/Demos/Device/ClassDriver/AudioInput/makefile
+++ b/Demos/Device/ClassDriver/AudioInput/makefile
@@ -123,6 +123,7 @@ LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 LUFA_OPTS += -D MICROPHONE_BIASED_TO_HALF_RAIL
+LUFA_OPTS += -D USE_TEST_TONE
 
 
 # Create the LUFA source path variables by including the LUFA root makefile
diff --git a/Demos/Device/LowLevel/AudioInput/AudioInput.c b/Demos/Device/LowLevel/AudioInput/AudioInput.c
index a984a2ab8..e681f3bd1 100644
--- a/Demos/Device/LowLevel/AudioInput/AudioInput.c
+++ b/Demos/Device/LowLevel/AudioInput/AudioInput.c
@@ -68,6 +68,7 @@ void SetupHardware(void)
 
 	/* Hardware Initialization */
 	LEDs_Init();
+	Buttons_Init();
 	ADC_Init(ADC_FREE_RUNNING | ADC_PRESCALE_32);
 	ADC_SetupChannel(MIC_IN_ADC_CHANNEL);
 	USB_Init();
@@ -164,13 +165,27 @@ void USB_Audio_Task(void)
 		/* Clear the sample reload timer */
 		TIFR0 |= (1 << OCF0A);
 
-		/* Audio sample is ADC value scaled to fit the entire range */
-		int16_t AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult());
-
-		#if defined(MICROPHONE_BIASED_TO_HALF_RAIL)
-		/* Microphone is biased to half rail voltage, subtract the bias from the sample value */
-		AudioSample -= (SAMPLE_MAX_RANGE / 2);
-		#endif
+		int16_t AudioSample;
+
+		#if defined(USE_TEST_TONE)
+			static uint8_t SquareWaveSampleCount;
+			static int16_t CurrentWaveValue;
+			
+			/* In test tone mode, generate a square wave at 1/256 of the sample rate */
+			if (SquareWaveSampleCount++ == 0xFF)
+			  CurrentWaveValue ^= 0x8000;
+			
+			/* Only generate audio if the board button is being pressed */
+			AudioSample = (Buttons_GetStatus() & BUTTONS_BUTTON1) ? CurrentWaveValue : 0;
+		#else
+			/* Audio sample is ADC value scaled to fit the entire range */
+			AudioSample = ((SAMPLE_MAX_RANGE / ADC_MAX_RANGE) * ADC_GetResult());
+
+			#if defined(MICROPHONE_BIASED_TO_HALF_RAIL)
+			/* Microphone is biased to half rail voltage, subtract the bias from the sample value */
+			AudioSample -= (SAMPLE_MAX_RANGE / 2);
+			#endif		
+		#end if
 
 		/* Write the sample to the buffer */
 		Endpoint_Write_Word_LE(AudioSample);
diff --git a/Demos/Device/LowLevel/AudioInput/AudioInput.h b/Demos/Device/LowLevel/AudioInput/AudioInput.h
index 53b63517b..dfad137d7 100644
--- a/Demos/Device/LowLevel/AudioInput/AudioInput.h
+++ b/Demos/Device/LowLevel/AudioInput/AudioInput.h
@@ -47,6 +47,7 @@
 		#include <LUFA/Version.h>
 		#include <LUFA/Drivers/USB/USB.h>
 		#include <LUFA/Drivers/Board/LEDs.h>
+		#include <LUFA/Drivers/Board/Buttons.h>
 		#include <LUFA/Drivers/Peripheral/ADC.h>
 
 	/* Macros: */
diff --git a/Demos/Device/LowLevel/AudioInput/AudioInput.txt b/Demos/Device/LowLevel/AudioInput/AudioInput.txt
index 39d78e784..fea31b66e 100644
--- a/Demos/Device/LowLevel/AudioInput/AudioInput.txt
+++ b/Demos/Device/LowLevel/AudioInput/AudioInput.txt
@@ -50,11 +50,13 @@
  *  basic USB Audio 1.0 drivers in all modern OSes (i.e. no special drivers
  *  required).
  *
- *  On start-up the system will automatically enumerate and function
- *  as a USB microphone. Incoming audio from the ADC channel 1 will
- *  be sampled and sent to the host computer.
+ *  On start-up the system will automatically enumerate and function as a 
+ *  USB microphone. By default, the demo will produce a square wave test tone
+ *  when the board button is pressed. If USE_TEST_TONE is not defined in the
+ *  project makefile, incoming audio from the ADC channel 1 will be sampled
+ *  and sent to the host computer instead.
  *
- *  To use, connect a microphone to the ADC channel 2.
+ *  When in microphone mode, connect a microphone to the ADC channel 2.
  *
  *  Under Windows, if a driver request dialogue pops up, select the option
  *  to automatically install the appropriate drivers.
@@ -70,6 +72,12 @@
  *    <td><b>Description:</b></td>
  *   </tr>
  *   <tr>
+ *    <td>USE_TEST_TONE</td>
+ *    <td>Makefile LUFA_OPTS</td>
+ *    <td>When defined, this alters the demo to produce a square wave test tone when the first board button is pressed
+ *        instead of sampling the board microphone.</td>
+ *   </tr>
+ *   <tr>
  *    <td>MICROPHONE_BIASED_TO_HALF_RAIL</td>
  *    <td>Makefile LUFA_OPTS</td>
  *    <td>When defined, this alters the demo so that the half VCC bias of the microphone input is subtracted.</td>
diff --git a/Demos/Device/LowLevel/AudioInput/makefile b/Demos/Device/LowLevel/AudioInput/makefile
index 1b7fd07a3..15ceba7a4 100644
--- a/Demos/Device/LowLevel/AudioInput/makefile
+++ b/Demos/Device/LowLevel/AudioInput/makefile
@@ -123,6 +123,7 @@ LUFA_OPTS += -D USE_FLASH_DESCRIPTORS
 LUFA_OPTS += -D USE_STATIC_OPTIONS="(USB_DEVICE_OPT_FULLSPEED | USB_OPT_REG_ENABLED | USB_OPT_AUTO_PLL)"
 
 LUFA_OPTS += -D MICROPHONE_BIASED_TO_HALF_RAIL
+LUFA_OPTS += -D USE_TEST_TONE
 
 
 # Create the LUFA source path variables by including the LUFA root makefile
diff --git a/LUFA/ManPages/ChangeLog.txt b/LUFA/ManPages/ChangeLog.txt
index 0d62d0d1a..0dbdde5d9 100644
--- a/LUFA/ManPages/ChangeLog.txt
+++ b/LUFA/ManPages/ChangeLog.txt
@@ -27,6 +27,7 @@
   *  - Added board hardware driver support for the Blackcat USB JTAG board (thanks to the PSGroove team)
   *  - Added board hardware driver support for the Maximus board (thanks to the PSGroove team)
   *  - Added board hardware driver support for the Minimus board (thanks to the PSGroove team)
+  *  - Added default test tone generation mode to the Device mode AudioInput demos
   *
   *  <b>Changed:</b>
   *  - Removed complicated logic for the Endpoint_ConfigureEndpoint() function to use inlined or function called versions
diff --git a/LUFA/ManPages/FutureChanges.txt b/LUFA/ManPages/FutureChanges.txt
index 15d5df492..4ff2e2a70 100644
--- a/LUFA/ManPages/FutureChanges.txt
+++ b/LUFA/ManPages/FutureChanges.txt
@@ -7,7 +7,7 @@
  /** \page Page_FutureChanges Future Changes
   *
   *  Below is a list of future changes which are proposed for the LUFA library, but not yet started/complete.
-  *  This gives an unordered list of future changes which will be available in future releases of the library.
+  *  This gives an unordered list of future changes which may be available in future releases of the library.
   *  If you have an item to add to this list, please contact the library author via email, the LUFA mailing list,
   *  or post your suggestion as an enhancement request to the project bug tracker.
   *
@@ -18,9 +18,10 @@
   *      -# Add ability to get number of bytes not written with pipe/endpoint write routines after an error
   *      -# Change makefiles to allow for absolute LUFA location to be used
   *      -# Re-add interrupt Pipe/Endpoint support
-  *      -# Fix intermittent device mode enumeration errors
   *      -# Add HID report macros to make HID report editing easier
   *      -# Add endpoint/pipe bank kill macros
+  *      -# Investigate dynamically created device descriptors
+  *      -# Add new event for EVENT_USB_Device_ControlRequest() fired before the internal library request handlers
   *  - Documentation/Support
   *      -# Add detailed overviews of how each demo works
   *      -# Add board overviews
-- 
GitLab