Diopodio

Dependencies:   X_NUCLEO_IKS01A1 mbed

Fork of Sensors_Reader by ST

Committer:
JackLenz
Date:
Sun Nov 12 20:48:31 2017 +0000
Revision:
70:c6b61c5cadf4
Parent:
69:12b1170b510a
Tried serial printing without success (maybe).; Can't verify it due to errors in Processing3 application which can't read correctly the output of the Nucleo (maybe I've done something wrong)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Wolfgang Betz 0:3e4f610a0689 1 /**
Wolfgang Betz 0:3e4f610a0689 2 ******************************************************************************
Wolfgang Betz 0:3e4f610a0689 3 * @file main.cpp
Wolfgang Betz 0:3e4f610a0689 4 * @author AST / EST
Wolfgang Betz 0:3e4f610a0689 5 * @version V0.0.1
Wolfgang Betz 0:3e4f610a0689 6 * @date 14-April-2015
Wolfgang Betz 0:3e4f610a0689 7 * @brief Example application for using the X_NUCLEO_IKS01A1
Wolfgang Betz 5:a1de9dcb0f41 8 * MEMS Inertial & Environmental Sensor Nucleo expansion board.
Wolfgang Betz 0:3e4f610a0689 9 ******************************************************************************
Wolfgang Betz 0:3e4f610a0689 10 * @attention
Wolfgang Betz 0:3e4f610a0689 11 *
Wolfgang Betz 0:3e4f610a0689 12 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
Wolfgang Betz 0:3e4f610a0689 13 *
Wolfgang Betz 0:3e4f610a0689 14 * Redistribution and use in source and binary forms, with or without modification,
Wolfgang Betz 0:3e4f610a0689 15 * are permitted provided that the following conditions are met:
Wolfgang Betz 0:3e4f610a0689 16 * 1. Redistributions of source code must retain the above copyright notice,
Wolfgang Betz 0:3e4f610a0689 17 * this list of conditions and the following disclaimer.
Wolfgang Betz 0:3e4f610a0689 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
Wolfgang Betz 0:3e4f610a0689 19 * this list of conditions and the following disclaimer in the documentation
Wolfgang Betz 0:3e4f610a0689 20 * and/or other materials provided with the distribution.
Wolfgang Betz 0:3e4f610a0689 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Wolfgang Betz 0:3e4f610a0689 22 * may be used to endorse or promote products derived from this software
Wolfgang Betz 0:3e4f610a0689 23 * without specific prior written permission.
Wolfgang Betz 0:3e4f610a0689 24 *
Wolfgang Betz 0:3e4f610a0689 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Wolfgang Betz 0:3e4f610a0689 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Wolfgang Betz 0:3e4f610a0689 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Wolfgang Betz 0:3e4f610a0689 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Wolfgang Betz 0:3e4f610a0689 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Wolfgang Betz 0:3e4f610a0689 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Wolfgang Betz 0:3e4f610a0689 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Wolfgang Betz 0:3e4f610a0689 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Wolfgang Betz 0:3e4f610a0689 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Wolfgang Betz 0:3e4f610a0689 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Wolfgang Betz 0:3e4f610a0689 35 *
Wolfgang Betz 0:3e4f610a0689 36 ******************************************************************************
Wolfgang Betz 0:3e4f610a0689 37 */
Wolfgang Betz 0:3e4f610a0689 38
Wolfgang Betz 0:3e4f610a0689 39 /**
Wolfgang Betz 5:a1de9dcb0f41 40 * @mainpage X_NUCLEO_IKS01A1 MEMS Inertial & Environmental Sensor Nucleo Expansion Board Firmware Package
Wolfgang Betz 0:3e4f610a0689 41 *
Wolfgang Betz 0:3e4f610a0689 42 * <b>Introduction</b>
Wolfgang Betz 0:3e4f610a0689 43 *
Wolfgang Betz 0:3e4f610a0689 44 * This firmware package includes Components Device Drivers, Board Support Package
Wolfgang Betz 0:3e4f610a0689 45 * and example application for STMicroelectronics X_NUCLEO_IKS01A1 MEMS Inertial & Environmental Nucleo
Wolfgang Betz 0:3e4f610a0689 46 * Expansion Board
Wolfgang Betz 0:3e4f610a0689 47 *
Wolfgang Betz 0:3e4f610a0689 48 * <b>Example Application</b>
Wolfgang Betz 0:3e4f610a0689 49 *
Wolfgang Betz 0:3e4f610a0689 50 */
Wolfgang Betz 0:3e4f610a0689 51
Wolfgang Betz 0:3e4f610a0689 52
Wolfgang Betz 0:3e4f610a0689 53 /*** Includes ----------------------------------------------------------------- ***/
Wolfgang Betz 0:3e4f610a0689 54 #include "mbed.h"
Wolfgang Betz 33:7ba7fbf0503a 55 #include "assert.h"
Wolfgang Betz 0:3e4f610a0689 56 #include "x_nucleo_iks01a1.h"
JackLenz 70:c6b61c5cadf4 57 #include <math.h>
Wolfgang Betz 0:3e4f610a0689 58
Wolfgang Betz 0:3e4f610a0689 59 #include <Ticker.h>
Wolfgang Betz 0:3e4f610a0689 60
Wolfgang Betz 0:3e4f610a0689 61
Wolfgang Betz 0:3e4f610a0689 62 /*** Constants ---------------------------------------------------------------- ***/
Wolfgang Betz 0:3e4f610a0689 63 namespace {
Wolfgang Betz 0:3e4f610a0689 64 const int MS_INTERVALS = 1000;
JackLenz 70:c6b61c5cadf4 65 const double RAD_TO_DEG = 57.2957786;
JackLenz 70:c6b61c5cadf4 66 const double PI = 3.14159265;
Wolfgang Betz 0:3e4f610a0689 67 }
Wolfgang Betz 0:3e4f610a0689 68
Wolfgang Betz 0:3e4f610a0689 69
Wolfgang Betz 0:3e4f610a0689 70 /*** Macros ------------------------------------------------------------------- ***/
Wolfgang Betz 40:f567538352e1 71 #define APP_LOOP_PERIOD 3000 // in ms
Wolfgang Betz 0:3e4f610a0689 72
Wolfgang Betz 4:81037ace7f27 73 #if defined(TARGET_STM)
Wolfgang Betz 4:81037ace7f27 74 #define LED_OFF (0)
Wolfgang Betz 4:81037ace7f27 75 #else
Wolfgang Betz 4:81037ace7f27 76 #define LED_OFF (1)
Wolfgang Betz 4:81037ace7f27 77 #endif
Wolfgang Betz 4:81037ace7f27 78 #define LED_ON (!LED_OFF)
Wolfgang Betz 4:81037ace7f27 79
Wolfgang Betz 0:3e4f610a0689 80
Wolfgang Betz 1:9458657e49ee 81 /*** Typedefs ----------------------------------------------------------------- ***/
Wolfgang Betz 1:9458657e49ee 82 typedef struct {
Wolfgang Betz 1:9458657e49ee 83 int32_t AXIS_X;
Wolfgang Betz 1:9458657e49ee 84 int32_t AXIS_Y;
Wolfgang Betz 1:9458657e49ee 85 int32_t AXIS_Z;
Wolfgang Betz 1:9458657e49ee 86 } AxesRaw_TypeDef;
Wolfgang Betz 1:9458657e49ee 87
JackLenz 70:c6b61c5cadf4 88 /*** Serial declaration --------------------------------------------------------- ***/
JackLenz 70:c6b61c5cadf4 89 Serial ser(USBTX,USBRX,115200);
Wolfgang Betz 1:9458657e49ee 90
Wolfgang Betz 0:3e4f610a0689 91 /*** Static variables --------------------------------------------------------- ***/
Wolfgang Betz 0:3e4f610a0689 92 #ifdef DBG_MCU
Wolfgang Betz 0:3e4f610a0689 93 /* betzw: enable debugging while using sleep modes */
Wolfgang Betz 0:3e4f610a0689 94 #include "DbgMCU.h"
Wolfgang Betz 0:3e4f610a0689 95 static DbgMCU enable_dbg;
Wolfgang Betz 0:3e4f610a0689 96 #endif // DBG_MCU
Wolfgang Betz 0:3e4f610a0689 97
Wolfgang Betz 1:9458657e49ee 98 static X_NUCLEO_IKS01A1 *mems_expansion_board = X_NUCLEO_IKS01A1::Instance();
Wolfgang Betz 33:7ba7fbf0503a 99 static GyroSensor *gyroscope = mems_expansion_board->GetGyroscope();
Wolfgang Betz 33:7ba7fbf0503a 100 static MotionSensor *accelerometer = mems_expansion_board->GetAccelerometer();
Wolfgang Betz 32:97bff5dadafd 101 static MagneticSensor *magnetometer = mems_expansion_board->magnetometer;
Wolfgang Betz 18:645c96f209c7 102
Wolfgang Betz 0:3e4f610a0689 103 static Ticker ticker;
Wolfgang Betz 40:f567538352e1 104 static DigitalOut myled(LED1, LED_OFF);
Wolfgang Betz 40:f567538352e1 105
Wolfgang Betz 0:3e4f610a0689 106 static volatile bool timer_irq_triggered = false;
Wolfgang Betz 40:f567538352e1 107 static volatile bool ff_irq_triggered = false;
Wolfgang Betz 4:81037ace7f27 108
Wolfgang Betz 0:3e4f610a0689 109
Wolfgang Betz 0:3e4f610a0689 110 /*** Helper Functions (1/2) ------------------------------------------------------------ ***/
Wolfgang Betz 0:3e4f610a0689 111
Wolfgang Betz 0:3e4f610a0689 112
Wolfgang Betz 0:3e4f610a0689 113 /*** Interrupt Handler Top-Halves ------------------------------------------------------ ***/
Wolfgang Betz 0:3e4f610a0689 114 /* Called in interrupt context, therefore just set a trigger variable */
Wolfgang Betz 0:3e4f610a0689 115 static void timer_irq(void) {
Wolfgang Betz 0:3e4f610a0689 116 timer_irq_triggered = true;
Wolfgang Betz 0:3e4f610a0689 117 }
Wolfgang Betz 0:3e4f610a0689 118
Wolfgang Betz 40:f567538352e1 119 /* Called in interrupt context, therefore just set a trigger variable */
Wolfgang Betz 40:f567538352e1 120 static void ff_irq(void) {
Wolfgang Betz 40:f567538352e1 121 ff_irq_triggered = true;
Wolfgang Betz 40:f567538352e1 122
Wolfgang Betz 40:f567538352e1 123 /* Disable IRQ until handled */
Wolfgang Betz 40:f567538352e1 124 mems_expansion_board->gyro_lsm6ds3->Disable_Free_Fall_Detection_IRQ();
Wolfgang Betz 40:f567538352e1 125 }
Wolfgang Betz 40:f567538352e1 126
Wolfgang Betz 0:3e4f610a0689 127
Wolfgang Betz 0:3e4f610a0689 128 /*** Interrupt Handler Bottom-Halves ------------------------------------------------- ***/
Wolfgang Betz 40:f567538352e1 129 /* Handle Free Fall Interrupt
Wolfgang Betz 40:f567538352e1 130 (here we are in "normal" context, i.e. not in IRQ context)
Wolfgang Betz 40:f567538352e1 131 */
Wolfgang Betz 40:f567538352e1 132 static void handle_ff_irq(void) {
Wolfgang Betz 40:f567538352e1 133 printf("\nFree Fall Detected!\n\n");
Wolfgang Betz 40:f567538352e1 134
Wolfgang Betz 40:f567538352e1 135 /* Re-enable IRQ */
Wolfgang Betz 40:f567538352e1 136 mems_expansion_board->gyro_lsm6ds3->Enable_Free_Fall_Detection_IRQ();
Wolfgang Betz 40:f567538352e1 137 }
Wolfgang Betz 0:3e4f610a0689 138
Wolfgang Betz 0:3e4f610a0689 139
Wolfgang Betz 0:3e4f610a0689 140 /*** Helper Functions (2/2) ------------------------------------------------------------ ***/
Wolfgang Betz 2:00f62b148a07 141 /* print floats & doubles */
Wolfgang Betz 2:00f62b148a07 142 static char *printDouble(char* str, double v, int decimalDigits=2)
Wolfgang Betz 2:00f62b148a07 143 {
Wolfgang Betz 2:00f62b148a07 144 int i = 1;
Wolfgang Betz 2:00f62b148a07 145 int intPart, fractPart;
Wolfgang Betz 54:d812bb378d46 146 int len;
Wolfgang Betz 54:d812bb378d46 147 char *ptr;
Wolfgang Betz 2:00f62b148a07 148
Wolfgang Betz 54:d812bb378d46 149 /* prepare decimal digits multiplicator */
Wolfgang Betz 2:00f62b148a07 150 for (;decimalDigits!=0; i*=10, decimalDigits--);
Wolfgang Betz 54:d812bb378d46 151
Wolfgang Betz 54:d812bb378d46 152 /* calculate integer & fractinal parts */
Wolfgang Betz 2:00f62b148a07 153 intPart = (int)v;
Wolfgang Betz 2:00f62b148a07 154 fractPart = (int)((v-(double)(int)v)*i);
Wolfgang Betz 54:d812bb378d46 155
Wolfgang Betz 54:d812bb378d46 156 /* fill in integer part */
Wolfgang Betz 54:d812bb378d46 157 sprintf(str, "%i.", intPart);
Wolfgang Betz 54:d812bb378d46 158
Wolfgang Betz 54:d812bb378d46 159 /* prepare fill in of fractional part */
Wolfgang Betz 54:d812bb378d46 160 len = strlen(str);
Wolfgang Betz 54:d812bb378d46 161 ptr = &str[len];
Wolfgang Betz 54:d812bb378d46 162
Wolfgang Betz 54:d812bb378d46 163 /* fill in leading fractional zeros */
Wolfgang Betz 54:d812bb378d46 164 for (i/=10;i>1; i/=10, ptr++) {
Wolfgang Betz 54:d812bb378d46 165 if(fractPart >= i) break;
Wolfgang Betz 54:d812bb378d46 166 *ptr = '0';
Wolfgang Betz 54:d812bb378d46 167 }
Wolfgang Betz 54:d812bb378d46 168
Wolfgang Betz 54:d812bb378d46 169 /* fill in (rest of) fractional part */
Wolfgang Betz 54:d812bb378d46 170 sprintf(ptr, "%i", fractPart);
Wolfgang Betz 2:00f62b148a07 171
Wolfgang Betz 2:00f62b148a07 172 return str;
Wolfgang Betz 2:00f62b148a07 173 }
Wolfgang Betz 2:00f62b148a07 174
Wolfgang Betz 0:3e4f610a0689 175 /* Initialization function */
Wolfgang Betz 0:3e4f610a0689 176 static void init(void) {
Wolfgang Betz 33:7ba7fbf0503a 177 uint8_t id1, id2;
JackLenz 70:c6b61c5cadf4 178
Wolfgang Betz 33:7ba7fbf0503a 179 /* Determine ID of Gyro & Motion Sensor */
Wolfgang Betz 33:7ba7fbf0503a 180 assert((mems_expansion_board->gyro_lsm6ds0 == NULL) ||
Wolfgang Betz 33:7ba7fbf0503a 181 (mems_expansion_board->gyro_lsm6ds3 == NULL));
Wolfgang Betz 69:12b1170b510a 182 CALL_METH(gyroscope, read_id, &id1, 0x0);
Wolfgang Betz 69:12b1170b510a 183 CALL_METH(accelerometer, read_id, &id2, 0x0);
Wolfgang Betz 33:7ba7fbf0503a 184 printf("Gyroscope | Motion Sensor ID = %s (0x%x | 0x%x)\n",
Wolfgang Betz 33:7ba7fbf0503a 185 ((id1 == I_AM_LSM6DS3_XG) ? "LSM6DS3" :
Wolfgang Betz 33:7ba7fbf0503a 186 ((id1 == I_AM_LSM6DS0_XG) ? "LSM6DS0" : "UNKNOWN")),
Wolfgang Betz 33:7ba7fbf0503a 187 id1, id2
Wolfgang Betz 33:7ba7fbf0503a 188 );
Wolfgang Betz 33:7ba7fbf0503a 189 assert(id1 == id2);
Wolfgang Betz 33:7ba7fbf0503a 190
Wolfgang Betz 40:f567538352e1 191 /* Register Free Fall Detection IRQ Handler & Enable Detection */
Wolfgang Betz 40:f567538352e1 192 if(mems_expansion_board->gyro_lsm6ds3 != NULL) {
Wolfgang Betz 40:f567538352e1 193 mems_expansion_board->gyro_lsm6ds3->Attach_Free_Fall_Detection_IRQ(ff_irq);
Wolfgang Betz 40:f567538352e1 194 mems_expansion_board->gyro_lsm6ds3->Enable_Free_Fall_Detection();
Wolfgang Betz 40:f567538352e1 195 }
Wolfgang Betz 1:9458657e49ee 196 }
Wolfgang Betz 1:9458657e49ee 197
Wolfgang Betz 1:9458657e49ee 198 /* Main cycle function */
Wolfgang Betz 1:9458657e49ee 199 static void main_cycle(void) {
Wolfgang Betz 1:9458657e49ee 200 AxesRaw_TypeDef MAG_Value;
Wolfgang Betz 1:9458657e49ee 201 AxesRaw_TypeDef ACC_Value;
Wolfgang Betz 1:9458657e49ee 202 AxesRaw_TypeDef GYR_Value;
Wolfgang Betz 2:00f62b148a07 203 char buffer1[32];
Wolfgang Betz 2:00f62b148a07 204 char buffer2[32];
Wolfgang Betz 2:00f62b148a07 205 char buffer3[32];
Wolfgang Betz 11:e20efb4e8a98 206 char buffer4[32];
Wolfgang Betz 50:4a902230142d 207 unsigned int ret = 0;
Wolfgang Betz 50:4a902230142d 208
JackLenz 70:c6b61c5cadf4 209 /* Declaration of sensors variables */
JackLenz 70:c6b61c5cadf4 210 double accX,accY,accZ;
JackLenz 70:c6b61c5cadf4 211 double gyroX,gyroY,gyroZ;
JackLenz 70:c6b61c5cadf4 212
JackLenz 70:c6b61c5cadf4 213
Wolfgang Betz 1:9458657e49ee 214 /* Switch LED On */
Wolfgang Betz 4:81037ace7f27 215 myled = LED_ON;
Wolfgang Betz 2:00f62b148a07 216 printf("===\n");
Wolfgang Betz 1:9458657e49ee 217
Wolfgang Betz 1:9458657e49ee 218 /* Determine Environmental Values */
Wolfgang Betz 69:12b1170b510a 219 ret |= (!CALL_METH(magnetometer, get_m_axes, (int32_t *)&MAG_Value, 0) ? 0x0 : 0x10);;
Wolfgang Betz 69:12b1170b510a 220 ret |= (!CALL_METH(accelerometer, get_x_axes, (int32_t *)&ACC_Value, 0) ? 0x0 : 0x20);;
Wolfgang Betz 69:12b1170b510a 221 ret |= (!CALL_METH(gyroscope, get_g_axes, (int32_t *)&GYR_Value, 0) ? 0x0 : 0x40);
Wolfgang Betz 1:9458657e49ee 222
Wolfgang Betz 1:9458657e49ee 223 /* Print Values Out */
Wolfgang Betz 54:d812bb378d46 224 printf("I2C [errors]: 0x%.2x X Y Z\n", ret);
Wolfgang Betz 29:25c8f7d4515a 225 printf("MAG [mgauss]: %9ld %9ld %9ld\n",
Wolfgang Betz 29:25c8f7d4515a 226 MAG_Value.AXIS_X, MAG_Value.AXIS_Y, MAG_Value.AXIS_Z);
Wolfgang Betz 29:25c8f7d4515a 227 printf("ACC [mg]: %9ld %9ld %9ld\n",
Wolfgang Betz 29:25c8f7d4515a 228 ACC_Value.AXIS_X, ACC_Value.AXIS_Y, ACC_Value.AXIS_Z);
Wolfgang Betz 29:25c8f7d4515a 229 printf("GYR [mdps]: %9ld %9ld %9ld\n",
Wolfgang Betz 29:25c8f7d4515a 230 GYR_Value.AXIS_X, GYR_Value.AXIS_Y, GYR_Value.AXIS_Z);
JackLenz 70:c6b61c5cadf4 231
JackLenz 70:c6b61c5cadf4 232 accX = ACC_Value.AXIS_X;
JackLenz 70:c6b61c5cadf4 233 accY = ACC_Value.AXIS_Y;
JackLenz 70:c6b61c5cadf4 234 accZ = ACC_Value.AXIS_Z;
JackLenz 70:c6b61c5cadf4 235 gyroX = GYR_Value.AXIS_X;
JackLenz 70:c6b61c5cadf4 236 gyroY = GYR_Value.AXIS_Y;
JackLenz 70:c6b61c5cadf4 237 gyroZ = GYR_Value.AXIS_Z;
JackLenz 70:c6b61c5cadf4 238
JackLenz 70:c6b61c5cadf4 239 #ifdef RESTRICT_PITCH // Eq. 25 and 26
JackLenz 70:c6b61c5cadf4 240 double roll = atan2(accY, accZ) * RAD_TO_DEG;
JackLenz 70:c6b61c5cadf4 241 double pitch = atan(-accX / sqrt(accY * accY + accZ * accZ)) * RAD_TO_DEG;
JackLenz 70:c6b61c5cadf4 242 #else // Eq. 28 and 29
JackLenz 70:c6b61c5cadf4 243 double roll = atan(accY / sqrt(accX * accX + accZ * accZ)) * RAD_TO_DEG;
JackLenz 70:c6b61c5cadf4 244 double pitch = atan2(-accX, accZ) * RAD_TO_DEG;
JackLenz 70:c6b61c5cadf4 245 #endif
JackLenz 70:c6b61c5cadf4 246 double yaw = atan2(-accZ, sqrt(accY * accY + accZ * accZ)) * 180.0/PI;
JackLenz 70:c6b61c5cadf4 247
JackLenz 70:c6b61c5cadf4 248 /* Print Serially *//*
JackLenz 70:c6b61c5cadf4 249 ser.printf("%lf",pitch);
JackLenz 70:c6b61c5cadf4 250 ser.printf(":");
JackLenz 70:c6b61c5cadf4 251 ser.printf("%lf",roll);
JackLenz 70:c6b61c5cadf4 252 ser.printf(":");
JackLenz 70:c6b61c5cadf4 253 ser.printf("%lf\n",yaw);
JackLenz 70:c6b61c5cadf4 254 */
JackLenz 70:c6b61c5cadf4 255 ser.printf("1");
JackLenz 70:c6b61c5cadf4 256 ser.printf(":");
JackLenz 70:c6b61c5cadf4 257 ser.printf("2");
JackLenz 70:c6b61c5cadf4 258 ser.printf(":");
JackLenz 70:c6b61c5cadf4 259 ser.printf("3\n");
JackLenz 70:c6b61c5cadf4 260
Wolfgang Betz 1:9458657e49ee 261
Wolfgang Betz 1:9458657e49ee 262 /* Switch LED Off */
Wolfgang Betz 4:81037ace7f27 263 myled = LED_OFF;
Wolfgang Betz 0:3e4f610a0689 264 }
Wolfgang Betz 0:3e4f610a0689 265
Wolfgang Betz 0:3e4f610a0689 266
Wolfgang Betz 0:3e4f610a0689 267 /*** Main function ------------------------------------------------------------- ***/
Wolfgang Betz 51:5ce8202680b4 268 /* Generic main function/loop for enabling WFE in case of
Wolfgang Betz 0:3e4f610a0689 269 interrupt based cyclic execution
Wolfgang Betz 0:3e4f610a0689 270 */
Wolfgang Betz 0:3e4f610a0689 271 int main()
Wolfgang Betz 0:3e4f610a0689 272 {
Wolfgang Betz 0:3e4f610a0689 273 /* Start & initialize */
Wolfgang Betz 0:3e4f610a0689 274 printf("\n--- Starting new run ---\n");
Wolfgang Betz 0:3e4f610a0689 275 init();
Wolfgang Betz 0:3e4f610a0689 276
Wolfgang Betz 0:3e4f610a0689 277 /* Start timer irq */
Wolfgang Betz 0:3e4f610a0689 278 ticker.attach_us(timer_irq, MS_INTERVALS * APP_LOOP_PERIOD);
Wolfgang Betz 0:3e4f610a0689 279
Wolfgang Betz 47:6a63161486cf 280 while (true) {
Wolfgang Betz 47:6a63161486cf 281 if(timer_irq_triggered) {
Wolfgang Betz 47:6a63161486cf 282 timer_irq_triggered = false;
Wolfgang Betz 47:6a63161486cf 283 main_cycle();
Wolfgang Betz 47:6a63161486cf 284 } else if(ff_irq_triggered) {
Wolfgang Betz 47:6a63161486cf 285 ff_irq_triggered = false;
Wolfgang Betz 47:6a63161486cf 286 handle_ff_irq();
Wolfgang Betz 47:6a63161486cf 287 } else {
Wolfgang Betz 49:0223aee4b17a 288 __WFE(); /* it is recommended that SEVONPEND in the
Wolfgang Betz 49:0223aee4b17a 289 System Control Register is NOT set */
Wolfgang Betz 47:6a63161486cf 290 }
Wolfgang Betz 47:6a63161486cf 291 }
Wolfgang Betz 0:3e4f610a0689 292 }