iks01a1 accelerator only on mDot
Dependencies: X_NUCLEO_IKS01A1 mbed
Fork of Sensors_Reader by
Revision 66:99e34b1e9038, committed 2016-03-04
- Comitter:
- dudmuck
- Date:
- Fri Mar 04 21:30:15 2016 +0000
- Parent:
- 65:5c2a0c6aad5e
- Commit message:
- accelerator only
Changed in this revision
X_NUCLEO_IKS01A1.lib | Show annotated file Show diff for this revision Revisions of this file |
main.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- a/X_NUCLEO_IKS01A1.lib Thu Dec 17 11:03:25 2015 +0000 +++ b/X_NUCLEO_IKS01A1.lib Fri Mar 04 21:30:15 2016 +0000 @@ -1,1 +1,1 @@ -https://developer.mbed.org/teams/ST/code/X_NUCLEO_IKS01A1/#8a5184f66cd9 +https://developer.mbed.org/users/dudmuck/code/X_NUCLEO_IKS01A1/#b5b8e7cab622
--- a/main.cpp Thu Dec 17 11:03:25 2015 +0000 +++ b/main.cpp Fri Mar 04 21:30:15 2016 +0000 @@ -59,22 +59,10 @@ /*** Constants ---------------------------------------------------------------- ***/ -namespace { - const int MS_INTERVALS = 1000; -} - /*** Macros ------------------------------------------------------------------- ***/ #define APP_LOOP_PERIOD 3000 // in ms -#if defined(TARGET_STM) -#define LED_OFF (0) -#else -#define LED_OFF (1) -#endif -#define LED_ON (!LED_OFF) - - /*** Typedefs ----------------------------------------------------------------- ***/ typedef struct { int32_t AXIS_X; @@ -91,23 +79,12 @@ #endif // DBG_MCU static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance(); -static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope(); static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer(); -static MagneticSensor *magnetometer = mems_expansion_board->magnetometer; -static HumiditySensor *humidity_sensor = mems_expansion_board->ht_sensor;; -static PressureSensor *pressure_sensor = mems_expansion_board->pt_sensor; -static TempSensor *temp_sensor1 = mems_expansion_board->ht_sensor; -static TempSensor *temp_sensor2 = mems_expansion_board->pt_sensor; static Ticker ticker; -static DigitalOut myled(LED1, LED_OFF); +//static DigitalOut myled(LED1, LED_OFF); static volatile bool timer_irq_triggered = false; -static volatile bool ff_irq_triggered = false; - - -/*** Helper Functions (1/2) ------------------------------------------------------------ ***/ - /*** Interrupt Handler Top-Halves ------------------------------------------------------ ***/ /* Called in interrupt context, therefore just set a trigger variable */ @@ -115,138 +92,16 @@ timer_irq_triggered = true; } -/* Called in interrupt context, therefore just set a trigger variable */ -static void ff_irq(void) { - ff_irq_triggered = true; - - /* Disable IRQ until handled */ - mems_expansion_board->gyro_lsm6ds3->Disable_Free_Fall_Detection_IRQ(); -} - - -/*** Interrupt Handler Bottom-Halves ------------------------------------------------- ***/ -/* Handle Free Fall Interrupt - (here we are in "normal" context, i.e. not in IRQ context) -*/ -static void handle_ff_irq(void) { - printf("\nFree Fall Detected!\n\n"); - - /* Re-enable IRQ */ - mems_expansion_board->gyro_lsm6ds3->Enable_Free_Fall_Detection_IRQ(); -} - - -/*** Helper Functions (2/2) ------------------------------------------------------------ ***/ -/* print floats & doubles */ -static char *printDouble(char* str, double v, int decimalDigits=2) -{ - int i = 1; - int intPart, fractPart; - int len; - char *ptr; - - /* prepare decimal digits multiplicator */ - for (;decimalDigits!=0; i*=10, decimalDigits--); - - /* calculate integer & fractinal parts */ - intPart = (int)v; - fractPart = (int)((v-(double)(int)v)*i); - - /* fill in integer part */ - sprintf(str, "%i.", intPart); - - /* prepare fill in of fractional part */ - len = strlen(str); - ptr = &str[len]; - - /* fill in leading fractional zeros */ - for (i/=10;i>1; i/=10, ptr++) { - if(fractPart >= i) break; - *ptr = '0'; - } - - /* fill in (rest of) fractional part */ - sprintf(ptr, "%i", fractPart); - - return str; -} - -/* Initialization function */ -static void init(void) { - uint8_t id1, id2; - - /* Determine ID of Humidity & Temperature Sensor */ - CALL_METH(humidity_sensor, ReadID, &id1, 0x0); - CALL_METH(temp_sensor1, ReadID, &id2, 0x0); - printf("Humidity | Temperature Sensor ID = %s (0x%x | 0x%x)\n", - ((id1 == I_AM_HTS221) ? "HTS221 " : "UNKNOWN"), - id1, id2 - ); - assert(id1 == id2); - - /* Determine ID of Gyro & Motion Sensor */ - assert((mems_expansion_board->gyro_lsm6ds0 == NULL) || - (mems_expansion_board->gyro_lsm6ds3 == NULL)); - CALL_METH(gyroscope, ReadID, &id1, 0x0); - CALL_METH(accelerometer, ReadID, &id2, 0x0); - printf("Gyroscope | Motion Sensor ID = %s (0x%x | 0x%x)\n", - ((id1 == I_AM_LSM6DS3_XG) ? "LSM6DS3" : - ((id1 == I_AM_LSM6DS0_XG) ? "LSM6DS0" : "UNKNOWN")), - id1, id2 - ); - assert(id1 == id2); - - /* Register Free Fall Detection IRQ Handler & Enable Detection */ - if(mems_expansion_board->gyro_lsm6ds3 != NULL) { - mems_expansion_board->gyro_lsm6ds3->Attach_Free_Fall_Detection_IRQ(ff_irq); - mems_expansion_board->gyro_lsm6ds3->Enable_Free_Fall_Detection(); - } -} - /* Main cycle function */ static void main_cycle(void) { - float TEMPERATURE_Value; - float HUMIDITY_Value; - float PRESSURE_Value; - float PRESSURE_Temp_Value; - AxesRaw_TypeDef MAG_Value; AxesRaw_TypeDef ACC_Value; - AxesRaw_TypeDef GYR_Value; - char buffer1[32]; - char buffer2[32]; - char buffer3[32]; - char buffer4[32]; unsigned int ret = 0; - - /* Switch LED On */ - myled = LED_ON; - printf("===\n"); /* Determine Environmental Values */ - ret |= (!CALL_METH(temp_sensor1, GetTemperature, &TEMPERATURE_Value, 0.0f) ? 0x0 : 0x1); - ret |= (!CALL_METH(humidity_sensor, GetHumidity, &HUMIDITY_Value, 0.0f) ? 0x0 : 0x2);; - ret |= (!CALL_METH(pressure_sensor, GetPressure, &PRESSURE_Value, 0.0f) ? 0x0 : 0x4);; - ret |= (!CALL_METH(temp_sensor2, GetFahrenheit, &PRESSURE_Temp_Value, 0.0f) ? 0x0 : 0x8);; - ret |= (!CALL_METH(magnetometer, Get_M_Axes, (int32_t *)&MAG_Value, 0) ? 0x0 : 0x10);; ret |= (!CALL_METH(accelerometer, Get_X_Axes, (int32_t *)&ACC_Value, 0) ? 0x0 : 0x20);; - ret |= (!CALL_METH(gyroscope, Get_G_Axes, (int32_t *)&GYR_Value, 0) ? 0x0 : 0x40); /* Print Values Out */ - printf("I2C [errors]: 0x%.2x X Y Z\n", ret); - printf("MAG [mgauss]: %9ld %9ld %9ld\n", - MAG_Value.AXIS_X, MAG_Value.AXIS_Y, MAG_Value.AXIS_Z); - printf("ACC [mg]: %9ld %9ld %9ld\n", - ACC_Value.AXIS_X, ACC_Value.AXIS_Y, ACC_Value.AXIS_Z); - printf("GYR [mdps]: %9ld %9ld %9ld\n", - GYR_Value.AXIS_X, GYR_Value.AXIS_Y, GYR_Value.AXIS_Z); - printf("---\nTEMP | HUMIDITY: %s°C | %s%%\nTEMP | PRESSURE: %s°F | %smbar\n", - printDouble(buffer1, TEMPERATURE_Value), - printDouble(buffer2, HUMIDITY_Value), - printDouble(buffer4, PRESSURE_Temp_Value), - printDouble(buffer3, PRESSURE_Value)); - - /* Switch LED Off */ - myled = LED_OFF; + printf("ACC [mg]: X:%9ld Y:%9ld Z:%9ld\n", ACC_Value.AXIS_X, ACC_Value.AXIS_Y, ACC_Value.AXIS_Z); } @@ -256,20 +111,19 @@ */ int main() { + uint8_t id2; /* Start & initialize */ printf("\n--- Starting new run ---\n"); - init(); + CALL_METH(accelerometer, ReadID, &id2, 0x0); /* Start timer irq */ - ticker.attach_us(timer_irq, MS_INTERVALS * APP_LOOP_PERIOD); + //ticker.attach_us(timer_irq, MS_INTERVALS * APP_LOOP_PERIOD); + ticker.attach_us(timer_irq, 200000); while (true) { if(timer_irq_triggered) { timer_irq_triggered = false; main_cycle(); - } else if(ff_irq_triggered) { - ff_irq_triggered = false; - handle_ff_irq(); } else { __WFE(); /* it is recommended that SEVONPEND in the System Control Register is NOT set */