PIR + LoRa

Dependencies:   BLE_API LMiC SX1276Lib mbed nRF51822 nrf51_rtc

Fork of BLE_PhysicalWeb by Bluetooth Low Energy

Committer:
janjongboom
Date:
Thu Sep 24 08:32:32 2015 +0000
Revision:
12:940eb88a2104
Parent:
11:bbe4157401e2
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
janjongboom 11:bbe4157401e2 1 /*******************************************************************************
janjongboom 11:bbe4157401e2 2 * Copyright (c) 2014 IBM Corporation.
janjongboom 11:bbe4157401e2 3 * All rights reserved. This program and the accompanying materials
janjongboom 11:bbe4157401e2 4 * are made available under the terms of the Eclipse Public License v1.0
janjongboom 11:bbe4157401e2 5 * which accompanies this distribution, and is available at
janjongboom 11:bbe4157401e2 6 * http://www.eclipse.org/legal/epl-v10.html
janjongboom 11:bbe4157401e2 7 *
janjongboom 11:bbe4157401e2 8 * Contributors:
janjongboom 11:bbe4157401e2 9 * IBM Zurich Research Lab - initial API, implementation and documentation
janjongboom 11:bbe4157401e2 10 * Semtech Apps Team - Modified to support the MBED sx1276 driver
janjongboom 11:bbe4157401e2 11 * library.
janjongboom 11:bbe4157401e2 12 * Possibility to use original or Semtech's MBED
janjongboom 11:bbe4157401e2 13 * radio driver. The selection is done by setting
janjongboom 11:bbe4157401e2 14 * USE_SMTC_RADIO_DRIVER preprocessing directive
janjongboom 11:bbe4157401e2 15 * in lmic.h
janjongboom 11:bbe4157401e2 16 *******************************************************************************/
janjongboom 11:bbe4157401e2 17 #include "mbed.h"
janjongboom 11:bbe4157401e2 18 #include "lmic.h"
janjongboom 11:bbe4157401e2 19 #include "mbed_debug.h"
janjongboom 11:bbe4157401e2 20
janjongboom 11:bbe4157401e2 21 #if !USE_SMTC_RADIO_DRIVER
janjongboom 11:bbe4157401e2 22
janjongboom 11:bbe4157401e2 23 extern void radio_irq_handler( u1_t dio );
janjongboom 11:bbe4157401e2 24
janjongboom 11:bbe4157401e2 25 static DigitalOut nss( D10 );
janjongboom 11:bbe4157401e2 26 static SPI spi( D11, D12, D13 ); // ( mosi, miso, sclk )
janjongboom 11:bbe4157401e2 27
janjongboom 11:bbe4157401e2 28 static DigitalInOut rst( A0 );
janjongboom 11:bbe4157401e2 29 static DigitalOut rxtx( A4 );
janjongboom 11:bbe4157401e2 30
janjongboom 11:bbe4157401e2 31 static InterruptIn dio0( D2 );
janjongboom 11:bbe4157401e2 32 static InterruptIn dio1( D3 );
janjongboom 11:bbe4157401e2 33 static InterruptIn dio2( D4 );
janjongboom 11:bbe4157401e2 34
janjongboom 11:bbe4157401e2 35 static void dio0Irq( void ) {
janjongboom 11:bbe4157401e2 36 radio_irq_handler( 0 );
janjongboom 11:bbe4157401e2 37 }
janjongboom 11:bbe4157401e2 38
janjongboom 11:bbe4157401e2 39 static void dio1Irq( void ) {
janjongboom 11:bbe4157401e2 40 radio_irq_handler( 1 );
janjongboom 11:bbe4157401e2 41 }
janjongboom 11:bbe4157401e2 42
janjongboom 11:bbe4157401e2 43 static void dio2Irq( void ) {
janjongboom 11:bbe4157401e2 44 radio_irq_handler( 2 );
janjongboom 11:bbe4157401e2 45 }
janjongboom 11:bbe4157401e2 46
janjongboom 11:bbe4157401e2 47 #endif
janjongboom 11:bbe4157401e2 48
janjongboom 11:bbe4157401e2 49 static u1_t irqlevel = 0;
janjongboom 11:bbe4157401e2 50 static u4_t ticks = 0;
janjongboom 11:bbe4157401e2 51
janjongboom 11:bbe4157401e2 52 static Timer timer;
janjongboom 11:bbe4157401e2 53 static Ticker ticker;
janjongboom 11:bbe4157401e2 54
janjongboom 11:bbe4157401e2 55 static void reset_timer( void ) {
janjongboom 11:bbe4157401e2 56 ticks += timer.read_us( ) >> 6;
janjongboom 11:bbe4157401e2 57 timer.reset( );
janjongboom 11:bbe4157401e2 58 }
janjongboom 11:bbe4157401e2 59
janjongboom 11:bbe4157401e2 60 void hal_init( void ) {
janjongboom 11:bbe4157401e2 61 __disable_irq( );
janjongboom 11:bbe4157401e2 62 irqlevel = 0;
janjongboom 11:bbe4157401e2 63
janjongboom 11:bbe4157401e2 64 #if !USE_SMTC_RADIO_DRIVER
janjongboom 11:bbe4157401e2 65 // configure input lines
janjongboom 11:bbe4157401e2 66 dio0.mode( PullDown );
janjongboom 11:bbe4157401e2 67 dio0.rise( dio0Irq );
janjongboom 11:bbe4157401e2 68 dio0.enable_irq( );
janjongboom 11:bbe4157401e2 69 dio1.mode( PullDown );
janjongboom 11:bbe4157401e2 70 dio1.rise( dio1Irq );
janjongboom 11:bbe4157401e2 71 dio1.enable_irq( );
janjongboom 11:bbe4157401e2 72 dio2.mode( PullDown );
janjongboom 11:bbe4157401e2 73 dio2.rise( dio2Irq );
janjongboom 11:bbe4157401e2 74 dio2.enable_irq( );
janjongboom 11:bbe4157401e2 75 // configure reset line
janjongboom 11:bbe4157401e2 76 rst.input( );
janjongboom 11:bbe4157401e2 77 // configure spi
janjongboom 11:bbe4157401e2 78 spi.frequency( 8000000 );
janjongboom 11:bbe4157401e2 79 spi.format( 8, 0 );
janjongboom 11:bbe4157401e2 80 nss = 1;
janjongboom 11:bbe4157401e2 81 #endif
janjongboom 11:bbe4157401e2 82 // configure timer
janjongboom 11:bbe4157401e2 83 timer.start( );
janjongboom 11:bbe4157401e2 84 ticker.attach_us( reset_timer, 10000000 ); // reset timer every 10sec
janjongboom 11:bbe4157401e2 85 __enable_irq( );
janjongboom 11:bbe4157401e2 86 }
janjongboom 11:bbe4157401e2 87
janjongboom 11:bbe4157401e2 88 #if !USE_SMTC_RADIO_DRIVER
janjongboom 11:bbe4157401e2 89
janjongboom 11:bbe4157401e2 90 void hal_pin_rxtx( u1_t val ) {
janjongboom 11:bbe4157401e2 91 rxtx = !val;
janjongboom 11:bbe4157401e2 92 }
janjongboom 11:bbe4157401e2 93
janjongboom 11:bbe4157401e2 94 void hal_pin_nss( u1_t val ) {
janjongboom 11:bbe4157401e2 95 nss = val;
janjongboom 11:bbe4157401e2 96 }
janjongboom 11:bbe4157401e2 97
janjongboom 11:bbe4157401e2 98 void hal_pin_rst( u1_t val ) {
janjongboom 11:bbe4157401e2 99 if( val == 0 || val == 1 )
janjongboom 11:bbe4157401e2 100 { // drive pin
janjongboom 11:bbe4157401e2 101 rst.output( );
janjongboom 11:bbe4157401e2 102 rst = val;
janjongboom 11:bbe4157401e2 103 }
janjongboom 11:bbe4157401e2 104 else
janjongboom 11:bbe4157401e2 105 { // keep pin floating
janjongboom 11:bbe4157401e2 106 rst.input( );
janjongboom 11:bbe4157401e2 107 }
janjongboom 11:bbe4157401e2 108 }
janjongboom 11:bbe4157401e2 109
janjongboom 11:bbe4157401e2 110 u1_t hal_spi( u1_t out ) {
janjongboom 11:bbe4157401e2 111 return spi.write( out );
janjongboom 11:bbe4157401e2 112 }
janjongboom 11:bbe4157401e2 113
janjongboom 11:bbe4157401e2 114 #endif
janjongboom 11:bbe4157401e2 115
janjongboom 11:bbe4157401e2 116 void hal_disableIRQs( void ) {
janjongboom 11:bbe4157401e2 117 __disable_irq( );
janjongboom 11:bbe4157401e2 118 irqlevel++;
janjongboom 11:bbe4157401e2 119 }
janjongboom 11:bbe4157401e2 120
janjongboom 11:bbe4157401e2 121 void hal_enableIRQs( void ) {
janjongboom 11:bbe4157401e2 122 if( --irqlevel == 0 )
janjongboom 11:bbe4157401e2 123 {
janjongboom 11:bbe4157401e2 124 __enable_irq( );
janjongboom 11:bbe4157401e2 125 }
janjongboom 11:bbe4157401e2 126 }
janjongboom 11:bbe4157401e2 127
janjongboom 11:bbe4157401e2 128 void hal_sleep( void ) {
janjongboom 11:bbe4157401e2 129 // NOP
janjongboom 11:bbe4157401e2 130 }
janjongboom 11:bbe4157401e2 131
janjongboom 11:bbe4157401e2 132 u4_t hal_ticks( void ) {
janjongboom 11:bbe4157401e2 133 hal_disableIRQs( );
janjongboom 11:bbe4157401e2 134 int t = ticks + ( timer.read_us( ) >> 6 );
janjongboom 11:bbe4157401e2 135 hal_enableIRQs( );
janjongboom 11:bbe4157401e2 136 return t;
janjongboom 11:bbe4157401e2 137 }
janjongboom 11:bbe4157401e2 138
janjongboom 11:bbe4157401e2 139 static u2_t deltaticks( u4_t time ) {
janjongboom 11:bbe4157401e2 140 u4_t t = hal_ticks( );
janjongboom 11:bbe4157401e2 141 s4_t d = time - t;
janjongboom 11:bbe4157401e2 142 if( d <= 0 ) {
janjongboom 11:bbe4157401e2 143 return 0; // in the past
janjongboom 11:bbe4157401e2 144 }
janjongboom 11:bbe4157401e2 145 if( ( d >> 16 ) != 0 ) {
janjongboom 11:bbe4157401e2 146 return 0xFFFF; // far ahead
janjongboom 11:bbe4157401e2 147 }
janjongboom 11:bbe4157401e2 148 return ( u2_t )d;
janjongboom 11:bbe4157401e2 149 }
janjongboom 11:bbe4157401e2 150
janjongboom 11:bbe4157401e2 151 void hal_waitUntil( u4_t time ) {
janjongboom 11:bbe4157401e2 152 while( deltaticks( time ) != 0 ); // busy wait until timestamp is reached
janjongboom 11:bbe4157401e2 153 }
janjongboom 11:bbe4157401e2 154
janjongboom 11:bbe4157401e2 155 u1_t hal_checkTimer( u4_t time ) {
janjongboom 11:bbe4157401e2 156 return ( deltaticks( time ) < 2 );
janjongboom 11:bbe4157401e2 157 }
janjongboom 11:bbe4157401e2 158
janjongboom 11:bbe4157401e2 159 void hal_failed( void ) {
janjongboom 11:bbe4157401e2 160 while( 1 );
janjongboom 11:bbe4157401e2 161 }