SAIT ARIS / LRAT-example-lorawan-REFACTOR-and-CLEAN-Branch

Dependencies:   Custom_LSM303 Custom_UBloxGPS LRAT-mbed-os USBDevice mbed-lora-radio-drv stm32EEPROM

Fork of LRAT-example-lorawan by SAIT ARIS

Revision:
32:f211b8c28273
Parent:
31:f03c183e2bf6
--- a/main.cpp	Fri Aug 03 16:34:24 2018 +0000
+++ b/main.cpp	Wed Aug 08 20:12:26 2018 +0000
@@ -29,6 +29,9 @@
 #include "mbed-trace/mbed_trace.h"
 #define TRACE_GROUP "MAIN"
 
+// Huot Added LSM303AGR_ACC
+#include "LSM303AGRAccSensor.h"
+
 using namespace events;
 
 // Max payload size can be LORAMAC_PHY_MAXPAYLOAD.
@@ -37,6 +40,12 @@
 uint8_t tx_buffer[30];
 uint8_t rx_buffer[30];
 
+// ACCELEROMETER AXES VARIABLE INITIALIZATION
+int x = 0;
+bool interruptOccured = false;
+
+int32_t axes[3];
+
 /*
  * Sets up an application dependent transmission timer in ms. Used only when Duty Cycling is off for testing
  */
@@ -96,11 +105,21 @@
 double mylat;
 double mylon;
 
-#define NEOM8M_ADR_GPS (0x42 >> 1)
-#define LSM303_ADR_ACC (0x32 >> 1)
-#define LSM303_ADR_MAG (0x3C >> 1)
+#define NEOM8M_ADR_GPS 0x42
+#define LSM303_ADR_ACC 0x32
+#define LSM303_ADR_MAG 0x3C
+
+// ------ HUOT Change
+// Had to change I2C to use DevI2C to get below LSM303AGRAccSensor Constructor to function
+static DevI2C i2c(PB_9, PB_8);
 
-I2C i2c(PB_9, PB_8);
+static LSM303AGRAccSensor accel(&i2c, LSM303_ADR_ACC, PB_14);
+
+InterruptIn accelPin(PB_14);
+
+void accelRunning();
+void accelSetup();
+
 
 /**
  * Entry point for application
@@ -115,6 +134,30 @@
 
     printf("\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n");
     
+    // HUOT -- ACCCELEROMETER SENSOR SETUP
+    accelSetup();
+    
+    while (true) {
+        if (interruptOccured) {
+            printf("+++++++ INTERRUPT COUNTER: %d +++++++ \r\n", x);
+            
+            // Write to all accel regs to configure interrupt.
+            accel.write_reg(LSM303AGR_ACC_INT1_CFG, 0x2A);
+            printf("Enable X and Y Axes High Interrupt Events. \r\n");
+
+            // READ SOURCE DATA    
+            uint8_t data = 0;
+            accel.read_reg(LSM303AGR_ACC_INT1_SOURCE, &data);
+            printf("DATA = %02x \r\n", data);
+            
+            interruptOccured = false;
+        } else {
+            printf("========= No Interrupt on this pass... ========= \r\n");
+        }
+        
+        wait(4);
+    }
+    
     mytime = 0;
     mybatt = 15;
     mylat = 51.06509;
@@ -198,12 +241,11 @@
     printf("Clock: %d\r\n", tNow);
     mytime = tNow;
     char cmd[2];
-    /*
-    char buf[1024];
-    buf[0] = 0x00;
-    buf[1] = 0x00;
-    buf[2] = 0x00;
-    */
+    
+    //char buf[1024];
+
+// ---------- HUOT COMMENT BLOCK OUT ------
+/*
     char buf;
     //cmd[0] = 0xFF;
     //i2c.write(NEOM8M_ADR_GPS, cmd, 1);
@@ -212,10 +254,18 @@
     cmd[1] = 0x57;
     i2c.write(LSM303_ADR_ACC, cmd, 2);
     cmd[0] = 0x20;
-    i2c.write(LSM303_ADR_ACC, cmd, 1);
+    //i2c.write(LSM303_ADR_ACC, cmd, 1);
     i2c.read(LSM303_ADR_ACC, &buf, 1);
     //i2c.read(LSM303_ADR_ACC, buf, 1);
     printf("Return Value: %02x", buf);
+*/    
+
+/*  HUOT -- TEST OF ACCELEROMETER GET DATA FROM AXES  
+    if (x % 2 == 0) {
+        accel.get_x_axes(axes);
+        printf("LSM303AGR [acc/mg]:      %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);    
+    }
+*/   
     int ilat = (int)(mylat * 100000);
     int ilon = (int)(mylon * 100000);
     packet_len = 11;
@@ -253,6 +303,9 @@
     }
 
     printf("\r\n %d bytes scheduled for transmission \r\n", retcode);
+    
+    x += 1;
+    
     memset(tx_buffer, 0, sizeof(tx_buffer));
 }
 
@@ -340,4 +393,109 @@
     }
 }
 
+void accelRunning()
+{
+    interruptOccured = true;
+    x++;
+    
+//    printf("++++++++++++++  Interrupt Called! Get Drunk! +++++++++++++++++++ \r\n");
+    
+//    printf("COUNTER: ---- %d \r\n", x++);
+    
+//    uint8_t srcData;
+//    accel.read_reg(LSM303AGR_ACC_INT1_SOURCE, &srcData);
+//    printf("SRC DATA = %02x \r\n", srcData);
+    
+    // accel.get_x_axes(axes);
+    // printf("LSM303AGR [acc/mg]:      %6ld, %6ld, %6ld\r\n", axes[0], axes[1], axes[2]);
+}
+
+// ---- HUOT ACCEL SETUP
+void accelSetup()
+{
+    int initCode = accel.init(NULL);
+    printf("INIT CODE = %d \r\n", initCode);
+    
+    int enableCode = accel.enable();
+    printf("ENABLE CODE = %d \r\n", enableCode);
+    
+/* HP FILTER BYPASS
+    // SETUP INTERRUPT
+    // ODR = 100 Hz
+    accel.write_reg(LSM303AGR_ACC_CTRL_REG1, 0x67);
+    printf("ODR Set \r\n");
+    // High-Pass filter Disabled
+    accel.write_reg(LSM303AGR_ACC_CTRL_REG2, 0x00);
+    printf("HP Filter Disabled \r\n");
+    // Interrupt Driven to INT1 pad
+    accel.write_reg(LSM303AGR_ACC_CTRL_REG3, 0x40);
+    printf("INT1 Pad \r\n");
+    // Full Scale = 2 g
+    accel.write_reg(LSM303AGR_ACC_CTRL_REG4, 0x00);
+    printf("Full Scale set at 2G's \r\n");
+    // Interrupt Latched
+    accel.write_reg(LSM303AGR_ACC_CTRL_REG5, 0x08);
+    printf("Interrupt Latched \r\n");
+    // Threshold = 250 mg
+    accel.write_reg(LSM303AGR_ACC_INT1_THS, 0x01);
+    printf("Threshold set at XXX mg's \r\n");
+    // Duration Set
+    accel.write_reg(LSM303AGR_ACC_INT1_DURATION, 0x00);
+    printf("Duration set to 0");
+    // Enable X-High and Y-High Interrupt Generation
+    accel.write_reg(LSM303AGR_ACC_INT1_CFG, 0x05);
+    printf("Enable X and Y Axes High Interrupt Events. \r\n");
+*/    
+    // SETUP INTERRUPT
+    // ODR = 100 Hz
+    accel.write_reg(LSM303AGR_ACC_CTRL_REG1, 0x67);
+    printf("ODR Set \r\n");
+    // High-Pass filter Enabled
+    accel.write_reg(LSM303AGR_ACC_CTRL_REG2, 0x09);
+    printf("HP Filter Enabled \r\n");
+    // Interrupt Driven to INT1 pad
+    accel.write_reg(LSM303AGR_ACC_CTRL_REG3, 0x40);
+    printf("INT1 Pad \r\n");
+    // Full Scale = 2 g
+    accel.write_reg(LSM303AGR_ACC_CTRL_REG4, 0x00);
+    printf("Full Scale set at 2G's \r\n");
+    // Interrupt Latched
+    accel.write_reg(LSM303AGR_ACC_CTRL_REG5, 0x08);
+    printf("Interrupt Latched \r\n");
+
+    accel.write_reg(LSM303AGR_ACC_INT1_THS, 0x01);
+    printf("Threshold set at XXX mg's \r\n");
+    // Duration Set
+    accel.write_reg(LSM303AGR_ACC_INT1_DURATION, 0x00);
+    printf("Duration set to 0");
+    
+    // DUMMY READ TO FORCE HP FILTER TO CURRENT ACCELERATION VALUE
+    uint8_t read_ref;
+    accel.read_reg(LSM303AGR_ACC_REFERENCE, &read_ref);
+    
+    // Enable X-High, Y-High and Z-High Interrupt Generation
+    accel.write_reg(LSM303AGR_ACC_INT1_CFG, 0x2A);
+    printf("Enable X and Y Axes High Interrupt Events. \r\n");
+    
+    accelPin.rise(&accelRunning);
+
+    // ATTEMPT TO READ SOURCE DATA    
+    uint8_t data = 0;
+    accel.read_reg(LSM303AGR_ACC_INT1_SOURCE, &data);
+    printf("DATA = %02x \r\n", data);
+
+
+//    uint8_t data = 0;
+//
+//    accel.read_reg(, &data);
+//    printf("DATA = %02x \r\n", data);
+//    
+//    uint8_t srcData;
+//    accel.read_reg(LSM303AGR_ACC_INT1_SOURCE, &srcData);
+//    printf("SRC DATA = %02x \r\n", srcData);
+    
+
+    
+}
+
 // EOF