LoRa on Multitech with Semtech mote

Dependencies:   LoRaWAN-lib SX1272Lib lib_gps lib_mma8451q lib_mpl3115a2 mbed

Fork of LoRaWAN-NAMote72-Application-Demo_Multitech by Nagaraj Krishnamurthy

Committer:
ubhat
Date:
Tue May 17 00:21:55 2016 +0000
Revision:
0:69f2e28d12c1
Child:
6:f8194e691dd4
Project for LoRa Bootcamp

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
ubhat 0:69f2e28d12c1 18 MoteVersion_t BoardGetVersion( void );
ubhat 0:69f2e28d12c1 19
ubhat 0:69f2e28d12c1 20 DigitalOut RedLed( PB_1 ); // Active Low
ubhat 0:69f2e28d12c1 21 DigitalOut YellowLed( PB_10 ); // Active Low
ubhat 0:69f2e28d12c1 22 DigitalOut GreenLed( PC_3 ); // Active Low
ubhat 0:69f2e28d12c1 23 DigitalOut UsrLed( PA_5 ); // Active High
ubhat 0:69f2e28d12c1 24
ubhat 0:69f2e28d12c1 25
ubhat 0:69f2e28d12c1 26 GPS Gps( PB_6, PB_7, PB_11 ); // Gps(tx, rx, en);
ubhat 0:69f2e28d12c1 27
ubhat 0:69f2e28d12c1 28 DigitalIn I2cInterrupt( PB_4 );
ubhat 0:69f2e28d12c1 29 I2C I2c(I2C_SDA, I2C_SCL);
ubhat 0:69f2e28d12c1 30
ubhat 0:69f2e28d12c1 31 MPL3115A2 Mpl3115a2( I2c, I2cInterrupt );
ubhat 0:69f2e28d12c1 32 MMA8451Q Mma8451q(I2c, I2cInterrupt);
ubhat 0:69f2e28d12c1 33
ubhat 0:69f2e28d12c1 34 DigitalOut Pc7( PC_7 );
ubhat 0:69f2e28d12c1 35 DigitalIn Pc1( PC_1 );
ubhat 0:69f2e28d12c1 36
ubhat 0:69f2e28d12c1 37 AnalogIn *Battery;
ubhat 0:69f2e28d12c1 38
ubhat 0:69f2e28d12c1 39 #define AIN_VREF 3.3 // STM32 internal refernce
ubhat 0:69f2e28d12c1 40 #define AIN_VBAT_DIV 2 // Resistor divider
ubhat 0:69f2e28d12c1 41
ubhat 0:69f2e28d12c1 42 SX1272MB2xAS Radio( NULL );
ubhat 0:69f2e28d12c1 43
ubhat 0:69f2e28d12c1 44 void BoardInit( void )
ubhat 0:69f2e28d12c1 45 {
ubhat 0:69f2e28d12c1 46 // Initalize LEDs
ubhat 0:69f2e28d12c1 47 RedLed = 1; // Active Low
ubhat 0:69f2e28d12c1 48 GreenLed = 1; // Active Low
ubhat 0:69f2e28d12c1 49 YellowLed = 1; // Active Low
ubhat 0:69f2e28d12c1 50 UsrLed = 0; // Active High
ubhat 0:69f2e28d12c1 51
ubhat 0:69f2e28d12c1 52 TimerTimeCounterInit( );
ubhat 0:69f2e28d12c1 53
ubhat 0:69f2e28d12c1 54 switch( BoardGetVersion( ) )
ubhat 0:69f2e28d12c1 55 {
ubhat 0:69f2e28d12c1 56 case MOTE_VERSION_2:
ubhat 0:69f2e28d12c1 57 Battery = new AnalogIn( PA_0 );
ubhat 0:69f2e28d12c1 58 Gps.en_invert = true;
ubhat 0:69f2e28d12c1 59 break;
ubhat 0:69f2e28d12c1 60 case MOTE_VERSION_3:
ubhat 0:69f2e28d12c1 61 Battery = new AnalogIn( PA_1 );
ubhat 0:69f2e28d12c1 62 Gps.en_invert = false;
ubhat 0:69f2e28d12c1 63 break;
ubhat 0:69f2e28d12c1 64 default:
ubhat 0:69f2e28d12c1 65 break;
ubhat 0:69f2e28d12c1 66 }
ubhat 0:69f2e28d12c1 67 Gps.init( );
ubhat 0:69f2e28d12c1 68 Gps.enable( 1 );
ubhat 0:69f2e28d12c1 69
ubhat 0:69f2e28d12c1 70 Mpl3115a2.init( );
ubhat 0:69f2e28d12c1 71 Mma8451q.orient_detect( );
ubhat 0:69f2e28d12c1 72 }
ubhat 0:69f2e28d12c1 73
ubhat 0:69f2e28d12c1 74
ubhat 0:69f2e28d12c1 75 uint8_t BoardGetBatteryLevel( void )
ubhat 0:69f2e28d12c1 76 {
ubhat 0:69f2e28d12c1 77 // Per LoRaWAN spec; 0 = Charging; 1...254 = level, 255 = N/A
ubhat 0:69f2e28d12c1 78 return ( Battery->read_u16( ) >> 8 ) + ( Battery->read_u16( ) >> 9 );
ubhat 0:69f2e28d12c1 79 }
ubhat 0:69f2e28d12c1 80
ubhat 0:69f2e28d12c1 81 float BoardGetBatteryVoltage( void )
ubhat 0:69f2e28d12c1 82 {
ubhat 0:69f2e28d12c1 83 return ( Battery->read( ) * AIN_VREF * AIN_VBAT_DIV );
ubhat 0:69f2e28d12c1 84 }
ubhat 0:69f2e28d12c1 85
ubhat 0:69f2e28d12c1 86 uint32_t BoardGetRandomSeed( void )
ubhat 0:69f2e28d12c1 87 {
ubhat 0:69f2e28d12c1 88 return ( ( *( uint32_t* )ID1 ) ^ ( *( uint32_t* )ID2 ) ^ ( *( uint32_t* )ID3 ) );
ubhat 0:69f2e28d12c1 89 }
ubhat 0:69f2e28d12c1 90
ubhat 0:69f2e28d12c1 91 void BoardGetDevEUI( uint8_t *id )
ubhat 0:69f2e28d12c1 92 {
ubhat 0:69f2e28d12c1 93 uint32_t *pDevEuiHWord = ( uint32_t* )&id[4];
ubhat 0:69f2e28d12c1 94
ubhat 0:69f2e28d12c1 95 if( *pDevEuiHWord == 0 )
ubhat 0:69f2e28d12c1 96 {
ubhat 0:69f2e28d12c1 97 *pDevEuiHWord = BoardGetRandomSeed( );
ubhat 0:69f2e28d12c1 98 }
ubhat 0:69f2e28d12c1 99
ubhat 0:69f2e28d12c1 100 }
ubhat 0:69f2e28d12c1 101
ubhat 0:69f2e28d12c1 102 void BoardGetUniqueId( uint8_t *id )
ubhat 0:69f2e28d12c1 103 {
ubhat 0:69f2e28d12c1 104 id[7] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 24;
ubhat 0:69f2e28d12c1 105 id[6] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 16;
ubhat 0:69f2e28d12c1 106 id[5] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) ) >> 8;
ubhat 0:69f2e28d12c1 107 id[4] = ( ( *( uint32_t* )ID1 )+ ( *( uint32_t* )ID3 ) );
ubhat 0:69f2e28d12c1 108 id[3] = ( ( *( uint32_t* )ID2 ) ) >> 24;
ubhat 0:69f2e28d12c1 109 id[2] = ( ( *( uint32_t* )ID2 ) ) >> 16;
ubhat 0:69f2e28d12c1 110 id[1] = ( ( *( uint32_t* )ID2 ) ) >> 8;
ubhat 0:69f2e28d12c1 111 id[0] = ( ( *( uint32_t* )ID2 ) );
ubhat 0:69f2e28d12c1 112 }
ubhat 0:69f2e28d12c1 113
ubhat 0:69f2e28d12c1 114 MoteVersion_t BoardGetVersion( void )
ubhat 0:69f2e28d12c1 115 {
ubhat 0:69f2e28d12c1 116 Pc7 = 1;
ubhat 0:69f2e28d12c1 117 char first = Pc1;
ubhat 0:69f2e28d12c1 118 Pc7 = 0;
ubhat 0:69f2e28d12c1 119
ubhat 0:69f2e28d12c1 120 if( first && !Pc1 )
ubhat 0:69f2e28d12c1 121 {
ubhat 0:69f2e28d12c1 122 return MOTE_VERSION_2;
ubhat 0:69f2e28d12c1 123 }
ubhat 0:69f2e28d12c1 124 else
ubhat 0:69f2e28d12c1 125 {
ubhat 0:69f2e28d12c1 126 return MOTE_VERSION_3;
ubhat 0:69f2e28d12c1 127 }
ubhat 0:69f2e28d12c1 128 }