LoRaWAN-SX1272-Application-24-31-9sec

Dependencies:   X_NUCLEO_IKS01A1 driver_mbed_TH02 LoRaWAN-lib-v1_0_1 SX1272Lib mbed

Fork of LoRaWAN-SX1272-Application-24-31-9sec by Oleh Zvonarov

app/LoRaEventProc.cpp

Committer:
ubhat
Date:
2017-04-06
Revision:
0:6cc76d70e2a1
Child:
2:19dd7bfcacf7

File content as of revision 0:6cc76d70e2a1:

/*
 / _____)             _              | |
( (____  _____ ____ _| |_ _____  ____| |__
 \____ \| ___ |    (_   _) ___ |/ ___)  _ \
 _____) ) ____| | | || |_| ____( (___| | | |
(______/|_____)_|_|_| \__)_____)\____)_| |_|
    (C)2015 Semtech

Description: Define events during Join, Tx & Rx
            Prepare TX packet by appending with appropriate application data

License: Revised BSD License, see LICENSE.TXT file include in the project

Maintainer: Uttam Bhat
*/

#include "LoRaEventProc.h"

/*!
 * Defines the application data transmission duty cycle
 */
uint32_t TxDutyCycleTime = APP_TX_DUTYCYCLE;

bool AppLed = 0;

uint8_t AppCase = 0;

/*!
 * \brief   Prepares the payload of the frame based on application port
 */
void PrepareLoRaFrame( uint8_t port )
{

    switch( port )
    {    
    case 5:
        {   
            uint8_t tmp;
            uint8_t tmpLength;
            uint8_t ptrIndex = 0;
            
            // Point the pointer to position index of Tx Buffer
            LoRaApp.ApplicationPtrPos( ptrIndex );

            tmp = ( AppLed != 0 ) ? 0x0F : 0x00;
            tmpLength = 1;
            
            LoRaApp.ApplicationAppendData( &tmp, tmpLength ); // Populate lower nibble of 0th Byte with LED state            

            /*!
            *  Generate Ramp data bytes
            *  Appends incremental values of 1 Byte each to TX buffer until Full
            */
            LoRaApp.ApplicationCall( AppRamp );

            break;
        }   

    case 8: 
        { 
            uint8_t ptrIndex = 0;
                        
            //Point the pointer to position index of Tx Buffer
            LoRaApp.ApplicationPtrPos( ptrIndex );                         
                        
            /*!
            *  Read Pressure
            *  Appends 2 Bytes to TX buffer
            */
            LoRaApp.ApplicationCall( AppPressr );
            
            /*!
            *  Read Temperature
            *  Appends 1 Byte to TX buffer
            */
            LoRaApp.ApplicationCall( AppTemp );
            
            /*!
            *  Read Humidity
            *  Appends 1 Byte to TX buffer
            */
            LoRaApp.ApplicationCall( AppHumid );

            /*!
            *  Read Accelerometer
            *  Appends 2 Bytes to TX buffer
            *   Value       Orientation
            *   0x99 0x00   horizontal + faceup
            *   0x66 0x00   horizontal + facedown
            *   0x00 0x11   vertical
            */
            LoRaApp.ApplicationCall( AppAccl ); // Generate Accelerometer data bytes    


            break;
        }
       
        // IKAS sensor using Cayenne Payload Format
        case 9: 
        { 
#ifdef USE_CAYENNE_LPP        
            uint8_t ptrIndex = 0;
            
            uint16_t AppSize = 0;
            
            uint8_t tmp[2] = {0};
            
            //Point the pointer to position index of Tx Buffer
            LoRaApp.ApplicationPtrPos( ptrIndex );
            
            AppCase = AppCase > 3 ? 0 : AppCase;
            
            while( 1 )
            {            
                switch( AppCase ) 
                {
                    case 0: 
                    {
                        tmp[0] = 0;
                        tmp[1] = 115; // Data Type PRESSURE: 115
                        LoRaApp.ApplicationAppendData( tmp, 2 );
                        
                        /*!
                        *  Read Pressure
                        *  Appends 2 Bytes to TX buffer
                        */
                        LoRaApp.ApplicationCall( AppPressr );
                        
                        AppSize += maxLPPsize[AppCase];

                        break;
                    }
                    
                    case 1: 
                    {
                        tmp[0] = 1;
                        tmp[1] = 103; // Data Type TEMP: 103
                        LoRaApp.ApplicationAppendData( tmp, 2 );
                    
                        /*!
                        *  Read Temperature
                        *  Appends 1 Byte to TX buffer
                        */
                        LoRaApp.ApplicationCall( AppTemp );
                        
                        AppSize += maxLPPsize[AppCase];

                        break;
                    }
                    
                    case 2: 
                    {
                        tmp[0] = 2;
                        tmp[1] = 104; // Data Type HUMIDITY: 103
                        LoRaApp.ApplicationAppendData( tmp, 2 );
                        
                        /*!
                        *  Read Humidity
                        *  Appends 1 Byte to TX buffer
                        */
                        LoRaApp.ApplicationCall( AppHumid );
                        
                        AppSize += maxLPPsize[AppCase];

                        break;
                    }
                    
                    case 3: 
                    {
                        tmp[0] = 3;
                        tmp[1] = 113; // Data Type Accl: 113
                        LoRaApp.ApplicationAppendData( tmp, 2 );
                        /*!
                        *  Read Accelerometer                        
                        */
                        LoRaApp.ApplicationCall( AppAccl ); // Generate Accelerometer data bytes
                        
                        AppSize += maxLPPsize[AppCase];

                        break;
                    }
                }
                
                AppCase++;
                
                if( AppSize + maxLPPsize[AppCase] > LORAWAN_APP_DATA_SIZE )
                {
                    break;
                }
            }
                        
            AppDataSize = AppSize;            
#endif
            break;
        }

    // Push-Button Demo     
    case 11: 
        { 
            uint8_t ptrIndex = 0;
            
            //Point the pointer to position index of Tx Buffer
            LoRaApp.ApplicationPtrPos( ptrIndex );
            
            LoRaApp.ApplicationCall( AppPushButton ); // Transmit uplink counter   
            
            break;
        }
    
    default:
        break;
    }
}


/*!
 * \brief   Sets Interrupt for next payload transmission
 */
void InitNextTxInterrupt( uint8_t port )
{   
    switch( port )
    {  
    /* GPS Application Demo
        Set Timer interrupt for next uplink
    */
    case 5:
        { 
        }

    /* Senet + M2X demo
    Set Timer interrupt for next uplink
    */
    case 6: 
        { 
            
        }
        
    /* Senet GPS Demo 
       Set Timer interrupt for next uplink
    */  
    case 7: 
        { 
            // Schedule next packet transmission
            TxDutyCycleTime = APP_TX_DUTYCYCLE + randr( -APP_TX_DUTYCYCLE_RND, APP_TX_DUTYCYCLE_RND );
            TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime );
            TimerStart( &TxNextPacketTimer );
            break;
        }

    /* Push Button Demo 
       Send Packet Immedietly if PC0 = GND
    */  
    case 11: 
        {             
            volatile bool PushButtonStatus;

            PushButtonStatus = UsrButton;
            
            if(PushButtonStatus == 0)
            {
                // Send Pkt immedietly if PC = GND
                DeviceState = DEVICE_STATE_SEND;
                NextTx = true;
            }
            else
            {
                // Keep polling
                IsTxIntUpdate = true;
            }
            
            break;
        }   

    /* Orientation Demo 
       Send Packet Immedietly if Mote is Vertical
    */  
    case 12: 
        {             
            CheckOrientation( );
            
            if(VerticalStatus == true)
            {
                // Send Pkt immedietly if PC = GND
                DeviceState = DEVICE_STATE_SEND;
                NextTx = true;
            }
            else
            {
                // Keep polling
                IsTxIntUpdate = true;
            }
            break;
        }   

    /* Compliance Test 
       Set Timer interrupt for next uplink
    */
    case 224:
        {               
            // Schedule next packet transmission
            TimerSetValue( &TxNextPacketTimer, COMPLIANCE_TX_DUTYCYCLE );
            TimerStart( &TxNextPacketTimer );
            break;
        }

    default:
        {
            // Schedule next packet transmission
            TimerSetValue( &TxNextPacketTimer, TxDutyCycleTime );
            TimerStart( &TxNextPacketTimer );
            break;
        }
    }

}

/*!
 * \brief   What to do during JOIN process ? blink/toggle LED etc.
 */
void JoinEvent( void )
{
    // CtrlLED is defined in LoRaBoardAppIf.h
    // param 1: LED color (Red, Yellow or Green)
    // param 2: LED_ON or LED_OFF
    //CtrlLED( Red, LED_ON ); 
}


/*!
 * \brief   What to do during TX ? blink/toggle LED etc.
 */
void TxEvent( void )
{
    int blinkTime = 25000;

    // Blink Red LED for 25msec
    //BlinkLED( Red, blinkTime );
}

void RxEvent()
{
    // Toggle yellow LED
    //ToggleLED( Yellow );  

    // If Rx Data is 0x01 turn on Green LED else if 0x0 Turn Green LED off
    if( LoRaMacDownlinkStatus.BufferSize == 1 )
    {       
        if( LoRaMacDownlinkStatus.Buffer[0] == 0x01 )
        {
            AppLed = 1;
        }
        else
        {
            if( LoRaMacDownlinkStatus.Buffer[0] == 0x00 )
            {
                AppLed = 0;
            }
        }
    }

    if( AppLed != 0 )
    {
        // Turn  USR_LED ON
        //UsrLED = 3.3;
    }
    else
    {
        // Turn  USR_LED OFF
        //UsrLED = 0;
    }
}