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:
- 33:e47306c32791
- Parent:
- 31:f03c183e2bf6
- Child:
- 34:341fb423e74b
--- a/main.cpp Fri Aug 03 16:34:24 2018 +0000 +++ b/main.cpp Wed Aug 15 22:16:56 2018 +0000 @@ -16,6 +16,8 @@ */ #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" @@ -91,35 +93,624 @@ */ static lorawan_app_callbacks_t callbacks; -int mytime; -int mybatt; -double mylat; -double mylon; +int mytime = 0; +int mybatt = 0; +double mylat = 0; +double mylon = 0; + +int16_t myAccX = 0; +int16_t myAccY = 0; +int16_t myAccZ = 0; +int16_t myMagX = 0; +int16_t myMagY = 0; +int16_t myMagZ = 0; +int16_t myOffX = 0; +int16_t myOffY = 0; +int16_t myOffZ = 0; +int16_t myTemp = 0; + +int16_t accMinX = 0; +int16_t accMinY = 0; +int16_t accMinZ = 0; +int16_t accMaxX = 0; +int16_t accMaxY = 0; +int16_t accMaxZ = 0; + +int16_t magMinX = 0; +int16_t magMinY = 0; +int16_t magMinZ = 0; +int16_t magMaxX = 0; +int16_t magMaxY = 0; +int16_t magMaxZ = 0; + +#define NEOM8M_ADR_GPS 0x84 +#define LSM303_ADR_ACC 0x32 +#define LSM303_ADR_MAG 0x3C -#define NEOM8M_ADR_GPS (0x42 >> 1) -#define LSM303_ADR_ACC (0x32 >> 1) -#define LSM303_ADR_MAG (0x3C >> 1) +#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_WHO_AM_I_A 0x0F +#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_STATUS_REG_A 0x27 +#define LSM303_REG_ACC_OUT_X_L_A 0x28 +#define LSM303_REG_ACC_OUT_X_H_A 0x29 +#define LSM303_REG_ACC_OUT_Y_L_A 0x2A +#define LSM303_REG_ACC_OUT_Y_H_A 0x2B +#define LSM303_REG_ACC_OUT_Z_L_A 0x2C +#define LSM303_REG_ACC_OUT_Z_H_A 0x2D +#define LSM303_REG_ACC_INT1_CFG_A 0x30 +#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_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 + I2C i2c(PB_9, PB_8); +InterruptIn accPin(PB_14); +InterruptIn magPin(PA_10); + +char cfg; +char ret; +char rda = '\0'; +char cmd[2]; +char buf[83]; +int pos = 0; +char *res; +char sPass[26] = "[\u001b[32mPASS\u001b[0m]"; +char sFail[26] = "[\u001b[31mFAIL\u001b[0m]"; +int accShift = 0; +int accScale = 0; +int accEvent = 0; +uint16_t accSFire = 0; +uint16_t accHFire = 0; +uint16_t accSLIRQ = 0; +uint16_t accSHIRQ = 0; +int magEvent = 0; +uint16_t magSFire = 0; +uint16_t magHFire = 0; +uint16_t magSLIRQ = 0; +uint16_t magSHIRQ = 0; + +char cmdSendLoop[9] = "SendLoop"; + +void onAccIrq() +{ + accHFire++; +} + +void onMagIrq() +{ + magHFire++; +} + +void accDumpCfg() +{ + char start = LSM303_REG_ACC_CTRL_REG1_A; + int i; + for (i = 0; i < 6; 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]); +} + +void magDumpCfg() +{ + char start = LSM303_REG_MAG_CFG_REG_A_M; + int i; + for (i = 0; i < 3; 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]); +} + +#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 */ int main (void) { + 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) + { + 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++; + } + + + // setup tracing setup_trace(); // stores the status of a call to LoRaWAN protocol lorawan_status_t retcode; + + wait(4); printf("\r\n- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -\r\n"); - mytime = 0; - mybatt = 15; - mylat = 51.06509; - mylon = -114.08895; + 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); + 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 + /* + 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; + cmd[0] = LSM303_REG_ACC_CTRL_REG1_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &ret, 1); + cfg |= (ret & 0x08) >> 3; + cmd[0] = LSM303_REG_ACC_CTRL_REG4_A; + i2c.write(LSM303_ADR_ACC, cmd, 1); + i2c.read(LSM303_ADR_ACC, &ret, 1); + cfg |= (ret & 0x08) >> 2; + accScale = 1 << ((ret & 0x30) >> 4); + cmd[0] = LSM303_REG_MAG_CFG_REG_A_M; + i2c.write(LSM303_ADR_MAG, cmd, 1); + i2c.read(LSM303_ADR_MAG, &ret, 1); + cfg |= (ret & 0x10); + if (cfg & 0x01) + accShift = 8; + else if (cfg & 0x02) + accShift = 4; + else + accShift = 6; + 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++; + } + 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) { printf("\r\n LoRa initialization failed! \r\n"); @@ -127,7 +718,7 @@ } printf("\r\n Mbed LoRaWANStack initialized \r\n"); - //printf("MBED_CONF_LORA_APP_PORT: %d", MBED_CONF_LORA_APP_PORT); + printf("MBED_CONF_LORA_APP_PORT: %d", MBED_CONF_LORA_APP_PORT); // prepare application callbacks callbacks.events = mbed::callback(lora_event_handler); @@ -152,9 +743,7 @@ printf("\r\n Adaptive data rate (ADR) - Enabled \r\n"); retcode = lorawan.connect(); - /*if (retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { - printf("Retcode = Connecting."); - }*/ + if (retcode == LORAWAN_STATUS_OK || retcode == LORAWAN_STATUS_CONNECT_IN_PROGRESS) { } else { @@ -178,6 +767,7 @@ uint16_t packet_len; int16_t retcode; float sensor_value; + bool gpsDone = false; if (ds1820.begin()) { ds1820.startConversion(); @@ -189,35 +779,230 @@ return; } - //packet_len = sprintf((char*) tx_buffer, "Dummy Sensor Value is %3.1f", - // sensor_value); - //packet_len = sprintf((char*) tx_buffer, "VAL=%3.1f", sensor_value); - //packet_len = sprintf((char*) tx_buffer, "%d,%d,%f,%f", mytime, mybatt, mylat, mylon); - //printf("BUF: |%s|", tx_buffer); time_t tNow = time(NULL); printf("Clock: %d\r\n", tNow); - mytime = tNow; - char cmd[2]; + + ret = 0xFF; + cmd[0] = 0xFF; + i2c.write(NEOM8M_ADR_GPS, cmd, 1); + while(!gpsDone) + { + while (ret == 0xFF) + { + i2c.read(NEOM8M_ADR_GPS, &ret, 1); + } + while (ret != 0xFF) + { + buf[pos++] = ret; + i2c.read(NEOM8M_ADR_GPS, &ret, 1); + if (ret == '\r') + { + i2c.read(NEOM8M_ADR_GPS, &ret, 1); + if (ret == '\n') + { + buf[pos] = 0x00; + /* NMEA Validation */ + uint16_t crc = 0; + char clr; + if (buf[0] == '$' && buf[pos-3] == '*') + { + int i; + for (i = 1; i < pos-3; i++) + { + crc ^= buf[i]; + } + } + if (crc == ((buf[pos-2] < 'A' ? buf[pos-2] - '0' : buf[pos-2] - '7') << 4 | (buf[pos-1] < 'A' ? buf[pos-1] - '0' : buf[pos-1] - '7'))) + clr = '2'; // 2 = Green + else + clr = '1'; // 1 = Red + printf("GPS: [\u001b[3%cm%02X\u001b[0m] |%s|\r\n", clr, crc, buf); + // Global Positioning System Fix Data + if(strncmp(buf, "$GNGGA", 6) == 0) + { + printf("GNGGA> "); + //sscanf(cmd, "$GPGGA,%f,%f,%c,%f,%c,%d,%d,%*f,%f", &timefix, &latitude, &ns, &longitude, &ew, &fq, &nst, &altitude); + //pc.printf("GPGGA Fix taken at: %f, Latitude: %f %c, Longitude: %f %c, Fix quality: %d, Number of sat: %d, Altitude: %f M\n", timefix, latitude, ns, longitude, ew, fq, nst, altitude); + float fldTim, fldAlt; + double fldLat, fldLon; + char fldN_S, fldE_W; + int fldFix, fldSat; + sscanf(buf, "$GNGGA,%f,%lf,%c,%lf,%c,%d,%d,%*f,%f", &fldTim, &fldLat, &fldN_S, &fldLon, &fldE_W, &fldFix, &fldSat, &fldAlt); + printf("Sec: %.2f, Lat: %.5f %c, Lon: %.5f %c, Fix: %d, Sat: %d, Alt: %.1f M\r\n", fldTim, fldLat, fldN_S, fldLon, fldE_W, fldFix, fldSat, fldAlt); + if (clr == '2') + { + mylat = fldLat / (fldN_S == 'S' ? -100 : 100); + mylon = fldLon / (fldE_W == 'W' ? -100 : 100); + mytime = (uint32_t)fldTim; + mybatt = (fldSat & 0xF0 ? 0x0F : fldSat & 0x0F); + } + } + // Satellite status + if(strncmp(buf, "$GNGSA", 6) == 0) + { + printf("GNGSA> "); + //sscanf(cmd, "$GPGSA,%c,%d,%d", &tf, &fix, &nst); + //pc.printf("GPGSA Type fix: %c, 3D fix: %d, number of sat: %d\r\n", tf, fix, nst); + char fldTyp; + int fldDim, fldSat; + sscanf(buf, "$GNGSA,%c,%d,%d", &fldTyp, &fldDim, &fldSat); + printf("Typ: %c, Pos: %d, Sat: %d\r\n", fldTyp, fldDim, fldSat); + } + // Geographic position, Latitude and Longitude + if(strncmp(buf, "$GNGLL", 6) == 0) + { + printf("GNGLL> "); + //sscanf(cmd, "$GPGLL,%f,%c,%f,%c,%f", &latitude, &ns, &longitude, &ew, &timefix); + //pc.printf("GPGLL Latitude: %f %c, Longitude: %f %c, Fix taken at: %f\n", latitude, ns, longitude, ew, timefix); + float fldTim; + double fldLat, fldLon; + char fldN_S, fldE_W; + sscanf(buf, "$GNGLL,%lf,%c,%lf,%c,%f", &fldLat, &fldN_S, &fldLon, &fldE_W, &fldTim); + printf("Lat: %.5f %c, Lon: %.5f %c, Sec: %.2f\r\n", fldLat, fldN_S, fldLon, fldE_W, fldTim); + } + // Geographic position, Latitude and Longitude + if(strncmp(buf, "$GNRMC", 6) == 0) + { + printf("GNRMC> "); + //sscanf(cmd, "$GPRMC,%f,%c,%f,%c,%f,%c,%f,,%d", &timefix, &status, &latitude, &ns, &longitude, &ew, &speed, &date); + //pc.printf("GPRMC Fix taken at: %f, Status: %c, Latitude: %f %c, Longitude: %f %c, Speed: %f, Date: %d\n", timefix, status, latitude, ns, longitude, ew, speed, date); + float fldTim, fldSpd; + double fldLat, fldLon; + char fldSts, fldN_S, fldE_W; + 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); + } + pos = 0; + i2c.read(NEOM8M_ADR_GPS, &ret, 1); + } + else + { + printf("WARN: Expected '\n', received '%02x'.\r\n", ret); + } + } + else if (pos == 82) + { + buf[pos] = 0x00; + printf("GPS: |%s| ...\r\n", buf); + pos = 0; + i2c.read(NEOM8M_ADR_GPS, &ret, 1); + } + } + buf[pos] = 0x00; + gpsDone = true; + } + if (pos > 0) + printf("GPS: |%s|\r\n", buf); + /* - char buf[1024]; - buf[0] = 0x00; - buf[1] = 0x00; - buf[2] = 0x00; + 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); */ - char buf; - //cmd[0] = 0xFF; - //i2c.write(NEOM8M_ADR_GPS, cmd, 1); - //i2c.read(NEOM8M_ADR_GPS, buf, 1024); - cmd[0] = 0x20; - cmd[1] = 0x57; - i2c.write(LSM303_ADR_ACC, cmd, 2); - cmd[0] = 0x20; + + cmd[0] = LSM303_REG_ACC_STATUS_REG_AUX_A; 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); + 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); + + 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; @@ -234,8 +1019,6 @@ int i; for (i = 0; i < packet_len; i++) { printf("%02x", tx_buffer[i]); } printf("|\r\n"); - mytime++; - if (mybatt == 0) { mybatt = 15; } else { mybatt--; } retcode = lorawan.send(MBED_CONF_LORA_APP_PORT, tx_buffer, packet_len, MSG_CONFIRMED_FLAG); @@ -279,7 +1062,17 @@ 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(); } /**