add rotary

Dependencies:   X_NUCLEO_IKS01A1 LoRaWAN-lib SX1272Lib mbed

Fork of Canada-SX1272-LoRaWAN-Bootcamp by Uttam Bhat

LoRaWAN-SX1272-Mbed-Shield


Overview

LoRaWAN-SX1272-Mbed-Shield application demo is a LoRaWAN Class-A device example project using LoRaWAN-lib and SX1272Lib libraries that send out sensors data.

Prerequisites

1. NUCLEO_L152RE board.
2. SX1272-mbed-shield board.
3. X-NUCLEO-IKS01A1.
4. Grove Red LED.
5. Grove Button.
6. Grove Rotary Angle Sensor.
7. mbed online compiler.
8. Tera Term.

Hardware Configuration

Application 8, 9, 11
1. Connect NUCLEO_L152RE with X-NUCLEO-IKS01A1.
2. On top of X-NUCLEO-IKS01A1, connect SX1272-mbed-shield.
Application 13
1. Connect NUCLEO_L152RE with SX1272-mbed-shield.
2. Connect Grove Red LED with DIO_D6 port on SX1272-mbed-shield.
3. Connect Grove Button with DIO_D8 port on SX1272-mbed-shield.
4. Connect Grove Rotary Angle Sensor with ANA_A1 port SX1272-mbed-shield.

Software Configuration

The end-device must be configured with the following parameters:

  • Commissioning.h
    • Activation Type: OTA or ABP
      • OTA: #define OVER_THE_AIR_ACTIVATION 1
    • Network Type: Public or Private
      • Public: #define LORAWAN_PUBLIC_NETWORK true
    • LORAWAN_DEVICE_EUI (8 Bytes) : Fist 3 Bytes is the Organizationally Unique Identifier (OUI) followed by 5 bytes of unique ID. If not defined by user, then the firmware automatically assigns one to the end-device. (For OTA)
      • #define IEEE_OUI 0x00, 0x00, 0x00
      • #define LORAWAN_DEVICE_EUI { IEEE_OUI, 0x00, 0x00, 0x00, 0x00, 0x00 }
    • LORAWAN_APPLICATION_EUI (8 Bytes) (For OTA)
      • #define LORAWAN_APPLICATION_EUI { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }
    • LORAWAN_APPLICATION_KEY (16 Bytes) (For OTA)
      • #define LORAWAN_APPLICATION_KEY { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }
    • LORAWAN_DEVICE_ADDRESS (For ABP)
      • #define LORAWAN_DEVICE_ADDRESS ( uint32_t )0x0
    • LORAWAN_NWKSKEY (For ABP)
      • #define LORAWAN_NWKSKEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
    • LORAWAN_APPSKEY (For ABP)
      • #define LORAWAN_APPSKEY { 0x2B, 0x7E, 0x15, 0x16, 0x28, 0xAE, 0xD2, 0xA6, 0xAB, 0xF7, 0x15, 0x88, 0x09, 0xCF, 0x4F, 0x3C }
  • Configure.h
    • Communication Type: Hybrid or FHSS
      • Hybrid: #define USE_BAND_915_HYBRID
    • Join request Period:
      • 5 sec: #define OVER_THE_AIR_ACTIVATION_DUTYCYCLE 5000000 value in us
    • TX Period:
      • 5 sec: #define APP_TX_DUTYCYCLE 5000000 value in us
    • Uplink message: Confirmed or Unconfirmed
      • Confirmed: #define LORAWAN_CONFIRMED_MSG_ON 1
    • ADR(Adaptive Data Rate): ON or OFF
      • OFF: #define LORAWAN_ADR_ON 0
    • Default data rate: DR_0 or DR_1 or DR_2 or DR_3 or DR_4
      • DR_0: #define LORAWAN_DEFAULT_DATARATE DR_0
    • Application Type: 8 (IKS01A1) or 9 (IKS01A1+Cayenne) or 11 (Push Button) or 13 (rotary+Cayenne)
      • 9: #define LORAWAN_APP_PORT 9
    • Tx Power: 10 to 30
      • 20 dBm: #define LORAWAN_TX_POWER TX_POWER_20_DBM

Serial Terminal Display

  • Use Tera Term to see the sending message (baud rate: 115200):
    • button = 0 (if not press) button = 1 (if pressed)
    • rotary = 0 ~ 300

1800

app/LoRaMacLayerService.cpp

Committer:
ubhat
Date:
2017-04-06
Revision:
0:6cc76d70e2a1
Child:
2:5859f5872d6c

File content as of revision 0:6cc76d70e2a1:

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

Description: MAC Layer Services: MLME & MCPS

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

Maintainer: Uttam Bhat
*/

#include "LoRaMacLayerService.h"

/*!
 * \brief   MCPS-Confirm event function
 *
 * \param   [IN] McpsConfirm - Pointer to the confirm structure,
 *               containing confirm attributes.
 */
void McpsConfirm( McpsConfirm_t *McpsConfirm )
{
    if( McpsConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
    {
        switch( McpsConfirm->McpsRequest )
        {
            case MCPS_UNCONFIRMED:
            {
                // Check Datarate
                // Check TxPower
                break;
            }
            case MCPS_CONFIRMED:
            {
                // Check Datarate
                // Check TxPower
                // Check AckReceived
                // Check NbRetries
                LoRaMacUplinkStatus.Acked = McpsConfirm->AckReceived;
                break;
            }
            case MCPS_PROPRIETARY:
            {
                break;
            }
            default:
                break;
        }        
    }

    LoRaMacUplinkStatus.Datarate = McpsConfirm->Datarate;
    LoRaMacUplinkStatus.UplinkCounter = McpsConfirm->UpLinkCounter;
    LoRaMacUplinkStatus.TxPower = McpsConfirm->TxPower;

    IsTxIntUpdate = true;
}

/*!
 * \brief   MCPS-Indication event function
 *
 * \param   [IN] McpsIndication - Pointer to the indication structure,
 *               containing indication attributes.
 */
void McpsIndication( McpsIndication_t *McpsIndication )
{
    uint8_t port;

    if( McpsIndication->Status != LORAMAC_EVENT_INFO_STATUS_OK )
    {
        return;
    }

    switch( McpsIndication->McpsIndication )
    {
        case MCPS_UNCONFIRMED:
        {
            break;
        }
        case MCPS_CONFIRMED:
        {
            break;
        }
        case MCPS_PROPRIETARY:
        {
            break;
        }
        case MCPS_MULTICAST:
        {
            break;
        }
        default:
            break;
    }

    // Check Multicast
    // Check Port
    // Check Datarate
    // Check FramePending
    // Check Buffer
    // Check BufferSize
    // Check Rssi
    // Check Snr
    // Check RxSlot
    LoRaMacDownlinkStatus.Rssi = McpsIndication->Rssi;
    if( McpsIndication->Snr & 0x80 ) // The SNR sign bit is 1
    {
        // Invert and divide by 4
        LoRaMacDownlinkStatus.Snr = ( ( ~McpsIndication->Snr + 1 ) & 0xFF ) >> 2;
        LoRaMacDownlinkStatus.Snr = -LoRaMacDownlinkStatus.Snr;
    }
    else
    {
        // Divide by 4
        LoRaMacDownlinkStatus.Snr = ( McpsIndication->Snr & 0xFF ) >> 2;
    }
    LoRaMacDownlinkStatus.DownlinkCounter++;
    LoRaMacDownlinkStatus.RxData = McpsIndication->RxData;      
    LoRaMacDownlinkStatus.Port = McpsIndication->Port;
    LoRaMacDownlinkStatus.Buffer = McpsIndication->Buffer;
    LoRaMacDownlinkStatus.BufferSize = McpsIndication->BufferSize;
    LoRaMacDownlinkStatus.RxSlot = McpsIndication->RxSlot;

    if( ComplianceTest.Running == 1 )
    {
        port = 224;
        ComplianceTest.DownLinkCounter++;
    }
    else
    {
        port = McpsIndication->Port;
    }
    
    if( McpsIndication->RxData == true )
    {
        switch( port )
        {
        case 1: // The application LED can be controlled on port 1 or 2
        case 2:            
            break;
        case 224:
            PrepareComplianceTestFrame( McpsIndication );            
            break;
        default:
            break;
        }
    }

    IsRxUpdate = true;

}

/*!
 * \brief   MLME-Confirm event function
 *
 * \param   [IN] MlmeConfirm - Pointer to the confirm structure,
 *               containing confirm attributes.
 */
void MlmeConfirm( MlmeConfirm_t *MlmeConfirm )
{
    if( MlmeConfirm->Status == LORAMAC_EVENT_INFO_STATUS_OK )
    {
        switch( MlmeConfirm->MlmeRequest )
        {
            case MLME_JOIN:
            {
                // Status is OK, node has joined the network
                IsNetworkJoinedStatusUpdate = true;
                break;
            }
            case MLME_LINK_CHECK:
            {
                // Check DemodMargin
                // Check NbGateways
                if( ComplianceTest.Running == true )
                {
                    ComplianceTest.LinkCheck = true;
                    ComplianceTest.DemodMargin = MlmeConfirm->DemodMargin;
                    ComplianceTest.NbGateways = MlmeConfirm->NbGateways;
                }
                break;
            }
            default:
                break;
        }
    }

    // Schedule next packet transmission
    TimerSetValue( &TxNextPacketTimer, OVER_THE_AIR_ACTIVATION_DUTYCYCLE );
    TimerStart( &TxNextPacketTimer );

    DeviceState = DEVICE_STATE_SLEEP;
}