mQ Branch for NA mote testing

Dependencies:   LoRaWAN-lib SX1272Lib-mQ lib_gps lib_mma8451q lib_mpl3115a2 mbed

Fork of LoRaWAN-NAMote72-Application-Demo by Semtech

Committer:
mluis
Date:
Mon Apr 24 13:47:27 2017 +0000
Revision:
18:18408c3c2d0c
Parent:
6:f8194e691dd4
WARNING: Radio API timings changed from micro-seconds to milliseconds; ; Synchronized with https://github.com/Lora-net/LoRaMac-node git revision e506c246652fa44c3f24cecb89d0707b49ece739; Updated all libraries to the latest versions

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ubhat 0:69f2e28d12c1 1 /*
ubhat 0:69f2e28d12c1 2 / _____) _ | |
ubhat 0:69f2e28d12c1 3 ( (____ _____ ____ _| |_ _____ ____| |__
ubhat 0:69f2e28d12c1 4 \____ \| ___ | (_ _) ___ |/ ___) _ \
ubhat 0:69f2e28d12c1 5 _____) ) ____| | | || |_| ____( (___| | | |
ubhat 0:69f2e28d12c1 6 (______/|_____)_|_|_| \__)_____)\____)_| |_|
ubhat 0:69f2e28d12c1 7 (C)2015 Semtech
ubhat 0:69f2e28d12c1 8
ubhat 0:69f2e28d12c1 9 Description: Target board general functions implementation
ubhat 0:69f2e28d12c1 10
ubhat 0:69f2e28d12c1 11 License: Revised BSD License, see LICENSE.TXT file include in the project
ubhat 0:69f2e28d12c1 12
ubhat 0:69f2e28d12c1 13 Maintainer: Miguel Luis and Gregory Cristian
ubhat 0:69f2e28d12c1 14 */
ubhat 0:69f2e28d12c1 15 #include "mbed.h"
ubhat 0:69f2e28d12c1 16 #include "board.h"
ubhat 0:69f2e28d12c1 17
mluis 18:18408c3c2d0c 18 /*!
mluis 18:18408c3c2d0c 19 * Unique Devices IDs register set ( STM32 )
mluis 18:18408c3c2d0c 20 */
mluis 18:18408c3c2d0c 21 #define ID1 ( 0x1FF800D0 )
mluis 18:18408c3c2d0c 22 #define ID2 ( 0x1FF800D4 )
mluis 18:18408c3c2d0c 23 #define ID3 ( 0x1FF800E4 )
ubhat 0:69f2e28d12c1 24
ubhat 0:69f2e28d12c1 25 DigitalOut RedLed( PB_1 ); // Active Low
ubhat 0:69f2e28d12c1 26 DigitalOut YellowLed( PB_10 ); // Active Low
ubhat 0:69f2e28d12c1 27 DigitalOut GreenLed( PC_3 ); // Active Low
ubhat 0:69f2e28d12c1 28 DigitalOut UsrLed( PA_5 ); // Active High
ubhat 0:69f2e28d12c1 29
ubhat 0:69f2e28d12c1 30
ubhat 0:69f2e28d12c1 31 GPS Gps( PB_6, PB_7, PB_11 ); // Gps(tx, rx, en);
ubhat 0:69f2e28d12c1 32
ubhat 0:69f2e28d12c1 33 DigitalIn I2cInterrupt( PB_4 );
ubhat 0:69f2e28d12c1 34 I2C I2c(I2C_SDA, I2C_SCL);
ubhat 0:69f2e28d12c1 35
ubhat 0:69f2e28d12c1 36 MPL3115A2 Mpl3115a2( I2c, I2cInterrupt );
ubhat 0:69f2e28d12c1 37 MMA8451Q Mma8451q(I2c, I2cInterrupt);
ubhat 0:69f2e28d12c1 38
ubhat 0:69f2e28d12c1 39 DigitalOut Pc7( PC_7 );
ubhat 0:69f2e28d12c1 40 DigitalIn Pc1( PC_1 );
ubhat 0:69f2e28d12c1 41
ubhat 6:f8194e691dd4 42 // Used for Push button application demo
ubhat 6:f8194e691dd4 43 DigitalIn PC0( PC_0, PullUp );
ubhat 6:f8194e691dd4 44
ubhat 0:69f2e28d12c1 45 AnalogIn *Battery;
ubhat 0:69f2e28d12c1 46
mluis 18:18408c3c2d0c 47 #define AIN_VREF 3300 // STM32 internal refernce
ubhat 0:69f2e28d12c1 48 #define AIN_VBAT_DIV 2 // Resistor divider
ubhat 0:69f2e28d12c1 49
ubhat 0:69f2e28d12c1 50 SX1272MB2xAS Radio( NULL );
ubhat 0:69f2e28d12c1 51
mluis 18:18408c3c2d0c 52 /*!
mluis 18:18408c3c2d0c 53 * Nested interrupt counter.
mluis 18:18408c3c2d0c 54 *
mluis 18:18408c3c2d0c 55 * \remark Interrupt should only be fully disabled once the value is 0
mluis 18:18408c3c2d0c 56 */
mluis 18:18408c3c2d0c 57 static uint8_t IrqNestLevel = 0;
mluis 18:18408c3c2d0c 58
mluis 18:18408c3c2d0c 59 void BoardDisableIrq( void )
mluis 18:18408c3c2d0c 60 {
mluis 18:18408c3c2d0c 61 __disable_irq( );
mluis 18:18408c3c2d0c 62 IrqNestLevel++;
mluis 18:18408c3c2d0c 63 }
mluis 18:18408c3c2d0c 64
mluis 18:18408c3c2d0c 65 void BoardEnableIrq( void )
mluis 18:18408c3c2d0c 66 {
mluis 18:18408c3c2d0c 67 IrqNestLevel--;
mluis 18:18408c3c2d0c 68 if( IrqNestLevel == 0 )
mluis 18:18408c3c2d0c 69 {
mluis 18:18408c3c2d0c 70 __enable_irq( );
mluis 18:18408c3c2d0c 71 }
mluis 18:18408c3c2d0c 72 }
mluis 18:18408c3c2d0c 73
ubhat 0:69f2e28d12c1 74 void BoardInit( void )
ubhat 0:69f2e28d12c1 75 {
ubhat 0:69f2e28d12c1 76 // Initalize LEDs
ubhat 0:69f2e28d12c1 77 RedLed = 1; // Active Low
ubhat 0:69f2e28d12c1 78 GreenLed = 1; // Active Low
mluis 18:18408c3c2d0c 79 YellowLed = 1; // Active Low
ubhat 0:69f2e28d12c1 80 UsrLed = 0; // Active High
ubhat 0:69f2e28d12c1 81
ubhat 0:69f2e28d12c1 82 TimerTimeCounterInit( );
ubhat 0:69f2e28d12c1 83
ubhat 0:69f2e28d12c1 84 switch( BoardGetVersion( ) )
ubhat 0:69f2e28d12c1 85 {
mluis 18:18408c3c2d0c 86 case BOARD_VERSION_2:
ubhat 0:69f2e28d12c1 87 Battery = new AnalogIn( PA_0 );
ubhat 0:69f2e28d12c1 88 Gps.en_invert = true;
ubhat 0:69f2e28d12c1 89 break;
mluis 18:18408c3c2d0c 90 case BOARD_VERSION_3:
ubhat 0:69f2e28d12c1 91 Battery = new AnalogIn( PA_1 );
ubhat 0:69f2e28d12c1 92 Gps.en_invert = false;
ubhat 0:69f2e28d12c1 93 break;
ubhat 0:69f2e28d12c1 94 default:
ubhat 0:69f2e28d12c1 95 break;
ubhat 0:69f2e28d12c1 96 }
ubhat 0:69f2e28d12c1 97 Gps.init( );
ubhat 0:69f2e28d12c1 98 Gps.enable( 1 );
mluis 18:18408c3c2d0c 99
ubhat 0:69f2e28d12c1 100 Mpl3115a2.init( );
ubhat 0:69f2e28d12c1 101 Mma8451q.orient_detect( );
ubhat 0:69f2e28d12c1 102 }
ubhat 0:69f2e28d12c1 103
ubhat 0:69f2e28d12c1 104
ubhat 0:69f2e28d12c1 105 uint8_t BoardGetBatteryLevel( void )
ubhat 0:69f2e28d12c1 106 {
ubhat 0:69f2e28d12c1 107 // Per LoRaWAN spec; 0 = Charging; 1...254 = level, 255 = N/A
ubhat 0:69f2e28d12c1 108 return ( Battery->read_u16( ) >> 8 ) + ( Battery->read_u16( ) >> 9 );
ubhat 0:69f2e28d12c1 109 }
ubhat 0:69f2e28d12c1 110
mluis 18:18408c3c2d0c 111 uint32_t BoardGetBatteryVoltage( void )
ubhat 0:69f2e28d12c1 112 {
ubhat 0:69f2e28d12c1 113 return ( Battery->read( ) * AIN_VREF * AIN_VBAT_DIV );
ubhat 0:69f2e28d12c1 114 }
ubhat 0:69f2e28d12c1 115
ubhat 0:69f2e28d12c1 116 uint32_t BoardGetRandomSeed( void )
ubhat 0:69f2e28d12c1 117 {
ubhat 0:69f2e28d12c1 118 return ( ( *( uint32_t* )ID1 ) ^ ( *( uint32_t* )ID2 ) ^ ( *( uint32_t* )ID3 ) );
ubhat 0:69f2e28d12c1 119 }
ubhat 0:69f2e28d12c1 120
ubhat 0:69f2e28d12c1 121 void BoardGetDevEUI( uint8_t *id )
ubhat 0:69f2e28d12c1 122 {
ubhat 0:69f2e28d12c1 123 uint32_t *pDevEuiHWord = ( uint32_t* )&id[4];
ubhat 0:69f2e28d12c1 124
ubhat 0:69f2e28d12c1 125 if( *pDevEuiHWord == 0 )
ubhat 0:69f2e28d12c1 126 {
ubhat 0:69f2e28d12c1 127 *pDevEuiHWord = BoardGetRandomSeed( );
ubhat 0:69f2e28d12c1 128 }
ubhat 0:69f2e28d12c1 129
ubhat 0:69f2e28d12c1 130 }
ubhat 0:69f2e28d12c1 131
ubhat 0:69f2e28d12c1 132 void BoardGetUniqueId( uint8_t *id )
ubhat 0:69f2e28d12c1 133 {
ubhat 0:69f2e28d12c1 134 id[7] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 24;
ubhat 0:69f2e28d12c1 135 id[6] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 16;
ubhat 0:69f2e28d12c1 136 id[5] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 8;
ubhat 0:69f2e28d12c1 137 id[4] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) );
ubhat 0:69f2e28d12c1 138 id[3] = ( ( *( uint32_t* )ID2 ) ) >> 24;
ubhat 0:69f2e28d12c1 139 id[2] = ( ( *( uint32_t* )ID2 ) ) >> 16;
ubhat 0:69f2e28d12c1 140 id[1] = ( ( *( uint32_t* )ID2 ) ) >> 8;
ubhat 0:69f2e28d12c1 141 id[0] = ( ( *( uint32_t* )ID2 ) );
ubhat 0:69f2e28d12c1 142 }
ubhat 0:69f2e28d12c1 143
mluis 18:18408c3c2d0c 144 BoardVersion_t BoardGetVersion( void )
ubhat 0:69f2e28d12c1 145 {
ubhat 0:69f2e28d12c1 146 Pc7 = 1;
ubhat 0:69f2e28d12c1 147 char first = Pc1;
ubhat 0:69f2e28d12c1 148 Pc7 = 0;
ubhat 0:69f2e28d12c1 149
ubhat 0:69f2e28d12c1 150 if( first && !Pc1 )
ubhat 0:69f2e28d12c1 151 {
mluis 18:18408c3c2d0c 152 return BOARD_VERSION_2;
ubhat 0:69f2e28d12c1 153 }
ubhat 0:69f2e28d12c1 154 else
ubhat 0:69f2e28d12c1 155 {
mluis 18:18408c3c2d0c 156 return BOARD_VERSION_3;
ubhat 0:69f2e28d12c1 157 }
ubhat 0:69f2e28d12c1 158 }