first test

Dependents:   LoRaWAN-lmic-app_tjm

Fork of LMiC by Semtech

Revision:
5:464c1f2d6cbb
Parent:
4:85b2b647cb64
Child:
6:eed5fd627a2b
diff -r 85b2b647cb64 -r 464c1f2d6cbb radio.cpp
--- a/radio.cpp	Thu Nov 26 17:17:08 2015 +0000
+++ b/radio.cpp	Tue Feb 23 15:34:27 2016 +0000
@@ -16,9 +16,10 @@
  *******************************************************************************/
 
 #include "lmic.h"
+#include "debug.h"
 
 #if USE_SMTC_RADIO_DRIVER
-#include "sx1276-hal.h"
+#include "sx1272-hal.h"
 
 /*!
  * Syncword for lora networks
@@ -71,7 +72,8 @@
 /*
  * Radio object declraration
  */
-SX1276MB1xAS Radio( NULL );
+//SX1272MB1xAS Radio( NULL );
+SX1272MB1xAS *Radio;
 
 static const u2_t LORA_RXDONE_FIXUP[] = {
     [FSK]  =     us2osticks(0), // (   0 ticks)
@@ -85,18 +87,20 @@
 
 void OnTxDone( void )
 {
+    debug("OnTxDone enter\r\n");
     ostime_t now = os_getTime( );
     // save exact tx time
     LMIC.txend = now - us2osticks( RADIO_WAKEUP_TIME ); // TXDONE FIXUP
     
     // go from stanby to sleep
-    Radio.Sleep( );
+    Radio->Sleep( );
     // run os job (use preset func ptr)
     os_setCallback( &LMIC.osjob, LMIC.osjob.func );
 }
 
 void OnRxDone( uint8_t *payload, uint16_t size, int16_t rssi, int8_t snr )
 {
+   debug("OnRxDone enter\r\n");
     ostime_t now = os_getTime( );
     // save exact rx time
     if( getBw( LMIC.rps ) == BW125 )
@@ -113,45 +117,48 @@
     LMIC.rssi = rssi; // RSSI [dBm] (-196...+63)
 
     // go from stanby to sleep
-    Radio.Sleep( );
+    Radio->Sleep( );
     // run os job (use preset func ptr)
     os_setCallback( &LMIC.osjob, LMIC.osjob.func );
 }
 
 void OnTxTimeout( void )
 {
-    ostime_t now = os_getTime( );
+   debug("OnTxTimeout enter\r\n");
+   ostime_t now = os_getTime( );
 
     // indicate error
     LMIC.dataLen = 0;
     
     // go from stanby to sleep
-    Radio.Sleep( );
+    Radio->Sleep( );
     // run os job (use preset func ptr)
     os_setCallback( &LMIC.osjob, LMIC.osjob.func );
 }
 
 void OnRxTimeout( void )
 {
-    ostime_t now = os_getTime( );
+   debug("OnRxTimeout enter\r\n");
+   ostime_t now = os_getTime( );
     // indicate timeout
     LMIC.dataLen = 0;
 
     // go from stanby to sleep
-    Radio.Sleep( );
+    Radio->Sleep( );
     // run os job (use preset func ptr)
     os_setCallback( &LMIC.osjob, LMIC.osjob.func );
 }
 
 void OnRxError( void )
 {
+  debug("OnRxError enter\r\n");
     ostime_t now = os_getTime( );
 
     // indicate error
     LMIC.dataLen = 0;
 
     // go from stanby to sleep
-    Radio.Sleep( );
+    Radio->Sleep( );
     // run os job (use preset func ptr)
     os_setCallback( &LMIC.osjob, LMIC.osjob.func );
 }
@@ -166,6 +173,8 @@
 // get random seed from wideband noise rssi
 void radio_init( void ) 
 {
+ debug("radio_init1 enter\r\n");
+ Radio = new SX1272MB1xAS(NULL);
     hal_disableIRQs( );
 
     // Initialize Radio driver
@@ -174,13 +183,13 @@
     RadioEvents.RxError = OnRxError;
     RadioEvents.TxTimeout = OnTxTimeout;
     RadioEvents.RxTimeout = OnRxTimeout;
-    Radio.Init( &RadioEvents );
+    Radio->Init( &RadioEvents );
     
     // seed 15-byte randomness via noise rssi
     // Set LoRa modem ON
-    Radio.SetModem( MODEM_LORA );
+    Radio->SetModem( MODEM_LORA );
     // Disable LoRa modem interrupts
-    Radio.Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
+    Radio->Write( REG_LR_IRQFLAGSMASK, RFLR_IRQFLAGS_RXTIMEOUT |
                   RFLR_IRQFLAGS_RXDONE |
                   RFLR_IRQFLAGS_PAYLOADCRCERROR |
                   RFLR_IRQFLAGS_VALIDHEADER |
@@ -190,31 +199,33 @@
                   RFLR_IRQFLAGS_CADDETECTED );
 
     // Set radio in continuous reception
-    Radio.Rx( 0 );
+    Radio->Rx( 0 );
 
     for( int i = 1; i < 16; i++ )
     {
         for( int j = 0; j < 8; j++ )
         {
             u1_t b; // wait for two non-identical subsequent least-significant bits
-            while( ( b = Radio.Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) == ( Radio.Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) );
+            while( ( b = Radio->Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) == ( Radio->Read( REG_LR_RSSIWIDEBAND ) & 0x01 ) );
             randbuf[i] = ( randbuf[i] << 1 ) | b;
         }
     }
     randbuf[0] = 16; // set initial index
 
     // Change LoRa modem SyncWord
-    Radio.Write( REG_LR_SYNCWORD, LORA_MAC_SYNCWORD );
+    Radio->Write( REG_LR_SYNCWORD, LORA_MAC_SYNCWORD );
     
-    Radio.Sleep( );
+    Radio->Sleep( );
     
     hal_enableIRQs( );
+ debug("radio_init exit\r\n");
 }
 
 // return next random byte derived from seed buffer
 // (buf[0] holds index of next byte to be returned)
 u1_t radio_rand1( void )
 {
+ debug("radio_rand1 enter\r\n");
     u1_t i = randbuf[0];
     ASSERT( i != 0 );
     if( i == 16 )
@@ -229,52 +240,53 @@
 
 void os_radio( u1_t mode )
 {
+debug("os_radio enter\r\n");
     hal_disableIRQs( );
     switch( mode ) 
     {
     case RADIO_RST:
         // put radio to sleep
-        Radio.Sleep( );
+        Radio->Sleep( );
         break;
 
     case RADIO_TX:
         // transmit frame now
         //ASSERT( Radio.GetState( ) == IDLE );
 
-        Radio.SetChannel( LMIC.freq );
+        Radio->SetChannel( LMIC.freq );
         if( getSf( LMIC.rps ) == FSK )
         { // FSK modem
-            Radio.SetTxConfig( MODEM_FSK, LMIC.txpow, 25e3, 0, 50e3, 0, 5, false, true, 0, 0, false, 3e6 );
+            Radio->SetTxConfig( MODEM_FSK, LMIC.txpow, 25e3, 0, 50e3, 0, 5, false, true, 0, 0, false, 3e6 );
         }
         else
         { // LoRa modem
             
-            Radio.SetTxConfig( MODEM_LORA, LMIC.txpow, 0, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 8, getIh( LMIC.rps ) ? true : false, ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, false, 3e6 );
+            Radio->SetTxConfig( MODEM_LORA, LMIC.txpow, 0, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 8, getIh( LMIC.rps ) ? true : false, ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, false, 3e6 );
         }
 
         //starttx( ); // buf=LMIC.frame, len=LMIC.dataLen
-        Radio.Send( LMIC.frame, LMIC.dataLen );
+        Radio->Send( LMIC.frame, LMIC.dataLen );
         break;
 
     case RADIO_RX:
         // receive frame now (exactly at rxtime)
         //ASSERT( Radio.GetState( ) == IDLE );
 
-        Radio.SetChannel( LMIC.freq );
+        Radio->SetChannel( LMIC.freq );
         if( getSf( LMIC.rps ) == FSK )
         { // FSK modem
             //Radio.SetRxConfig( MODEM_FSK, 50e3, 50e3, 0, 83.333e3, 5, 0, false, 0, true, 0, 0, false, false );
-            Radio.SetRxConfig( MODEM_FSK, 50e3, 50e3, 0, 83.333e3, 5, 0, false, 0, true, 0, 0, false, true );
+            Radio->SetRxConfig( MODEM_FSK, 50e3, 50e3, 0, 83.333e3, 5, 0, false, 0, true, 0, 0, false, true );
         }
         else
         { // LoRa modem
             if( ( getSf( LMIC.rps ) <= SF9 ) && ( LMIC.rxsyms < 8 ) )
             {
-                Radio.SetRxConfig( MODEM_LORA, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 0, 8, LMIC.rxsyms + 3, getIh( LMIC.rps ) ? true : false, getIh( LMIC.rps ), ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, true, false );
+                Radio->SetRxConfig( MODEM_LORA, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 0, 8, LMIC.rxsyms + 3, getIh( LMIC.rps ) ? true : false, getIh( LMIC.rps ), ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, true, false );
             }
             else
             {
-                Radio.SetRxConfig( MODEM_LORA, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 0, 8, LMIC.rxsyms, getIh( LMIC.rps ) ? true : false, getIh( LMIC.rps ), ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, true, false );
+                Radio->SetRxConfig( MODEM_LORA, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 0, 8, LMIC.rxsyms, getIh( LMIC.rps ) ? true : false, getIh( LMIC.rps ), ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, true, false );
             }
         }
 
@@ -284,11 +296,11 @@
         //startrx( RXMODE_SINGLE ); // buf = LMIC.frame, time = LMIC.rxtime, timeout=LMIC.rxsyms
         if( getSf( LMIC.rps ) == FSK )
         { // FSK modem
-            Radio.Rx( 50e3 ); // Max Rx window 50 ms
+            Radio->Rx( 50e3 ); // Max Rx window 50 ms
         }
         else
         { // LoRa modem
-            Radio.Rx( 3e6 ); // Max Rx window 3 seconds
+            Radio->Rx( 3e6 ); // Max Rx window 3 seconds
         }
         break;
 
@@ -297,18 +309,18 @@
 
         //ASSERT( Radio.GetState( ) == IDLE );
 
-        Radio.SetChannel( LMIC.freq );
+        Radio->SetChannel( LMIC.freq );
         if( getSf( LMIC.rps ) == FSK )
         { // FSK modem
-            Radio.SetRxConfig( MODEM_FSK, 50e3, 50e3, 0, 83.333e3, 5, 0, false, 0, true, 0, 0, false, true );
+            Radio->SetRxConfig( MODEM_FSK, 50e3, 50e3, 0, 83.333e3, 5, 0, false, 0, true, 0, 0, false, true );
         }
         else
         { // LoRa modem
-            Radio.SetRxConfig( MODEM_LORA, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 0, 8, LMIC.rxsyms, getIh( LMIC.rps ) ? true : false, getIh( LMIC.rps ), ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, true, true );
+            Radio->SetRxConfig( MODEM_LORA, getBw( LMIC.rps ), getSf( LMIC.rps ) + 6, getCr( LMIC.rps ) + 1, 0, 8, LMIC.rxsyms, getIh( LMIC.rps ) ? true : false, getIh( LMIC.rps ), ( getNocrc( LMIC.rps ) == 0 ) ? true : false, 0, 0, true, true );
         }
 
         //startrx( RXMODE_SCAN ); // buf = LMIC.frame
-        Radio.Rx( 0 );
+        Radio->Rx( 0 );
         break;
     }
     hal_enableIRQs( );
@@ -570,52 +582,71 @@
 DigitalOut rxStateIo( PB_9 );
 #endif
 
-static void writeReg (u1_t addr, u1_t data ) {
+static void writeReg (u1_t addr, u1_t data ) 
+{
+debug("writeReg enter 0x%02X 0x%02X\r\n",addr,data);
     hal_pin_nss(0);
     hal_spi(addr | 0x80);
     hal_spi(data);
     hal_pin_nss(1);
 }
 
-static u1_t readReg (u1_t addr) {
+static u1_t readReg (u1_t addr) 
+{
     hal_pin_nss(0);
     hal_spi(addr & 0x7F);
     u1_t val = hal_spi(0x00);
     hal_pin_nss(1);
+debug("readReg exit 0x%02X 0x%02X\r\n",addr,val);
     return val;
 }
 
-static void writeBuf (u1_t addr, xref2u1_t buf, u1_t len) {
+static void writeBuf (u1_t addr, xref2u1_t buf, u1_t len) 
+{
+debug("writeBuf enter 0x%02X\r\n",addr);
     hal_pin_nss(0);
     hal_spi(addr | 0x80);
-    for (u1_t i=0; i<len; i++) {
+    for (u1_t i=0; i<len; i++) 
+    {
+debug(" 0x%02X\r\n",buf[i]);
         hal_spi(buf[i]);
     }
     hal_pin_nss(1);
+    debug("\r\n");
 }
 
-static void readBuf (u1_t addr, xref2u1_t buf, u1_t len) {
+static void readBuf (u1_t addr, xref2u1_t buf, u1_t len) 
+{
+debug("readBuf enter 0x%02X\r\n",addr);
     hal_pin_nss(0);
     hal_spi(addr & 0x7F);
     for (u1_t i=0; i<len; i++) {
         buf[i] = hal_spi(0x00);
+debug(" 0x%02X\r\n",buf[i]);
     }
     hal_pin_nss(1);
+    debug("\r\n");
 }
 
-static void opmode (u1_t mode) {
+static void opmode (u1_t mode) 
+{
+debug("opmode enter %d\r\n",mode);
     writeReg(RegOpMode, (readReg(RegOpMode) & ~OPMODE_MASK) | mode);
 }
 
-static void opmodeLora() {
-    u1_t u = OPMODE_LORA;
+static void opmodeLora() 
+{
+ debug("opmodeLora enter\r\n");
+   u1_t u = OPMODE_LORA;
 #ifdef CFG_sx1276_radio
     u |= 0x8;   // TBD: sx1276 high freq
 #endif
     writeReg(RegOpMode, u);
 }
 
-static void opmodeFSK() {
+static void opmodeFSK() 
+{
+ debug("opmodeFSK enter\r\n");
     u1_t u = 0;
 #ifdef CFG_sx1276_radio
     u |= 0x8;   // TBD: sx1276 high freq
@@ -624,7 +655,9 @@
 }
 
 // configure LoRa modem (cfg1, cfg2)
-static void configLoraModem () {
+static void configLoraModem () 
+{
+ debug("configLoraModem enter\r\n");
     sf_t sf = getSf(LMIC.rps);
 
 #ifdef CFG_sx1276_radio
@@ -696,9 +729,11 @@
 #endif /* CFG_sx1272_radio */
 }
 
-static void configChannel () {
+static void configChannel () 
+{
     // set frequency: FQ = (FRF * 32 Mhz) / (2 ^ 19)
     u8_t frf = ((u8_t)LMIC.freq << 19) / 32000000;
+debug("configChannel enter %d %lld\r\n",LMIC.freq, frf);
     writeReg(RegFrfMsb, (u1_t)(frf>>16));
     writeReg(RegFrfMid, (u1_t)(frf>> 8));
     writeReg(RegFrfLsb, (u1_t)(frf>> 0));
@@ -706,7 +741,9 @@
 
 
 
-static void configPower () {
+static void configPower () 
+{
+debug("configPower enter\r\n");
 #ifdef CFG_sx1276_radio
     // no boost used for now
     s1_t pw = (s1_t)LMIC.txpow;
@@ -733,7 +770,9 @@
 #endif /* CFG_sx1272_radio */
 }
 
-static void txfsk () {
+static void txfsk () 
+{
+debug("txfsk enter\r\n");
     // select FSK modem (from sleep mode)
     writeReg(RegOpMode, 0x10); // FSK, BT=0.5
     ASSERT(readReg(RegOpMode) == 0x10);
@@ -783,7 +822,9 @@
 #endif
 }
 
-static void txlora () {
+static void txlora () 
+{
+debug("txlora enter\r\n");
     // select LoRa modem (from sleep mode)
     //writeReg(RegOpMode, OPMODE_LORA);
     opmodeLora();
@@ -828,7 +869,9 @@
 }
 
 // start transmitter (buf=LMIC.frame, len=LMIC.dataLen)
-static void starttx () {
+static void starttx () 
+{
+debug("starttx enter\r\n");
     ASSERT( (readReg(RegOpMode) & OPMODE_MASK) == OPMODE_SLEEP );
     if(getSf(LMIC.rps) == FSK) { // FSK modem
         txfsk();
@@ -848,7 +891,9 @@
 };
 
 // start LoRa receiver (time=LMIC.rxtime, timeout=LMIC.rxsyms, result=LMIC.frame[LMIC.dataLen])
-static void rxlora (u1_t rxmode) {
+static void rxlora (u1_t rxmode) 
+{
+debug("rxlora enter\r\n");
     // select LoRa modem (from sleep mode)
     opmodeLora();
     ASSERT((readReg(RegOpMode) & OPMODE_LORA) != 0);
@@ -904,7 +949,9 @@
     }
 }
 
-static void rxfsk (u1_t rxmode) {
+static void rxfsk (u1_t rxmode) 
+{
+debug("rxfsk enter\r\n");
     // only single rx (no continuous scanning, no noise sampling)
     ASSERT( rxmode == RXMODE_SINGLE );
     // select FSK modem (from sleep mode)
@@ -962,7 +1009,9 @@
 #endif
 }
 
-static void startrx (u1_t rxmode) {
+static void startrx (u1_t rxmode) 
+{
+debug("startrx enter\r\n");
     ASSERT( (readReg(RegOpMode) & OPMODE_MASK) == OPMODE_SLEEP );
     if(getSf(LMIC.rps) == FSK) { // FSK modem
         rxfsk(rxmode);
@@ -974,7 +1023,10 @@
 }
 
 // get random seed from wideband noise rssi
-void radio_init () {
+void radio_init () 
+{
+debug("radio_init2 enter\r\n");
+    Radio = new SX1272MB1xAS(NULL);
     hal_disableIRQs();
 
     // manually reset radio
@@ -1042,7 +1094,9 @@
 
 // return next random byte derived from seed buffer
 // (buf[0] holds index of next byte to be returned)
-u1_t radio_rand1 () {
+u1_t radio_rand1 () 
+{
+debug("radio_rand1 enter\r\n");
     u1_t i = randbuf[0];
     ASSERT( i != 0 );
     if( i==16 ) {
@@ -1054,7 +1108,9 @@
     return v;
 }
 
-u1_t radio_rssi () {
+u1_t radio_rssi () 
+{
+debug("radio_rssi enter\r\n");
     hal_disableIRQs();
     u1_t r = readReg(LORARegRssiValue);
     hal_enableIRQs();
@@ -1073,7 +1129,9 @@
 
 // called by hal ext IRQ handler
 // (radio goes to stanby mode after tx/rx operations)
-void radio_irq_handler (u1_t dio) {
+void radio_irq_handler (u1_t dio) 
+{
+debug("radio_irq_handler enter %d\r\n",dio);
     ostime_t now = os_getTime();
     if( (readReg(RegOpMode) & OPMODE_LORA) != 0) { // LORA modem
         u1_t flags = readReg(LORARegIrqFlags);
@@ -1137,7 +1195,9 @@
     os_setCallback(&LMIC.osjob, LMIC.osjob.func);
 }
 
-void os_radio (u1_t mode) {
+void os_radio (u1_t mode) 
+{
+debug("os_radio enter\r\n");
     hal_disableIRQs();
     switch (mode) {
       case RADIO_RST: