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

comms.h

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

    Header File for Communications Module

---------------------------------------------------------------------------*/
#ifndef _COMMS_H
#define _COMMS_H

#include "mbed.h"
#include "global.h"
#include "EthernetNetIf.h"
#include "UDPSocket.h"
#include "dnsresolve.h"
#include "BufferSys.h"
#include "gps.h"

// Definitions

// UDP output data size - includes header
#define COMMS_DATABUFF_HEADER   (4+4)
#define COMMS_DATABUFF_SIZE     ((LPF_OUTPUTS_SIZE*SAMPLE_SET_SIZE*8)+COMMS_DATABUFF_HEADER)

// UDP Control Buffer Size
#define COMMS_CNTRLBUFF_SIZE    (60)

// Number of seconds between each poll message
#define POLL_MSG_PERIOD         (6)

// default poll period in absence of 1PPS (mSec)
#define POLL_TIMEOUT            (10000)

// time to stop sending data if no commands are received
#define RUNNING_TIMEOUT         (30000)

//
//  Message Encoding
//
#define COMM_POLL_MSG               10
#define COMM_CMND_MSG               11
#define COMM_DATA_MSG               12
#define COMM_MSG_VERSION            1
#define COMM_MSG_SW_VERSION         1
#define COMM_MSG_HW_ID              1
#define COMM_MSG_REF_CLOCK          96000000
#define COMM_MSG_RF_MIXER           10125000
#define COMM_MSG_SAMPLE_CLOCK       13500000
#define COMM_MSG_SAMPLE_DIVIDER     (384*64)
#define COMM_MSG_NAME               "QRSS_proto"
#define COMM_MSGNAME_LEN            10

#define COMM_CMND_MSG_LENGTH        (5*4)

// Macros

//
// Classes
//

//---------------------------------------------------------------------------
//
//  Communications Class
//
class TCommunications
{
    // create/destroy
    public:
        TCommunications() :
            EthernetUpLED( LED2 ),
            RunningLED( LED4 )
            {}
        ~TCommunications() 
            {}

    // Local Types - state machine state
    typedef enum {
        ST_START_ETH,
        ST_POLL_SERVER,
        ST_RUNNING
        } TCommsStates;

    // API
    public:
        // Initialisation
        void Init();

        // Set up Server DNS name
        void SetServer( char *szNm )
            { 
                strncpy( szServerName, szNm, sizeof(szServerName) ); 
                szServerName[sizeof(szServerName)-1] = 0;   // place terminator at end incase name was too long
            }

        // Processing routine
        void Poll();

        //  RecordPPSTimestamps Method
        //      Records timestamps of events (1PPS or capture of LO divider)
        void RecordPPSTimestamps( uint32_t uiPPSCapture, uint32_t uiLOscCapture, 
                                  TGPSController::TGPSData &GPSInfo );

        // Test if comms is ready for sample data (ie in RUNNING state)
        bool Running()
            { return (eState==ST_RUNNING); }

        // Return NCO Inc setting received
        uint32_t NCOPhaseInc()
            { return uiNCOPhaseInc; }

        // Return Test Mode setting received
        uint32_t TestMode()
            { return uiTestModeInc; }

        //  Pass sample data for sending. Send when buffer is full
        void SendSamples( uint32_t uiTimestamp, TDataSample sSample );


    // Private methods
    private:
        // Callback for incoming UDP data
        void onUDPSocketEvent( UDPSocketEvent evnt );

        // Send a UDP Poll Message
        bool SendPollMessage();

        // Place a word into a buffer - network byte order
       void WriteWord( uint8_t * &pucBuff, int32_t iWord, int &iLn )
            {
                *pucBuff = (uint8_t)(iWord>>24);
                pucBuff++;
                *pucBuff = (uint8_t)(iWord>>16);
                pucBuff++;
                *pucBuff = (uint8_t)(iWord>>8);
                pucBuff++;
                *pucBuff = (uint8_t)(iWord>>0);
                pucBuff++;
                iLn += 4;
            }

        // Read a word from a buffer - network byte order
       uint32_t ReadWord( uint8_t * pucBuff )
            { return (0x1000000*pucBuff[0]) | (0x10000*pucBuff[1]) | (0x100*pucBuff[2]) | (pucBuff[3]); }

    // data
    private:
        // LEDs
        DigitalOut EthernetUpLED;
        DigitalOut RunningLED;

        // State machine state
        TCommsStates    eState;

        // Ethernet Interface
        EthernetNetIf   eth;
        
        // UDP Socket for comms
        char            szServerName[50];
        UDPSocket       ServerSocket;
        Host            MyPort;
        Host            ServerPort;
        IpAddr          ServerAddr;
        
        // DNS lookup
        DNSResolver     dnsService;
        
        // Host Details
        
        // Output buffers - word align this buffer
        uint32_t        auiDataBuffer[(COMMS_DATABUFF_SIZE/4)+8];   // the buffer - defined as words to ensure alignment
        uint8_t        *pucBuffDataPtr;     // buffer pointer - as a byte pointer
        int             iBufferCount;       // byte count

        // Incoming UDP Data
        uint32_t        uiCommand;
        uint32_t        uiNCO;
        uint32_t        uiTestOsc;
        bool            bGotCmnd;

        // PPS Timer Event Counter
        int             iPPSCount;
    
        // Send Poll Message timer
        Timer           PollTimer;
        Timer           CommandTimer;
        
        // Timer Capture Data - queue of 8 captures. [0] is the most recent
        uint32_t        auiPPSCaptures[8];
        uint32_t        auiLOscCaptures[8];

        // Last GPS info        
        TGPSController::TGPSData    LastGPSInfo;
        
        // data from the command packet
        uint32_t        uiNCOPhaseInc;
        uint32_t        uiTestModeInc;

};

// declare the Communications module
extern TCommunications Comms;

#endif

//---------------------------------------------------------------------------
//  END
//---------------------------------------------------------------------------