QRSS Rx Network receiver. A receiver to sample a segment of RF spectrum and send this data to a server for further processing and display. NXP mbed Design Challenge entry (Honorable Mention). Published in Circuit Cellar, Feb 2012
Dependencies: NetServices mbed DNSResolver
main.cpp
- Committer:
- claytong
- Date:
- 2012-01-25
- Revision:
- 0:82ff15078322
File content as of revision 0:82ff15078322:
/*--------------------------------------------------------------------------- QRSS Receiver Application by Clayton ZL3TKA/VK1TKA clayton@isnotcrazy.com main function ---------------------------------------------------------------------------*/ // include files #include "mbed.h" #include "global.h" #include "EthernetNetIf.h" #include "UDPSocket.h" #include "dnsresolve.h" #include "gps.h" #include "BufferSys.h" #include "I2S_Rx.h" #include "DSP.h" #include "comms.h" // Definitions // Macros // Local Data // Global Data // Serial port interface to the PC Serial pc( USBTX, USBRX ); // LEDs DigitalOut OnLED( LED1 ); // IO DigitalOut TestOscillator( p21 ); #define TESTOSC_ON 0 #define TESTOSC_OFF 1 // The Buffer pool for audio data TBufferPool BufferPool; // The array of buffers for the pool TBufferData BufferDataArray[NUM_OF_BUFFERS]; // I2S Object TI2SReceiver AudioInput( BufferPool ); // Communications Object TCommunications Comms; // Function Prototypes //--------------------------------------------------------------------------- // MAIN //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // // Main start routine // Just starts everything running // int main() { TDSPProcessor ADCBuffer; uint32_t uiCurrentTestmode = 0x1234; // Set up IOs OnLED = 1; TestOscillator = TESTOSC_OFF; // Set up PC port pc.baud( 38400 ); // Report printf( "\r\n\r\nQRSS_Rx Application running\r\n" ); printf( "Built " __DATE__ " " __TIME__ "\r\n" ); printf( "System Core Clock = %ld\r\n", SystemCoreClock ); // Add array of buffers to the pool pc.printf ("Setting up buffer pool with %d buffer of %d samples ...", NUM_OF_BUFFERS, BUFFERSYS_SIZE ); BufferPool.AddNewMsgsToPool( BufferDataArray, NUM_OF_BUFFERS ); printf (" OK\r\n"); // Set up audio receiver pc.printf ("Initialise the I2S Receiver ..."); AudioInput.Init(); printf (" OK\r\n"); // Set up GPS pc.printf ("Initialise GPS ..."); GPSModule.Init(); printf (" OK\r\n"); // Set up communications pc.printf ("Initialise Communications ..."); Comms.Init(); Comms.SetServer( "192.168.0.15" ); // default QRSS Server Address (could be a DNS name) printf (" OK\r\n"); ADCBuffer.NCOFrequency( TEST_NCO_FREQ ); // echo GPS data out the PC port while(1) { // Poll the sub-systems Net::poll(); GPSModule.Poll(); Comms.Poll(); // Handle Comms Mode if ( Comms.Running() ) { // online comms if ( !AudioInput.Running() ) { printf( "Starting Processing\r\n" ); ADCBuffer.NCOPhaseInc( Comms.NCOPhaseInc() ); AudioInput.Start(); } // process and output any received samples if ( !AudioInput.Empty() ) { // ADC buffer will be automatically released AudioInput.Read( ADCBuffer ); // Mix the LO ADCBuffer.MixLO(); // Filter the result ADCBuffer.LPF(); // Output the data to the comms module for ( int ii=0; ii<8; ii++ ) Comms.SendSamples( ADCBuffer.Timestamp(), ADCBuffer.FilteredOutput(ii) ); } } else { // offline comms if ( AudioInput.Running() ) { AudioInput.Stop(); printf( "Stopping Processing\r\n" ); } if ( !AudioInput.Empty() ) { // discard messages AudioInput.Read( ADCBuffer ); ADCBuffer.Release(); } } // Handle Test Modes if ( Comms.TestMode()!=uiCurrentTestmode ) { uiCurrentTestmode = Comms.TestMode(); if ( uiCurrentTestmode!=0 ) { // enable test Osc printf( "Turn ON Test Osc\r\n" ); TestOscillator = TESTOSC_ON; } else { // disable test Osc printf( "Turn OFF Test Osc\r\n" ); TestOscillator = TESTOSC_OFF; } } // Process Keystrokes - debug only if( pc.readable() ) { int iCharIn = pc.getc(); switch ( iCharIn ) { case'1': printf( "Turn on Test Osc\r\n" ); TestOscillator = TESTOSC_ON; break; case '2': printf( "Turn off Test Osc\r\n" ); TestOscillator = TESTOSC_OFF; break; case '7': printf( "AudioInput Start\r\n" ); AudioInput.Start(); break; case '8': printf( "AudioInput Stop\r\n" ); AudioInput.Stop(); break; case '9': AudioInput.Report(); break; case 'x': ADCBuffer.NCOFrequency( 15000 ); break; case 'y': ADCBuffer.NCOFrequency( -15000 ); break; case 'z': ADCBuffer.NCOFrequency( 15600 ); break; } } } } //--------------------------------------------------------------------------- // END //---------------------------------------------------------------------------