Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: Custom_LSM303 Custom_UBloxGPS LRAT-mbed-os USBDevice mbed-lora-radio-drv stm32EEPROM
Fork of LRAT-example-lorawan by
Diff: main.cpp
- Revision:
- 34:341fb423e74b
- Parent:
- 33:e47306c32791
- Child:
- 35:73b3963c6dd3
--- a/main.cpp Wed Aug 15 22:16:56 2018 +0000 +++ b/main.cpp Tue Aug 21 14:56:58 2018 +0000 @@ -14,10 +14,10 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +//#define TARGET_LRAT 1 +//#define SENSOR_TEMP 1 #include <stdio.h> #include "mbed.h" -//#include "unsupported/USBDevice/USBSerial/USBSerial.h" -#include "USBSerial.h" #include "lorawan/LoRaWANInterface.h" #include "lorawan/system/lorawan_data_structures.h" @@ -93,6 +93,14 @@ */ static lorawan_app_callbacks_t callbacks; +#if defined(TARGET_LRAT) +#include "USBSerial.h" +USBSerial serial; +FileHandle* mbed::mbed_override_console(int) { + return &serial; +} +#endif + int mytime = 0; int mybatt = 0; double mylat = 0; @@ -124,22 +132,23 @@ int16_t magMaxZ = 0; #define NEOM8M_ADR_GPS 0x84 -#define LSM303_ADR_ACC 0x32 +//#define LSM303_ADR_ACC 0x32 #define LSM303_ADR_MAG 0x3C #define NEOM8M_REG_GPS_LENH 0xFD #define NEOM8M_REG_GPS_LENL 0xFE #define NEOM8M_REG_GPS_DATA 0xFE #define LSM303_REG_ACC_STATUS_REG_AUX_A 0x07 -#define LSM303_REG_ACC_OUT_TEMP_L_A 0x0C -#define LSM303_REG_ACC_OUT_TEMP_H_A 0x0D +//#define LSM303_REG_ACC_OUT_TEMP_L_A 0x0C +//#define LSM303_REG_ACC_OUT_TEMP_H_A 0x0D #define LSM303_REG_ACC_WHO_AM_I_A 0x0F -#define LSM303_REG_ACC_TEMP_CFG_REG_A 0x1F +//#define LSM303_REG_ACC_TEMP_CFG_REG_A 0x1F #define LSM303_REG_ACC_CTRL_REG1_A 0x20 #define LSM303_REG_ACC_CTRL_REG2_A 0x21 #define LSM303_REG_ACC_CTRL_REG3_A 0x22 #define LSM303_REG_ACC_CTRL_REG4_A 0x23 #define LSM303_REG_ACC_CTRL_REG5_A 0x24 +#define LSM303_REG_ACC_CTRL_REG6_A 0x25 #define LSM303_REG_ACC_STATUS_REG_A 0x27 #define LSM303_REG_ACC_OUT_X_L_A 0x28 #define LSM303_REG_ACC_OUT_X_H_A 0x29 @@ -151,29 +160,88 @@ #define LSM303_REG_ACC_INT1_SRC_A 0x31 #define LSM303_REG_ACC_INT1_THS_A 0x32 #define LSM303_REG_ACC_INT1_DURATION_A 0x33 +/* //#define LSM303_REG_MAG_CRA_REG_M 0x00 //#define LSM303_REG_MAG_MR_REG_M 0x02 +*/ #define LSM303_REG_MAG_OFFSET_X_REG_L_M 0x45 #define LSM303_REG_MAG_OFFSET_X_REG_H_M 0x46 #define LSM303_REG_MAG_OFFSET_Y_REG_L_M 0x47 #define LSM303_REG_MAG_OFFSET_Y_REG_H_M 0x48 #define LSM303_REG_MAG_OFFSET_Z_REG_L_M 0x49 #define LSM303_REG_MAG_OFFSET_Z_REG_H_M 0x4A -#define LSM303_REG_MAG_WHO_AM_I_M 0x4F -#define LSM303_REG_MAG_CFG_REG_A_M 0x60 -#define LSM303_REG_MAG_CFG_REG_C_M 0x62 +//#define LSM303_REG_MAG_WHO_AM_I_M 0x4F +//#define LSM303_REG_MAG_CFG_REG_A_M 0x60 +//#define LSM303_REG_MAG_CFG_REG_B_M 0x61 +//#define LSM303_REG_MAG_CFG_REG_C_M 0x62 #define LSM303_REG_MAG_INT_CTRL_REG_M 0x63 #define LSM303_REG_MAG_INT_SOURCE_REG_M 0x64 #define LSM303_REG_MAG_INT_THS_L_REG_M 0x65 #define LSM303_REG_MAG_INT_THS_H_REG_M 0x66 -#define LSM303_REG_MAG_STATUS_REG_M 0x67 -#define LSM303_REG_MAG_OUTX_L_REG_M 0x68 -#define LSM303_REG_MAG_OUTX_H_REG_M 0x69 -#define LSM303_REG_MAG_OUTY_L_REG_M 0x6A -#define LSM303_REG_MAG_OUTY_H_REG_M 0x6B -#define LSM303_REG_MAG_OUTZ_L_REG_M 0x6C -#define LSM303_REG_MAG_OUTZ_H_REG_M 0x6D +//#define LSM303_REG_MAG_STATUS_REG_M 0x67 +//#define LSM303_REG_MAG_OUTX_L_REG_M 0x68 +//#define LSM303_REG_MAG_OUTX_H_REG_M 0x69 +//#define LSM303_REG_MAG_OUTY_L_REG_M 0x6A +//#define LSM303_REG_MAG_OUTY_H_REG_M 0x6B +//#define LSM303_REG_MAG_OUTZ_L_REG_M 0x6C +//#define LSM303_REG_MAG_OUTZ_H_REG_M 0x6D +#if defined(TARGET_LRAT) + #define LEDR PB_6 + #define LEDG PB_7 + #define LEDB PB_5 + #define LEDW PB_2 + #define LSM303_ADR_ACC 0x3A + #define LSM303_REG_MAG_WHO_AM_I_M 0x0F + #define LSM303_WHO_ACC 0x41 + #define LSM303_WHO_MAG 0x3D + #define LSM303_CTRL_REG7_A 0x26 + #define LSM303_REG_MAG_CTRL_REG1_M 0x20 + #define LSM303_REG_MAG_CTRL_REG2_M 0x21 + #define LSM303_REG_MAG_CTRL_REG3_M 0x22 + #define LSM303_REG_MAG_CTRL_REG4_M 0x23 + #define LSM303_REG_MAG_CTRL_REG5_M 0x24 + #define LSM303_REG_MAG_STATUS_REG_M 0x27 + #define LSM303_REG_MAG_OUTX_L_REG_M 0x28 + #define LSM303_REG_MAG_OUTX_H_REG_M 0x29 + #define LSM303_REG_MAG_OUTY_L_REG_M 0x2A + #define LSM303_REG_MAG_OUTY_H_REG_M 0x2B + #define LSM303_REG_MAG_OUTZ_L_REG_M 0x2C + #define LSM303_REG_MAG_OUTZ_H_REG_M 0x2D + #define LSM303_REG_MAG_TEMP_L_M 0x2E + #define LSM303_REG_MAG_TEMP_H_M 0x2F + #define LSM303_REG_MAG_TEMP_CFG_REG_A 0x1F + #define CFG_ACC_ADR LSM303_REG_ACC_CTRL_REG1_A + #define CFG_ACC_LEN 7 + #define CFG_MAG_ADR LSM303_REG_MAG_CTRL_REG1_M + #define CFG_MAG_LEN 5 +#else + #define LEDR PB_7 + #define LEDG PB_5 + #define LEDB PB_6 + #define LEDW PA_5 + #define LSM303_ADR_ACC 0x32 + #define LSM303_REG_MAG_WHO_AM_I_M 0x4F + #define LSM303_WHO_ACC 0x33 + #define LSM303_WHO_MAG 0x40 + #define LSM303_REG_ACC_OUT_TEMP_L_A 0x0C + #define LSM303_REG_ACC_OUT_TEMP_H_A 0x0D + #define LSM303_REG_ACC_TEMP_CFG_REG_A 0x1F + #define LSM303_REG_MAG_CFG_REG_A_M 0x60 + #define LSM303_REG_MAG_CFG_REG_B_M 0x61 + #define LSM303_REG_MAG_CFG_REG_C_M 0x62 + #define LSM303_REG_MAG_STATUS_REG_M 0x67 + #define LSM303_REG_MAG_OUTX_L_REG_M 0x68 + #define LSM303_REG_MAG_OUTX_H_REG_M 0x69 + #define LSM303_REG_MAG_OUTY_L_REG_M 0x6A + #define LSM303_REG_MAG_OUTY_H_REG_M 0x6B + #define LSM303_REG_MAG_OUTZ_L_REG_M 0x6C + #define LSM303_REG_MAG_OUTZ_H_REG_M 0x6D + #define CFG_ACC_ADR LSM303_REG_ACC_TEMP_CFG_REG_A // Start Disco at TEMP CFG. + #define CFG_ACC_LEN 7 + #define CFG_MAG_ADR LSM303_REG_MAG_CFG_REG_A_M + #define CFG_MAG_LEN 3 +#endif I2C i2c(PB_9, PB_8); InterruptIn accPin(PB_14); @@ -203,6 +271,19 @@ char cmdSendLoop[9] = "SendLoop"; +DigitalOut myLedR(LEDR); +DigitalOut myLedG(LEDG); +DigitalOut myLedB(LEDB); +DigitalOut myLedW(LEDW); + +void magInitSequence(); +void accInitSequence(); +void gpsInitSequence(); +void tmpRead(); +void magRead(); +void accRead(); +void gpsRead(); + void onAccIrq() { accHFire++; @@ -215,46 +296,38 @@ void accDumpCfg() { - char start = LSM303_REG_ACC_CTRL_REG1_A; - int i; - for (i = 0; i < 6; i++) + char start = CFG_ACC_ADR; + for (int i = 0; i < CFG_ACC_LEN; i++) { cmd[0] = start + i; i2c.write(LSM303_ADR_ACC, cmd, 1); i2c.read(LSM303_ADR_ACC, &buf[i], 1); } - printf("CFGACC: |%02X %02X %02X %02X %02X %02X|\r\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); + printf("CFGACC: | "); + for (int i = 0; i < CFG_ACC_LEN; i++) + { + printf("%02X ", buf[i]); + } + printf("|\r\n"); } void magDumpCfg() { - char start = LSM303_REG_MAG_CFG_REG_A_M; - int i; - for (i = 0; i < 3; i++) + char start = CFG_MAG_ADR; + for (int i = 0; i < CFG_MAG_LEN; i++) { cmd[0] = start + i; i2c.write(LSM303_ADR_MAG, cmd, 1); i2c.read(LSM303_ADR_MAG, &buf[i], 1); } - printf("CFGMAG: |%02X %02X %02X|\r\n", buf[0], buf[1], buf[2]); + printf("CFGMAG: | "); + for (int i = 0; i < CFG_MAG_LEN; i++) + { + printf("%02X ", buf[i]); + } + printf("|\r\n"); } -#define LEDR PB_7 -#define LEDG PB_5 -#define LEDB PB_6 -//#define LEDW PB_2 - -DigitalOut myLedR(LEDR); -DigitalOut myLedG(LEDG); -DigitalOut myLedB(LEDB); -//DigitalOut myLedW(LEDW); - -/*int myLedR = 0; -int myLedG = 0; -int myLedB = 0; -int myLedW = 0;*/ -//uint8_t myFoo; - /** * Entry point for application */ @@ -262,67 +335,17 @@ { wait(4); printf("\r\n-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-\r\n"); - USBSerial serial; -/* printf("Turning the lights on...\r\n"); - myLedR = 1; - myLedG = 1; - myLedB = 1; - myLedW = 1; - printf("The lights are on.\r\n"); - wait(0.5); - printf("Turning the lights off...\r\n"); - myLedR = 0; - myLedG = 0; - myLedB = 0; - myLedW = 0; - printf("The lights are off.\r\n"); - wait(0.5); - printf("Turning the lights on...\r\n"); - myLedR = 1; - myLedG = 1; - myLedB = 1; - myLedW = 1; - printf("The lights are on.\r\n"); - wait(0.5); - printf("Turning the lights off...\r\n"); - myLedR = 0; - myLedG = 0; - myLedB = 0; - myLedW = 0; - printf("The lights are off.\r\n"); - printf("Initializing USBSerial.\r\n"); - USBSerial serial; - printf("USBSerial initialized.\r\n");*/ - int myFoo = 1; - while(1) + + // Boot Flash + for (int i = 0; i <= 64; i++) { - myLedR = 1; - //serial.printf("LED = Red\r\n"); - wait(0.5); - myLedR = 0; - myLedG = 1; - //serial.printf("LED = Green\r\n"); - wait(0.5); - myLedG = 0; - myLedB = 1; - //serial.printf("LED = Blue\r\n"); - wait(0.5); - myLedB = 0; - //myLedW = 1; - //serial.printf("LED = White\r\n"); - //wait(0.5); - //myLedW = 0; - if (myFoo % 6 == 0) - { - myLedR = 1; - myLedG = 1; - myLedB = 1; - //myLedW = 1; - } - myFoo++; + myLedR = i & 0x01; + myLedG = i & 0x02; + myLedB = i & 0x04; + myLedW = i & 0x08; + wait(0.01); } - - + wait(4); // setup tracing setup_trace(); @@ -330,163 +353,33 @@ // stores the status of a call to LoRaWAN protocol lorawan_status_t retcode; - wait(4); - - printf("\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n"); - + /* I2C init */ + ret = 0x00; + magDumpCfg(); + accDumpCfg(); + magInitSequence(); + accInitSequence(); + gpsInitSequence(); magDumpCfg(); accDumpCfg(); - /* I2C init */ - ret = 0x00; - - cmd[0] = LSM303_REG_MAG_WHO_AM_I_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &ret, 1); - res = (ret == 0x40 ? sPass : sFail); - printf("MAG WhoAmI: %02x %s\r\n", ret, res); - - cmd[0] = LSM303_REG_MAG_CFG_REG_A_M; - cmd[1] = 0x00; // Mag = 10 Hz (high-resolution and continuous mode) - i2c.write(LSM303_ADR_MAG, cmd, 2); - cmd[0] = LSM303_REG_MAG_CFG_REG_C_M; - //cmd[1] = 0x01; // Mag data-ready interrupt enable - cmd[1] = 0x40; // Mag enable interrupt on pin - i2c.write(LSM303_ADR_MAG, cmd, 2); - cmd[0] = LSM303_REG_MAG_CFG_REG_A_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &ret, 1); - printf("MAG RetVal: %02x\r\n", ret); - - cmd[0] = LSM303_REG_ACC_WHO_AM_I_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &ret, 1); - res = (ret == 0x33 ? sPass : sFail); - printf("ACC WhoAmI: %02x %s\r\n", ret, res); - - cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; - cmd[1] = 0x57; // Accel = 100 Hz (normal mode) - i2c.write(LSM303_ADR_ACC, cmd, 2); + cfg = 0x00; +#if defined(TARGET_LRAT) cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; i2c.write(LSM303_ADR_ACC, cmd, 1); i2c.read(LSM303_ADR_ACC, &ret, 1); - printf("ACC RetVal: %02x\r\n", ret); - - // Enable High Resolution Mode - cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &ret, 1); - cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; - cmd[1] = ret | 0x08; - i2c.write(LSM303_ADR_ACC, cmd, 2); - - // Enable Temp Sensor - cmd[0] = LSM303_REG_ACC_TEMP_CFG_REG_A; - cmd[1] = 0xC0; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &ret, 1); - cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; - cmd[1] = ret | 0x80; - i2c.write(LSM303_ADR_ACC, cmd, 2); - - // Set Full Scale to 4g - /* + cfg |= (ret & 0x80) >> 7; cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; i2c.write(LSM303_ADR_ACC, cmd, 1); i2c.read(LSM303_ADR_ACC, &ret, 1); - cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; - //cmd[1] = ret | 0x30; // 16g - //cmd[1] = (ret & ~0x10) | 0x20; // 8g - cmd[1] = (ret & ~0x20) | 0x10; // 4g - //cmd[1] = ret & ~0x30; // 2g - i2c.write(LSM303_ADR_ACC, cmd, 2); - */ -/* - // IRQ Init from Datasheet. - cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; - cmd[1] = 0xA7; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = LSM303_REG_ACC_CTRL_REG2_A; - cmd[1] = 0x00; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = LSM303_REG_ACC_CTRL_REG3_A; - cmd[1] = 0x40; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; - cmd[1] = 0x00; - //cmd[1] = 0x10; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = LSM303_REG_ACC_CTRL_REG5_A; - cmd[1] = 0x08; - i2c.write(LSM303_ADR_ACC, cmd, 2); -*/ - - magDumpCfg(); - accDumpCfg(); - - /* - // ACC INTERRUPT SETUP - // Enable Interrupt Pin - cmd[0] = LSM303_REG_ACC_CTRL_REG3_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &ret, 1); - cmd[0] = LSM303_REG_ACC_CTRL_REG3_A; - cmd[1] = ret | 0x40; - i2c.write(LSM303_ADR_ACC, cmd, 2); - // Enable Interrupt Latch - cmd[0] = LSM303_REG_ACC_CTRL_REG5_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &ret, 1); - cmd[0] = LSM303_REG_ACC_CTRL_REG5_A; - cmd[1] = ret | 0x08; - i2c.write(LSM303_ADR_ACC, cmd, 2); - - // Set Threshold/Duration/Config - cmd[0] = LSM303_REG_ACC_INT1_THS_A; - //cmd[1] = 0x10; - //cmd[1] = 0x40; - //cmd[1] = 0x60; - cmd[1] = 0x7D; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = LSM303_REG_ACC_INT1_DURATION_A; - cmd[1] = 0x00; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = LSM303_REG_ACC_INT1_CFG_A; - cmd[1] = 0x2A; - //cmd[1] = 0x0A; - i2c.write(LSM303_ADR_ACC, cmd, 2); - //accPin.rise(&onAccIrq); - */ - - - /* - // MAG INTERRUPT SETUP - cmd[0] = LSM303_REG_MAG_INT_THS_L_REG_M; - cmd[1] = 0xF4; - i2c.write(LSM303_ADR_MAG, cmd, 2); - cmd[0] = LSM303_REG_MAG_INT_THS_H_REG_M; - cmd[1] = 0x01; - i2c.write(LSM303_ADR_MAG, cmd, 2); - cmd[0] = LSM303_REG_MAG_INT_CTRL_REG_M; - cmd[1] = 0xE7; - i2c.write(LSM303_ADR_MAG, cmd, 2); - magPin.rise(&onMagIrq); - */ - - - /*while(1) - { - time_t tNow = time(NULL); - cmd[0] = LSM303_REG_ACC_INT1_SRC_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &ret, 1); - printf("%08X - %02X - IRQ: %d\r\n", tNow, ret, irqFired); - wait(1); - }*/ - - cfg = 0x00; + accScale = 1 << (!(ret & 0x30) ? 0 : ((ret & 0x30) >> 4) - 1); + cmd[0] = LSM303_REG_MAG_CTRL_REG2_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &ret, 1); + cfg |= (ret & 0x60) >> 1; + //accShift = 0; // Full 16-bit resolution + accShift = 4; +#else cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; i2c.write(LSM303_ADR_ACC, cmd, 1); i2c.read(LSM303_ADR_ACC, &ret, 1); @@ -506,210 +399,21 @@ accShift = 4; else accShift = 6; +#endif printf("Quality: %02x AccShift: %d AccScale: %d\r\n", cfg, accShift, accScale); - - /* - while(1) - { - cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &rda, 1); - if (rda & 0x04) - { - cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[0], 1); - cmd[0] = LSM303_REG_ACC_OUT_TEMP_H_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[1], 1); - myTemp = (int16_t)(buf[0] | (buf[1] << 8)) >> 6; - printf("TMP: |%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp); - } - } - */ - - /* - while(1) - { - cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A | 0x80; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[0], 7); - if (buf[0] & 0x04) - { - myTemp = (int16_t)(buf[5] | (buf[6] << 8)) >> 6; - printf("TMP: |%02X %02X %02X| (%d)\r\n", buf[0], buf[5], buf[6], myTemp); - } - } - */ - /* while(1) { - cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &rda, 1); - if (rda & 0x04) - { - cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A | 0x80; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[0], 2); - myTemp = (int16_t)(buf[0] | (buf[1] << 8)) >> 6; - printf("TMP: |%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp); - } - } - */ - - cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &rda, 1); - if (rda & 0x04) - { - cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A | 0x80; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[0], 2); - myTemp = (int16_t)(buf[0] | (buf[1] << 8)) >> 6; - printf("TMP: |%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp); - } - -/* - //wait(8); - - while(1) { - cmd[0] = LSM303_REG_MAG_STATUS_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &rda, 1); - if (rda) - { - cmd[0] = LSM303_REG_MAG_OUTX_L_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[0], 1); - cmd[0] = LSM303_REG_MAG_OUTX_H_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[1], 1); - cmd[0] = LSM303_REG_MAG_OUTY_L_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[2], 1); - cmd[0] = LSM303_REG_MAG_OUTY_H_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[3], 1); - cmd[0] = LSM303_REG_MAG_OUTZ_L_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[4], 1); - cmd[0] = LSM303_REG_MAG_OUTZ_H_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[5], 1); - myMagX = (buf[0] | (buf[1] << 8)); - myMagY = (buf[2] | (buf[3] << 8)); - myMagZ = (buf[4] | (buf[5] << 8)); - if (myMagX < magMinX) - magMinX = myMagX; - if (myMagY < magMinY) - magMinY = myMagY; - if (myMagZ < magMinZ) - magMinZ = myMagZ; - if (myMagX > magMaxX) - magMaxX = myMagX; - if (myMagY > magMaxY) - magMaxY = myMagY; - if (myMagZ > magMaxZ) - magMaxZ = myMagZ; - //printf("MAG: |%02X %02X %02X %02X %02X %02X| (%d,%d,%d)\r\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], myMagX, myMagY, myMagZ); - cmd[0] = LSM303_REG_MAG_INT_SOURCE_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &ret, 1); - if (ret & 0x01 && magEvent == 0 && ret & 0xFC) - { - magSFire++; - magEvent = 1; - magSHIRQ++; + time_t tNow = time(NULL); + printf("Clock: %d\r\n", tNow); +#if defined(SENSOR_TEMP) + tmpRead(); +#endif + magRead(); + accRead(); + gpsRead(); + wait(4); } - else if (!(ret & 0x01) && magEvent == 1 && !(ret & 0xFC)) - { - magSFire++; - magEvent = 0; - magSLIRQ++; - } - printf("M|%02X|%02X %02X %02X %02X %02X %02X|%*d,%*d,%*d|%*d,%*d,%*d|%*d,%*d,%*d|%02X|%02X/%02X %02X/%02X\r\n", rda, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], 6, myMagX, 6, myMagY, 6, myMagZ, 6, magMinX, 6, magMinY, 6, magMinZ, 6, magMaxX, 6, magMaxY, 6, magMaxZ, ret, magSHIRQ, magSLIRQ, magSFire, magHFire); - } - - cmd[0] = LSM303_REG_ACC_STATUS_REG_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &rda, 1); - if (rda) - { - cmd[0] = LSM303_REG_ACC_OUT_X_L_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[0], 1); - cmd[0] = LSM303_REG_ACC_OUT_X_H_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[1], 1); - cmd[0] = LSM303_REG_ACC_OUT_Y_L_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[2], 1); - cmd[0] = LSM303_REG_ACC_OUT_Y_H_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[3], 1); - cmd[0] = LSM303_REG_ACC_OUT_Z_L_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[4], 1); - cmd[0] = LSM303_REG_ACC_OUT_Z_H_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[5], 1); - myAccX = ((int16_t)(buf[0] | (buf[1] << 8)) >> accShift); - myAccY = ((int16_t)(buf[2] | (buf[3] << 8)) >> accShift); - myAccZ = ((int16_t)(buf[4] | (buf[5] << 8)) >> accShift); - if (myAccX < accMinX) - accMinX = myAccX; - if (myAccY < accMinY) - accMinY = myAccY; - if (myAccZ < accMinZ) - accMinZ = myAccZ; - if (myAccX > accMaxX) - accMaxX = myAccX; - if (myAccY > accMaxY) - accMaxY = myAccY; - if (myAccZ > accMaxZ) - accMaxZ = myAccZ; - //printf("ACC: |%02X %02X %02X %02X %02X %02X| (%d,%d,%d)\r\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], myAccX, myAccY, myAccZ); - cmd[0] = LSM303_REG_ACC_INT1_SRC_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &ret, 1); - if (ret & 0x40) - { - accSFire++; - if (accEvent == 1) - { - accEvent = 0; - accSLIRQ++; - cmd[0] = LSM303_REG_ACC_INT1_THS_A; - cmd[1] = 0x7D; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = LSM303_REG_ACC_INT1_DURATION_A; - cmd[1] = 0x00; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = LSM303_REG_ACC_INT1_CFG_A; - cmd[1] = 0x2A; - i2c.write(LSM303_ADR_ACC, cmd, 2); - } - else - { - accEvent = 1; - accSHIRQ++; - cmd[0] = LSM303_REG_ACC_INT1_THS_A; - cmd[1] = 0x50; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = LSM303_REG_ACC_INT1_DURATION_A; - //cmd[1] = 0x7D; - cmd[1] = 0x03; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = LSM303_REG_ACC_INT1_CFG_A; - cmd[1] = 0x95; - i2c.write(LSM303_ADR_ACC, cmd, 2); - } - } - printf("A|%02X|%02X %02X %02X %02X %02X %02X|%*d,%*d,%*d|%*d,%*d,%*d|%*d,%*d,%*d|%02X|%04X/%04X %04X/%04X\r\n", rda, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], 5, myAccX, 5, myAccY, 5, myAccZ, 5, accMinX, 5, accMinY, 5, accMinZ, 5, accMaxX, 5, accMaxY, 5, accMaxZ, ret, accSHIRQ, accSLIRQ, accSFire, accHFire); - } - }*/ // Initialize LoRaWAN stack if (lorawan.initialize(&ev_queue) != LORAWAN_STATUS_OK) { @@ -767,7 +471,6 @@ uint16_t packet_len; int16_t retcode; float sensor_value; - bool gpsDone = false; if (ds1820.begin()) { ds1820.startConversion(); @@ -781,7 +484,564 @@ time_t tNow = time(NULL); printf("Clock: %d\r\n", tNow); + +#if defined(SENSOR_TEMP) + tmpRead(); +#endif + magRead(); + accRead(); + gpsRead(); + + int ilat = (int)(mylat * 100000); + int ilon = (int)(mylon * 100000); + printf("TIM: %d, SAT: %d, LAT: %d, LON: %d\r\n", mytime, mybatt, ilat, ilon); + packet_len = 11; + tx_buffer[0] = (mytime >> 24) & 0xFF; + tx_buffer[1] = (mytime >> 16) & 0xFF; + tx_buffer[2] = (mytime >> 8) & 0xFF; + tx_buffer[3] = (mytime >> 0) & 0xFF; + tx_buffer[4] = ((mybatt << 4) & 0xF0) | ((ilat >> 22) & 0x0F); + tx_buffer[5] = (ilat >> 14) & 0xFF; + tx_buffer[6] = (ilat >> 6) & 0xFF; + tx_buffer[7] = ((ilat << 2) & 0xFC) | ((ilon >> 24) & 0x03); + tx_buffer[8] = (ilon >> 16) & 0xFF; + tx_buffer[9] = (ilon >> 8) & 0xFF; + tx_buffer[10] = (ilon >> 0) & 0xFF; + printf("\r\nBUF: |"); + for (int i = 0; i < packet_len; i++) { printf("%02X", tx_buffer[i]); } + printf("|\r\n"); + retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, + MSG_CONFIRMED_FLAG); + if (retcode < 0) { + retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n") + : printf("\r\n send() - Error code %d \r\n", retcode); + + if (retcode == LORAWAN_STATUS_WOULD_BLOCK) { + //retry in 3 seconds + if (MBED_CONF_LORA_DUTY_CYCLE_ON) { + ev_queue.call_in(3000, send_message); + } + } + return; + } + + printf("\r\n %d bytes scheduled for transmission \r\n", retcode); + memset(tx_buffer, 0, sizeof(tx_buffer)); + + //LED Confirmation Output - MESSAGE SENT + for (int i = 0; i < 10; i++) { + myLedG = 1; + wait(0.1); + myLedG = 0; + myLedR = 1; + wait(0.1); + myLedR = 0; + myLedB = 1; + wait(0.1); + myLedB = 0; + } +} + +/** + * Receive a message from the Network Server + */ +static void receive_message() +{ + int16_t retcode; + retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer, + sizeof(rx_buffer), + MSG_CONFIRMED_FLAG|MSG_UNCONFIRMED_FLAG); + + if (retcode < 0) { + printf("\r\n receive() - Error code %d \r\n", retcode); + return; + } + + printf(" Data:"); + + for (uint8_t i = 0; i < retcode; i++) { + printf("%x", rx_buffer[i]); + } + + printf("\r\n Data Length: %d\r\n", retcode); + + /* + int startLoop = 0; + if (strncmp((char *)rx_buffer, cmdSendLoop, 8) == 0) + { + printf("SendLoop Command Received!\r\n"); + startLoop = 1; + } + */ + + memset(rx_buffer, 0, sizeof(rx_buffer)); + /* + if (startLoop) + send_message(); + */ +} + +/** + * Event handler + */ +static void lora_event_handler(lorawan_event_t event) +{ + tr_debug("In lora_event_handler(%d)...", event); + switch (event) { + case CONNECTED: + printf("\r\n Connection - Successful \r\n"); + if (MBED_CONF_LORA_DUTY_CYCLE_ON) { + send_message(); + } else { + ev_queue.call_every(TX_TIMER, send_message); + } + + break; + case DISCONNECTED: + ev_queue.break_dispatch(); + printf("\r\n Disconnected Successfully \r\n"); + break; + case TX_DONE: + printf("\r\n Message Sent to Network Server \r\n"); + if (MBED_CONF_LORA_DUTY_CYCLE_ON) { + send_message(); + } + break; + case TX_TIMEOUT: + case TX_ERROR: + case TX_CRYPTO_ERROR: + case TX_SCHEDULING_ERROR: + printf("\r\n Transmission Error - EventCode = %d \r\n", event); + // try again + if (MBED_CONF_LORA_DUTY_CYCLE_ON) { + send_message(); + } + break; + case RX_DONE: + printf("\r\n Received message from Network Server \r\n"); + receive_message(); + break; + case RX_TIMEOUT: + case RX_ERROR: + printf("\r\n Error in reception - Code = %d \r\n", event); + break; + case JOIN_FAILURE: + printf("\r\n OTAA Failed - Check Keys \r\n"); + break; + case UPLINK_REQUIRED: + printf("\r\n Uplink required by NS \r\n"); + if (MBED_CONF_LORA_DUTY_CYCLE_ON) { + send_message(); + } + break; + default: + MBED_ASSERT("Unknown Event"); + } +} + +void magInitSequence() +{ + myLedR = 0; + myLedG = 0; + cmd[0] = LSM303_REG_MAG_WHO_AM_I_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &ret, 1); + res = (ret == LSM303_WHO_MAG ? sPass : sFail); + printf("MAG WhoAmI: %02X %s\r\n", ret, res); + + if (ret == LSM303_WHO_MAG) + myLedG = 1; + else + myLedR = 1; + + for (int i = 0; i < 2; i++) { + myLedB = 1; + wait(0.3); + myLedB = 0; + wait(0.3); + } + +#if defined(TARGET_LRAT) + cmd[0] = LSM303_REG_MAG_CTRL_REG1_M; + cmd[1] = 0x70; // Ultra-High Performance Mode on XY axes, ODR=10Hz + i2c.write(LSM303_ADR_MAG, cmd, 2); + cmd[0] = LSM303_REG_MAG_CTRL_REG3_M; + cmd[1] = 0x00; // High Resolution? (Full-power), Continuous + i2c.write(LSM303_ADR_MAG, cmd, 2); + cmd[0] = LSM303_REG_MAG_CTRL_REG4_M; + cmd[1] = 0x0C; // Ultra-High Performance Mode on Z axis + i2c.write(LSM303_ADR_MAG, cmd, 2); + #if defined(SENSOR_TEMP) + // Enable Temp Sensor + cmd[0] = LSM303_REG_MAG_CTRL_REG1_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &ret, 1); + cmd[0] = LSM303_REG_MAG_CTRL_REG1_M; + cmd[1] = ret | 0x80; + i2c.write(LSM303_ADR_MAG, cmd, 2); + /* + cmd[0] = LSM303_REG_MAG_CTRL_REG5_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &ret, 1); + cmd[0] = LSM303_REG_MAG_CTRL_REG5_M; + cmd[1] = ret | 0x40; + i2c.write(LSM303_ADR_MAG, cmd, 2); + */ + #endif +#else + cmd[0] = LSM303_REG_MAG_CFG_REG_A_M; + cmd[1] = 0x00; // Mag = 10 Hz (high-resolution and continuous mode) + i2c.write(LSM303_ADR_MAG, cmd, 2); + cmd[0] = LSM303_REG_MAG_CFG_REG_C_M; + //cmd[1] = 0x01; // Mag data-ready interrupt enable + cmd[1] = 0x40; // Mag enable interrupt on pin + i2c.write(LSM303_ADR_MAG, cmd, 2); +#endif + + for (int i = 0; i < 2; i++) { + myLedR = 1; + myLedG = 1; + myLedB = 1; + wait(0.5); + myLedR = 0; + myLedG = 0; + myLedB = 0; + wait(0.5); + } + /* + // MAG INTERRUPT SETUP + cmd[0] = LSM303_REG_MAG_INT_THS_L_REG_M; + cmd[1] = 0xF4; + i2c.write(LSM303_ADR_MAG, cmd, 2); + cmd[0] = LSM303_REG_MAG_INT_THS_H_REG_M; + cmd[1] = 0x01; + i2c.write(LSM303_ADR_MAG, cmd, 2); + cmd[0] = LSM303_REG_MAG_INT_CTRL_REG_M; + cmd[1] = 0xE7; + i2c.write(LSM303_ADR_MAG, cmd, 2); + magPin.rise(&onMagIrq); + */ +} + +void accInitSequence() +{ + myLedR = 0; + myLedG = 0; + cmd[0] = LSM303_REG_ACC_WHO_AM_I_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &ret, 1); + res = (ret == LSM303_WHO_ACC ? sPass : sFail); + printf("ACC WhoAmI: %02X %s\r\n", ret, res); + + if (ret == LSM303_WHO_ACC) + myLedG = 1; + else + myLedR = 1; + + for (int i = 0; i < 2; i++) { + myLedB = 1; + wait(0.3); + myLedB = 0; + wait(0.3); + } + +#if defined(TARGET_LRAT) + cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; + cmd[1] = 0xB7; // High Resolution, ODR=100Hz, Enable XYZ Axes + i2c.write(LSM303_ADR_ACC, cmd, 2); +#else + cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; + cmd[1] = 0x57; // Enable XYZ Axes, ODR=100Hz + i2c.write(LSM303_ADR_ACC, cmd, 2); + + // Enable High Resolution Mode + cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &ret, 1); + cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; + cmd[1] = ret | 0x08; // High Resolution + i2c.write(LSM303_ADR_ACC, cmd, 2); + + #if defined(SENSOR_TEMP) + // Enable Temp Sensor + cmd[0] = LSM303_REG_ACC_TEMP_CFG_REG_A; + cmd[1] = 0xC0; + i2c.write(LSM303_ADR_ACC, cmd, 2); + cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &ret, 1); + cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; + cmd[1] = ret | 0x80; + i2c.write(LSM303_ADR_ACC, cmd, 2); + #endif +#endif + + //LED Confirmation Output - ACC INIT COMPLETE + for (int i = 0; i < 2; i++) { + myLedR = 1; + myLedG = 1; + myLedB = 1; + wait(0.5); + myLedR = 0; + myLedG = 0; + myLedB = 0; + wait(0.5); + } + + // Set Full Scale to 4g + /* + cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &ret, 1); + cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; + //cmd[1] = ret | 0x30; // 16g + //cmd[1] = (ret & ~0x10) | 0x20; // 8g + cmd[1] = (ret & ~0x20) | 0x10; // 4g + //cmd[1] = ret & ~0x30; // 2g + i2c.write(LSM303_ADR_ACC, cmd, 2); + */ +/* + // IRQ Init from Datasheet. + cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; + cmd[1] = 0xA7; + i2c.write(LSM303_ADR_ACC, cmd, 2); + cmd[0] = LSM303_REG_ACC_CTRL_REG2_A; + cmd[1] = 0x00; + i2c.write(LSM303_ADR_ACC, cmd, 2); + cmd[0] = LSM303_REG_ACC_CTRL_REG3_A; + cmd[1] = 0x40; + i2c.write(LSM303_ADR_ACC, cmd, 2); + cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; + cmd[1] = 0x00; + //cmd[1] = 0x10; + i2c.write(LSM303_ADR_ACC, cmd, 2); + cmd[0] = LSM303_REG_ACC_CTRL_REG5_A; + cmd[1] = 0x08; + i2c.write(LSM303_ADR_ACC, cmd, 2); +*/ + /* + // ACC INTERRUPT SETUP + // Enable Interrupt Pin + cmd[0] = LSM303_REG_ACC_CTRL_REG3_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &ret, 1); + cmd[0] = LSM303_REG_ACC_CTRL_REG3_A; + cmd[1] = ret | 0x40; + i2c.write(LSM303_ADR_ACC, cmd, 2); + // Enable Interrupt Latch + cmd[0] = LSM303_REG_ACC_CTRL_REG5_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &ret, 1); + cmd[0] = LSM303_REG_ACC_CTRL_REG5_A; + cmd[1] = ret | 0x08; + i2c.write(LSM303_ADR_ACC, cmd, 2); + + // Set Threshold/Duration/Config + cmd[0] = LSM303_REG_ACC_INT1_THS_A; + //cmd[1] = 0x10; + //cmd[1] = 0x40; + //cmd[1] = 0x60; + cmd[1] = 0x7D; + i2c.write(LSM303_ADR_ACC, cmd, 2); + cmd[0] = LSM303_REG_ACC_INT1_DURATION_A; + cmd[1] = 0x00; + i2c.write(LSM303_ADR_ACC, cmd, 2); + cmd[0] = LSM303_REG_ACC_INT1_CFG_A; + cmd[1] = 0x2A; + //cmd[1] = 0x0A; + i2c.write(LSM303_ADR_ACC, cmd, 2); + //accPin.rise(&onAccIrq); + */ +} + +void gpsInitSequence() +{ + myLedG = 1; + myLedR = 1; + + // LED Confirmation Output - GPS + for (int i = 0; i < 2; i++) { + myLedB = 1; + wait(0.3); + myLedB = 0; + wait(0.3); + } + myLedG = 0; + myLedR = 0; +} + +void magRead() +{ + cmd[0] = LSM303_REG_MAG_STATUS_REG_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &rda, 1); + if (rda) + { + cmd[0] = LSM303_REG_MAG_OUTX_L_REG_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &buf[0], 1); + cmd[0] = LSM303_REG_MAG_OUTX_H_REG_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &buf[1], 1); + cmd[0] = LSM303_REG_MAG_OUTY_L_REG_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &buf[2], 1); + cmd[0] = LSM303_REG_MAG_OUTY_H_REG_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &buf[3], 1); + cmd[0] = LSM303_REG_MAG_OUTZ_L_REG_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &buf[4], 1); + cmd[0] = LSM303_REG_MAG_OUTZ_H_REG_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &buf[5], 1); + myMagX = (buf[0] | (buf[1] << 8)); + myMagY = (buf[2] | (buf[3] << 8)); + myMagZ = (buf[4] | (buf[5] << 8)); + if (myMagX < magMinX) + magMinX = myMagX; + if (myMagY < magMinY) + magMinY = myMagY; + if (myMagZ < magMinZ) + magMinZ = myMagZ; + if (myMagX > magMaxX) + magMaxX = myMagX; + if (myMagY > magMaxY) + magMaxY = myMagY; + if (myMagZ > magMaxZ) + magMaxZ = myMagZ; + cmd[0] = LSM303_REG_MAG_INT_SOURCE_REG_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &ret, 1); + if (ret & 0x01 && magEvent == 0 && ret & 0xFC) + { + magSFire++; + magEvent = 1; + magSHIRQ++; + } + else if (!(ret & 0x01) && magEvent == 1 && !(ret & 0xFC)) + { + magSFire++; + magEvent = 0; + magSLIRQ++; + } + printf("M|%02X|%02X %02X %02X %02X %02X %02X|%*d,%*d,%*d|%*d,%*d,%*d|%*d,%*d,%*d|%02X|%02X/%02X %02X/%02X\r\n", rda, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], 6, myMagX, 6, myMagY, 6, myMagZ, 6, magMinX, 6, magMinY, 6, magMinZ, 6, magMaxX, 6, magMaxY, 6, magMaxZ, ret, magSHIRQ, magSLIRQ, magSFire, magHFire); + } +} + +void accRead() +{ + cmd[0] = LSM303_REG_ACC_STATUS_REG_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &rda, 1); + if (rda) + { + cmd[0] = LSM303_REG_ACC_OUT_X_L_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &buf[0], 1); + cmd[0] = LSM303_REG_ACC_OUT_X_H_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &buf[1], 1); + cmd[0] = LSM303_REG_ACC_OUT_Y_L_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &buf[2], 1); + cmd[0] = LSM303_REG_ACC_OUT_Y_H_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &buf[3], 1); + cmd[0] = LSM303_REG_ACC_OUT_Z_L_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &buf[4], 1); + cmd[0] = LSM303_REG_ACC_OUT_Z_H_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &buf[5], 1); + myAccX = ((int16_t)(buf[0] | (buf[1] << 8)) >> accShift); + myAccY = ((int16_t)(buf[2] | (buf[3] << 8)) >> accShift); + myAccZ = ((int16_t)(buf[4] | (buf[5] << 8)) >> accShift); + if (myAccX < accMinX) + accMinX = myAccX; + if (myAccY < accMinY) + accMinY = myAccY; + if (myAccZ < accMinZ) + accMinZ = myAccZ; + if (myAccX > accMaxX) + accMaxX = myAccX; + if (myAccY > accMaxY) + accMaxY = myAccY; + if (myAccZ > accMaxZ) + accMaxZ = myAccZ; + cmd[0] = LSM303_REG_ACC_INT1_SRC_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &ret, 1); + if (ret & 0x40) + { + accSFire++; + if (accEvent == 1) + { + accEvent = 0; + accSLIRQ++; + cmd[0] = LSM303_REG_ACC_INT1_THS_A; + cmd[1] = 0x7D; + i2c.write(LSM303_ADR_ACC, cmd, 2); + cmd[0] = LSM303_REG_ACC_INT1_DURATION_A; + cmd[1] = 0x00; + i2c.write(LSM303_ADR_ACC, cmd, 2); + cmd[0] = LSM303_REG_ACC_INT1_CFG_A; + cmd[1] = 0x2A; + i2c.write(LSM303_ADR_ACC, cmd, 2); + } + else + { + accEvent = 1; + accSHIRQ++; + cmd[0] = LSM303_REG_ACC_INT1_THS_A; + cmd[1] = 0x50; + i2c.write(LSM303_ADR_ACC, cmd, 2); + cmd[0] = LSM303_REG_ACC_INT1_DURATION_A; + //cmd[1] = 0x7D; + cmd[1] = 0x03; + i2c.write(LSM303_ADR_ACC, cmd, 2); + cmd[0] = LSM303_REG_ACC_INT1_CFG_A; + cmd[1] = 0x95; + i2c.write(LSM303_ADR_ACC, cmd, 2); + } + } + printf("A|%02X|%02X %02X %02X %02X %02X %02X|%*d,%*d,%*d|%*d,%*d,%*d|%*d,%*d,%*d|%02X|%02X/%02X %02X/%02X\r\n", rda, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], 6, myAccX, 6, myAccY, 6, myAccZ, 6, accMinX, 6, accMinY, 6, accMinZ, 6, accMaxX, 6, accMaxY, 6, accMaxZ, ret, accSHIRQ, accSLIRQ, accSFire, accHFire); + } +} + +void tmpRead() +{ + #if defined(TARGET_LRAT) + cmd[0] = LSM303_REG_MAG_TEMP_L_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &buf[0], 1); + cmd[0] = LSM303_REG_MAG_TEMP_H_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &buf[1], 1); + myTemp = (int16_t)(buf[0] | (buf[1] << 8)); + printf("T|%02X %02X| (%d)\r\n", buf[0], buf[1], myTemp); + #else + cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &rda, 1); + if (rda & 0x04) + { + cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A | 0x80; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &buf[0], 2); + myTemp = (int16_t)(buf[0] | (buf[1] << 8)) >> 6; + printf("T|%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp); + } + #endif +} + +void gpsRead() +{ + bool gpsDone = false; + bool fixGood = false; + myLedW = 1; + pos = 0; ret = 0xFF; cmd[0] = 0xFF; i2c.write(NEOM8M_ADR_GPS, cmd, 1); @@ -801,7 +1061,7 @@ if (ret == '\n') { buf[pos] = 0x00; - /* NMEA Validation */ + // NMEA Validation uint16_t crc = 0; char clr; if (buf[0] == '$' && buf[pos-3] == '*') @@ -872,6 +1132,8 @@ int fldDat; sscanf(buf, "$GNRMC,%f,%c,%lf,%c,%lf,%c,%f,,%d", &fldTim, &fldSts, &fldLat, &fldN_S, &fldLon, &fldE_W, &fldSpd, &fldDat); printf("Sec: %.2f, Sts: %c, Lat: %.5f %c, Lon: %.5f %c, Spd: %.3f, Dat: %06d\r\n", fldTim, fldSts, fldLat, fldN_S, fldLon, fldE_W, fldSpd, fldDat); + if (fldSts == 'A') + fixGood = true; } pos = 0; i2c.read(NEOM8M_ADR_GPS, &ret, 1); @@ -894,242 +1156,17 @@ } if (pos > 0) printf("GPS: |%s|\r\n", buf); - - /* - cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &rda, 1); - cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[0], 1); - cmd[0] = LSM303_REG_ACC_OUT_TEMP_H_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[1], 1); - myTemp = (buf[0] | (buf[1] << 8)); - printf("TMP: |%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp); - */ - - cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &rda, 1); - if (rda & 0x04) - { - cmd[0] = LSM303_REG_ACC_OUT_TEMP_L_A | 0x80; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[0], 2); - myTemp = (int16_t)(buf[0] | (buf[1] << 8)) >> 6; - printf("TMP: |%02X %02X %02X| (%d)\r\n", rda, buf[0], buf[1], myTemp); - } - - cmd[0] = LSM303_REG_MAG_STATUS_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &rda, 1); + myLedW = 0; + if (fixGood) + myLedG = 1; + else + myLedR = 1; - cmd[0] = LSM303_REG_MAG_OUTX_L_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[0], 1); - cmd[0] = LSM303_REG_MAG_OUTX_H_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[1], 1); - cmd[0] = LSM303_REG_MAG_OUTY_L_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[2], 1); - cmd[0] = LSM303_REG_MAG_OUTY_H_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[3], 1); - cmd[0] = LSM303_REG_MAG_OUTZ_L_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[4], 1); - cmd[0] = LSM303_REG_MAG_OUTZ_H_REG_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[5], 1); - myMagX = (buf[0] | (buf[1] << 8)); - myMagY = (buf[2] | (buf[3] << 8)); - myMagZ = (buf[4] | (buf[5] << 8)); - printf("MAG: |%02X %02X %02X %02X %02X %02X %02X| (%d,%d,%d)\r\n", rda, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], myMagX, myMagY, myMagZ); - - /* - cmd[0] = LSM303_REG_MAG_OFFSET_X_REG_L_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[0], 1); - cmd[0] = LSM303_REG_MAG_OFFSET_X_REG_H_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[1], 1); - cmd[0] = LSM303_REG_MAG_OFFSET_Y_REG_L_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[2], 1); - cmd[0] = LSM303_REG_MAG_OFFSET_Y_REG_H_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[3], 1); - cmd[0] = LSM303_REG_MAG_OFFSET_Z_REG_L_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[4], 1); - cmd[0] = LSM303_REG_MAG_OFFSET_Z_REG_H_M; - i2c.write(LSM303_ADR_MAG, cmd, 1); - i2c.read(LSM303_ADR_MAG, &buf[5], 1); - myOffX = (buf[0] | (buf[1] << 8)); - myOffY = (buf[2] | (buf[3] << 8)); - myOffZ = (buf[4] | (buf[5] << 8)); - printf("OFF: |%02X %02X %02X %02X %02X %02X| (%d,%d,%d)\r\n", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], myOffX, myOffY, myOffZ); - */ - - cmd[0] = LSM303_REG_ACC_STATUS_REG_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &rda, 1); - - cmd[0] = LSM303_REG_ACC_OUT_X_L_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[0], 1); - cmd[0] = LSM303_REG_ACC_OUT_X_H_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[1], 1); - cmd[0] = LSM303_REG_ACC_OUT_Y_L_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[2], 1); - cmd[0] = LSM303_REG_ACC_OUT_Y_H_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[3], 1); - cmd[0] = LSM303_REG_ACC_OUT_Z_L_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[4], 1); - cmd[0] = LSM303_REG_ACC_OUT_Z_H_A; - i2c.write(LSM303_ADR_ACC, cmd, 1); - i2c.read(LSM303_ADR_ACC, &buf[5], 1); - myAccX = ((int16_t)(buf[0] | (buf[1] << 8)) >> accShift); - myAccY = ((int16_t)(buf[2] | (buf[3] << 8)) >> accShift); - myAccZ = ((int16_t)(buf[4] | (buf[5] << 8)) >> accShift); - printf("ACC: |%02X %02X %02X %02X %02X %02X %02X| (%d,%d,%d)\r\n", rda, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], myAccX, myAccY, myAccZ); - - int ilat = (int)(mylat * 100000); - int ilon = (int)(mylon * 100000); - printf("TIM: %d, SAT: %d, LAT: %d, LON: %d\r\n", mytime, mybatt, ilat, ilon); - packet_len = 11; - tx_buffer[0] = (mytime >> 24) & 0xFF; - tx_buffer[1] = (mytime >> 16) & 0xFF; - tx_buffer[2] = (mytime >> 8) & 0xFF; - tx_buffer[3] = (mytime >> 0) & 0xFF; - tx_buffer[4] = ((mybatt << 4) & 0xF0) | ((ilat >> 22) & 0x0F); - tx_buffer[5] = (ilat >> 14) & 0xFF; - tx_buffer[6] = (ilat >> 6) & 0xFF; - tx_buffer[7] = ((ilat << 2) & 0xFC) | ((ilon >> 24) & 0x03); - tx_buffer[8] = (ilon >> 16) & 0xFF; - tx_buffer[9] = (ilon >> 8) & 0xFF; - tx_buffer[10] = (ilon >> 0) & 0xFF; - printf("\r\nBUF: |"); - int i; - for (i = 0; i < packet_len; i++) { printf("%02x", tx_buffer[i]); } - printf("|\r\n"); - retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, - MSG_CONFIRMED_FLAG); - - if (retcode < 0) { - retcode == LORAWAN_STATUS_WOULD_BLOCK ? printf("send - WOULD BLOCK\r\n") - : printf("\r\n send() - Error code %d \r\n", retcode); - - if (retcode == LORAWAN_STATUS_WOULD_BLOCK) { - //retry in 3 seconds - if (MBED_CONF_LORA_DUTY_CYCLE_ON) { - ev_queue.call_in(3000, send_message); - } - } - return; - } - - printf("\r\n %d bytes scheduled for transmission \r\n", retcode); - memset(tx_buffer, 0, sizeof(tx_buffer)); -} - -/** - * Receive a message from the Network Server - */ -static void receive_message() -{ - int16_t retcode; - retcode = lorawan.receive(MBED_CONF_LORA_APP_PORT, rx_buffer, - sizeof(rx_buffer), - MSG_CONFIRMED_FLAG|MSG_UNCONFIRMED_FLAG); - - if (retcode < 0) { - printf("\r\n receive() - Error code %d \r\n", retcode); - return; - } - - printf(" Data:"); - - for (uint8_t i = 0; i < retcode; i++) { - printf("%x", rx_buffer[i]); - } - - printf("\r\n Data Length: %d\r\n", retcode); - - int startLoop = 0; - if (strncmp((char *)rx_buffer, cmdSendLoop, 8) == 0) - { - printf("SendLoop Command Received!\r\n"); - startLoop = 1; - } - - memset(rx_buffer, 0, sizeof(rx_buffer)); - - if (startLoop) - send_message(); -} - -/** - * Event handler - */ -static void lora_event_handler(lorawan_event_t event) -{ - tr_debug("In lora_event_handler(%d)...", event); - switch (event) { - case CONNECTED: - printf("\r\n Connection - Successful \r\n"); - if (MBED_CONF_LORA_DUTY_CYCLE_ON) { - send_message(); - } else { - ev_queue.call_every(TX_TIMER, send_message); - } - - break; - case DISCONNECTED: - ev_queue.break_dispatch(); - printf("\r\n Disconnected Successfully \r\n"); - break; - case TX_DONE: - printf("\r\n Message Sent to Network Server \r\n"); - if (MBED_CONF_LORA_DUTY_CYCLE_ON) { - send_message(); - } - break; - case TX_TIMEOUT: - case TX_ERROR: - case TX_CRYPTO_ERROR: - case TX_SCHEDULING_ERROR: - printf("\r\n Transmission Error - EventCode = %d \r\n", event); - // try again - if (MBED_CONF_LORA_DUTY_CYCLE_ON) { - send_message(); - } - break; - case RX_DONE: - printf("\r\n Received message from Network Server \r\n"); - receive_message(); - break; - case RX_TIMEOUT: - case RX_ERROR: - printf("\r\n Error in reception - Code = %d \r\n", event); - break; - case JOIN_FAILURE: - printf("\r\n OTAA Failed - Check Keys \r\n"); - break; - case UPLINK_REQUIRED: - printf("\r\n Uplink required by NS \r\n"); - if (MBED_CONF_LORA_DUTY_CYCLE_ON) { - send_message(); - } - break; - default: - MBED_ASSERT("Unknown Event"); + for (int i = 0; i < 10; i++) { + myLedB = 1; + wait(0.1); + myLedB = 0; + wait(0.1); } }