Test application for the STMicroelectronics X-NUCLEO-LED61A1 LED Control Expansion Board showing several LED control modes, built against mbed OS.

Dependencies:   X_NUCLEO_LED61A1

Fork of LedDimming_LED61A1 by ST

LED Control with the X-NUCLEO-LED61A1 Expansion Board

This application provides an example of usage of the X-NUCLEO-LED61A1 LED Control Expansion Board. It shows how to control a LED stripe load connected to the board through the following control modes:

  1. Manual PWM Dimming;
  2. Manual Analog Dimming;
  3. Sinusoidal PWM Dimming;
  4. Sinusoidal Analog Dimming;
  5. Photo-based Analog Dimming.

The button of the MCU board, when available, can be used in the following ways:

  • Short Button Press [<0.5s] for Manual Dimming;
  • Medium Button Press to Switch Demo;
  • Long Button Press [>2s] to Switch Power ON/OFF.

The program starts in mode 1.

Committer:
Davidroid
Date:
Mon Jul 03 09:18:12 2017 +0000
Revision:
16:e39f206f26c8
Parent:
15:ea1e402ce919
mbedOS

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Davidroid 0:f5a41692e1fb 1 /**
Davidroid 0:f5a41692e1fb 2 ******************************************************************************
Davidroid 0:f5a41692e1fb 3 * @file main.cpp
Davidroid 6:899828fd9d9d 4 * @author Davide Aliprandi, STMicroelectronics
Davidroid 0:f5a41692e1fb 5 * @version V1.0.0
Davidroid 7:5763474c7551 6 * @date February 4h, 2016
Davidroid 6:899828fd9d9d 7 * @brief mbed test application for the STMicroelectronics X-NUCLEO-LED61A1
Davidroid 7:5763474c7551 8 * LED Control Expansion Board showing several LED control modes.
Davidroid 0:f5a41692e1fb 9 ******************************************************************************
Davidroid 0:f5a41692e1fb 10 * @attention
Davidroid 0:f5a41692e1fb 11 *
Davidroid 0:f5a41692e1fb 12 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
Davidroid 0:f5a41692e1fb 13 *
Davidroid 0:f5a41692e1fb 14 * Redistribution and use in source and binary forms, with or without modification,
Davidroid 0:f5a41692e1fb 15 * are permitted provided that the following conditions are met:
Davidroid 0:f5a41692e1fb 16 * 1. Redistributions of source code must retain the above copyright notice,
Davidroid 0:f5a41692e1fb 17 * this list of conditions and the following disclaimer.
Davidroid 0:f5a41692e1fb 18 * 2. Redistributions in binary form must reproduce the above copyright notice,
Davidroid 0:f5a41692e1fb 19 * this list of conditions and the following disclaimer in the documentation
Davidroid 0:f5a41692e1fb 20 * and/or other materials provided with the distribution.
Davidroid 0:f5a41692e1fb 21 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Davidroid 0:f5a41692e1fb 22 * may be used to endorse or promote products derived from this software
Davidroid 0:f5a41692e1fb 23 * without specific prior written permission.
Davidroid 0:f5a41692e1fb 24 *
Davidroid 0:f5a41692e1fb 25 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Davidroid 0:f5a41692e1fb 26 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Davidroid 0:f5a41692e1fb 27 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Davidroid 0:f5a41692e1fb 28 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Davidroid 0:f5a41692e1fb 29 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Davidroid 0:f5a41692e1fb 30 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Davidroid 0:f5a41692e1fb 31 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Davidroid 0:f5a41692e1fb 32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Davidroid 0:f5a41692e1fb 33 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Davidroid 0:f5a41692e1fb 34 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Davidroid 0:f5a41692e1fb 35 *
Davidroid 0:f5a41692e1fb 36 ******************************************************************************
Davidroid 0:f5a41692e1fb 37 */
Davidroid 0:f5a41692e1fb 38
Davidroid 0:f5a41692e1fb 39
Davidroid 0:f5a41692e1fb 40 /* Includes ------------------------------------------------------------------*/
Davidroid 0:f5a41692e1fb 41
Davidroid 0:f5a41692e1fb 42 /* mbed specific header files. */
Davidroid 0:f5a41692e1fb 43 #include "mbed.h"
Davidroid 16:e39f206f26c8 44 #include "rtos.h"
Davidroid 0:f5a41692e1fb 45
Davidroid 1:1c01b873ad45 46 /* Component specific header files. */
Davidroid 16:e39f206f26c8 47 #include "Led6001.h"
Davidroid 1:1c01b873ad45 48
Davidroid 1:1c01b873ad45 49
Davidroid 1:1c01b873ad45 50 /* Definitions ---------------------------------------------------------------*/
Davidroid 1:1c01b873ad45 51
Davidroid 3:ed347127fc38 52 /* PI. */
Davidroid 3:ed347127fc38 53 #ifndef M_PI
Davidroid 14:f2ba2ca417d3 54 #define M_PI (3.14159265358979323846f)
Davidroid 3:ed347127fc38 55 #endif
Davidroid 3:ed347127fc38 56
Davidroid 2:dbd596540d46 57 /* Loop period in micro-seconds. */
Davidroid 14:f2ba2ca417d3 58 #define LOOP_PERIOD_us (1E5)
Davidroid 3:ed347127fc38 59
Davidroid 3:ed347127fc38 60 /* Sin period in micro-seconds. */
Davidroid 14:f2ba2ca417d3 61 #define PWM_SIN_PERIOD_us (1E7)
Davidroid 14:f2ba2ca417d3 62 #define ANALOG_SIN_PERIOD_us (1E7)
Davidroid 2:dbd596540d46 63
Davidroid 2:dbd596540d46 64 /* Duration of button press in milli-seconds. */
Davidroid 14:f2ba2ca417d3 65 #define SWITCH_DEMO_BUTTON_PRESS_ms (500)
Davidroid 14:f2ba2ca417d3 66 #define SWITCH_POWER_BUTTON_PRESS_ms (2000)
Davidroid 2:dbd596540d46 67
Davidroid 2:dbd596540d46 68 /* Dimming Step. */
Davidroid 14:f2ba2ca417d3 69 #define DIMMING_STEP (0.05f)
Davidroid 2:dbd596540d46 70
Davidroid 2:dbd596540d46 71
Davidroid 2:dbd596540d46 72 /* Types ---------------------------------------------------------------------*/
Davidroid 2:dbd596540d46 73
Davidroid 2:dbd596540d46 74 /* Demos. */
Davidroid 2:dbd596540d46 75 typedef enum
Davidroid 2:dbd596540d46 76 {
Davidroid 5:b00bbf1edfa9 77 MANUAL_PWM_DIMMING = 0,
Davidroid 5:b00bbf1edfa9 78 MANUAL_ANALOG_DIMMING,
Davidroid 5:b00bbf1edfa9 79 AUTOMATIC_PWM_DIMMING,
Davidroid 5:b00bbf1edfa9 80 AUTOMATIC_ANALOG_DIMMING,
Davidroid 5:b00bbf1edfa9 81 PHOTO_BASED_ANALOG_DIMMING,
Davidroid 2:dbd596540d46 82 LED_DEMO_SIZE
Davidroid 16:e39f206f26c8 83 } led_demo_t;
Davidroid 2:dbd596540d46 84
Davidroid 2:dbd596540d46 85 /* Actions. */
Davidroid 2:dbd596540d46 86 typedef enum
Davidroid 2:dbd596540d46 87 {
Davidroid 2:dbd596540d46 88 SWITCH_POWER = 0,
Davidroid 2:dbd596540d46 89 SWITCH_DEMO,
Davidroid 2:dbd596540d46 90 SWITCH_STATE,
Davidroid 2:dbd596540d46 91 NO_ACTION
Davidroid 16:e39f206f26c8 92 } led_action_t;
Davidroid 1:1c01b873ad45 93
Davidroid 1:1c01b873ad45 94
Davidroid 1:1c01b873ad45 95 /* Variables -----------------------------------------------------------------*/
Davidroid 1:1c01b873ad45 96
Davidroid 2:dbd596540d46 97 /* Main loop's ticker. */
Davidroid 2:dbd596540d46 98 static Ticker ticker;
Davidroid 1:1c01b873ad45 99
Davidroid 2:dbd596540d46 100 /* User Button's interrupt. */
Davidroid 2:dbd596540d46 101 static InterruptIn button(USER_BUTTON);
Davidroid 1:1c01b873ad45 102
Davidroid 1:1c01b873ad45 103 /* MCU Board's Led which provides the user with a visual feedback on
Davidroid 1:1c01b873ad45 104 the user button's status (ON = pressed, OFF = released). */
Davidroid 1:1c01b873ad45 105 DigitalOut button_pressed_led(LED1);
Davidroid 1:1c01b873ad45 106
Davidroid 2:dbd596540d46 107 /* LED Control Component. */
Davidroid 16:e39f206f26c8 108 Led6001 *led;
Davidroid 2:dbd596540d46 109
Davidroid 2:dbd596540d46 110 /* Interrupt flags. */
Davidroid 14:f2ba2ca417d3 111 static volatile bool ticker_irq_triggered = false;
Davidroid 14:f2ba2ca417d3 112 static volatile bool button_irq_triggered = false;
Davidroid 14:f2ba2ca417d3 113 static volatile bool xfault_irq_triggered = false;
Davidroid 2:dbd596540d46 114
Davidroid 2:dbd596540d46 115 /* Demo State. */
Davidroid 16:e39f206f26c8 116 static volatile led_demo_t demo;
Davidroid 16:e39f206f26c8 117 static volatile led_action_t action;
Davidroid 2:dbd596540d46 118 static volatile bool power_on;
Davidroid 2:dbd596540d46 119
Davidroid 2:dbd596540d46 120 /* Demos' Names. */
Davidroid 2:dbd596540d46 121 static char* demos[] =
Davidroid 2:dbd596540d46 122 {
Davidroid 2:dbd596540d46 123 "Manual PWM Dimming",
Davidroid 2:dbd596540d46 124 "Manual Analog Dimming",
Davidroid 3:ed347127fc38 125 "Sinusoidal PWM Dimming",
Davidroid 3:ed347127fc38 126 "Sinusoidal Analog Dimming",
Davidroid 5:b00bbf1edfa9 127 "Photo-based Analog Dimming"
Davidroid 2:dbd596540d46 128 };
Davidroid 1:1c01b873ad45 129
Davidroid 1:1c01b873ad45 130
Davidroid 1:1c01b873ad45 131 /* Functions -----------------------------------------------------------------*/
Davidroid 1:1c01b873ad45 132
Davidroid 1:1c01b873ad45 133 /**
Davidroid 14:f2ba2ca417d3 134 * @brief Initializing the demo.
Davidroid 2:dbd596540d46 135 * @param None.
Davidroid 2:dbd596540d46 136 * @retval None.
Davidroid 1:1c01b873ad45 137 */
Davidroid 16:e39f206f26c8 138 void init_demo(void)
Davidroid 1:1c01b873ad45 139 {
Davidroid 2:dbd596540d46 140 power_on = true;
Davidroid 2:dbd596540d46 141 action = SWITCH_DEMO;
Davidroid 16:e39f206f26c8 142 demo = (led_demo_t) (LED_DEMO_SIZE - 1);
Davidroid 1:1c01b873ad45 143 }
Davidroid 1:1c01b873ad45 144
Davidroid 1:1c01b873ad45 145 /**
Davidroid 2:dbd596540d46 146 * @brief Handling the LED capabilities and executing several demos.
Davidroid 2:dbd596540d46 147 * @param None.
Davidroid 2:dbd596540d46 148 * @retval None.
Davidroid 1:1c01b873ad45 149 */
Davidroid 16:e39f206f26c8 150 void led_handler(void)
Davidroid 1:1c01b873ad45 151 {
Davidroid 3:ed347127fc38 152 static int tick = 0;
Davidroid 14:f2ba2ca417d3 153 static float pwm_dimming;
Davidroid 14:f2ba2ca417d3 154 static float analog_dimming;
Davidroid 3:ed347127fc38 155
Davidroid 3:ed347127fc38 156 /* Handling the power switch. */
Davidroid 2:dbd596540d46 157 if (action == SWITCH_POWER)
Davidroid 3:ed347127fc38 158 {
Davidroid 3:ed347127fc38 159 /* Switching the LED power ON/OFF. */
Davidroid 2:dbd596540d46 160 power_on = !power_on;
Davidroid 2:dbd596540d46 161
Davidroid 3:ed347127fc38 162 if (power_on)
Davidroid 3:ed347127fc38 163 {
Davidroid 3:ed347127fc38 164 /* Initializing PWM and Analog dimming to maximum values. */
Davidroid 3:ed347127fc38 165 pwm_dimming = 1.0f;
Davidroid 3:ed347127fc38 166 analog_dimming = 1.0f;
Davidroid 3:ed347127fc38 167 }
Davidroid 3:ed347127fc38 168 else
Davidroid 3:ed347127fc38 169 {
Davidroid 3:ed347127fc38 170 /* Printing to the console. */
Davidroid 3:ed347127fc38 171 printf("%-56s\r", "Power OFF");
Davidroid 3:ed347127fc38 172
Davidroid 3:ed347127fc38 173 /* Powering OFF the LED. */
Davidroid 16:e39f206f26c8 174 led->power_off();
Davidroid 3:ed347127fc38 175 }
Davidroid 3:ed347127fc38 176 }
Davidroid 3:ed347127fc38 177
Davidroid 3:ed347127fc38 178 /* Handling the LED dimming when powered ON. */
Davidroid 2:dbd596540d46 179 if (power_on)
Davidroid 2:dbd596540d46 180 {
Davidroid 2:dbd596540d46 181 /* Switching to the next demo. */
Davidroid 2:dbd596540d46 182 if (action == SWITCH_DEMO)
Davidroid 2:dbd596540d46 183 {
Davidroid 2:dbd596540d46 184 pwm_dimming = 1.0f;
Davidroid 2:dbd596540d46 185 analog_dimming = 1.0f;
Davidroid 3:ed347127fc38 186 tick = 0;
Davidroid 16:e39f206f26c8 187 demo = (led_demo_t) ((demo + 1) % LED_DEMO_SIZE);
Davidroid 2:dbd596540d46 188 }
Davidroid 2:dbd596540d46 189
Davidroid 3:ed347127fc38 190 /* Setting the LED dimming depending on the selected demo. */
Davidroid 2:dbd596540d46 191 switch (demo)
Davidroid 2:dbd596540d46 192 {
Davidroid 2:dbd596540d46 193 /* Changing PWM dimming according to the user button. */
Davidroid 5:b00bbf1edfa9 194 case MANUAL_PWM_DIMMING:
Davidroid 2:dbd596540d46 195 if (action == SWITCH_STATE)
Davidroid 2:dbd596540d46 196 {
Davidroid 2:dbd596540d46 197 pwm_dimming -= DIMMING_STEP;
Davidroid 5:b00bbf1edfa9 198 pwm_dimming = (pwm_dimming < 0.0f ? 1.0f : pwm_dimming);
Davidroid 2:dbd596540d46 199 }
Davidroid 2:dbd596540d46 200 break;
Davidroid 3:ed347127fc38 201
Davidroid 2:dbd596540d46 202 /* Changing Analog dimming according to the user button. */
Davidroid 5:b00bbf1edfa9 203 case MANUAL_ANALOG_DIMMING:
Davidroid 2:dbd596540d46 204 if (action == SWITCH_STATE)
Davidroid 2:dbd596540d46 205 {
Davidroid 2:dbd596540d46 206 analog_dimming -= DIMMING_STEP;
Davidroid 5:b00bbf1edfa9 207 analog_dimming = (analog_dimming < 0.0f ? 1.0f : analog_dimming);
Davidroid 2:dbd596540d46 208 }
Davidroid 2:dbd596540d46 209 break;
Davidroid 3:ed347127fc38 210
Davidroid 2:dbd596540d46 211 /* Changing PWM dimming continuously. */
Davidroid 5:b00bbf1edfa9 212 case AUTOMATIC_PWM_DIMMING:
Davidroid 3:ed347127fc38 213 pwm_dimming = 0.5f * sin(2 * M_PI * (tick++ * LOOP_PERIOD_us) / PWM_SIN_PERIOD_us) + 0.5f;
Davidroid 7:5763474c7551 214 tick %= (int) (PWM_SIN_PERIOD_us / LOOP_PERIOD_us);
Davidroid 2:dbd596540d46 215 action = SWITCH_STATE;
Davidroid 2:dbd596540d46 216 break;
Davidroid 3:ed347127fc38 217
Davidroid 2:dbd596540d46 218 /* Changing Analog dimming continuously. */
Davidroid 5:b00bbf1edfa9 219 case AUTOMATIC_ANALOG_DIMMING:
Davidroid 3:ed347127fc38 220 analog_dimming = 0.5f * sin(2 * M_PI * (tick++ * LOOP_PERIOD_us) / ANALOG_SIN_PERIOD_us) + 0.5f;
Davidroid 7:5763474c7551 221 tick %= (int) (ANALOG_SIN_PERIOD_us / LOOP_PERIOD_us);
Davidroid 2:dbd596540d46 222 action = SWITCH_STATE;
Davidroid 2:dbd596540d46 223 break;
Davidroid 3:ed347127fc38 224
Davidroid 2:dbd596540d46 225 /* Setting Analog dimming according to the photo sensor. */
Davidroid 5:b00bbf1edfa9 226 case PHOTO_BASED_ANALOG_DIMMING:
Davidroid 16:e39f206f26c8 227 analog_dimming = 1.0f - led->get_current();
Davidroid 2:dbd596540d46 228 action = SWITCH_STATE;
Davidroid 2:dbd596540d46 229 break;
Davidroid 2:dbd596540d46 230 }
Davidroid 2:dbd596540d46 231
Davidroid 3:ed347127fc38 232 /* Writing PWM and Analog dimming values to the LED. */
Davidroid 3:ed347127fc38 233 if (action != NO_ACTION)
Davidroid 3:ed347127fc38 234 {
Davidroid 3:ed347127fc38 235 /* Printing to the console. */
Davidroid 5:b00bbf1edfa9 236 printf("%d) %-26s --> Dimming: %0.2f\r", demo + 1, demos[demo], demo == MANUAL_PWM_DIMMING || demo == AUTOMATIC_PWM_DIMMING ? pwm_dimming : analog_dimming);
Davidroid 2:dbd596540d46 237
Davidroid 2:dbd596540d46 238 /* Writing PWM and Analog dimming values to the LED. */
Davidroid 16:e39f206f26c8 239 led->set_pwm_dimming(pwm_dimming);
Davidroid 16:e39f206f26c8 240 led->set_analog_dimming(analog_dimming);
Davidroid 2:dbd596540d46 241 }
Davidroid 3:ed347127fc38 242 }
Davidroid 2:dbd596540d46 243
Davidroid 3:ed347127fc38 244 /* Resetting the action. */
Davidroid 3:ed347127fc38 245 action = NO_ACTION;
Davidroid 2:dbd596540d46 246 }
Davidroid 2:dbd596540d46 247
Davidroid 2:dbd596540d46 248 /**
Davidroid 2:dbd596540d46 249 * @brief Interrupt Request for the main loop's ticker related interrupt.
Davidroid 2:dbd596540d46 250 * @param None.
Davidroid 2:dbd596540d46 251 * @retval None.
Davidroid 2:dbd596540d46 252 */
Davidroid 16:e39f206f26c8 253 void ticker_irq(void)
Davidroid 2:dbd596540d46 254 {
Davidroid 2:dbd596540d46 255 ticker_irq_triggered = true;
Davidroid 2:dbd596540d46 256 }
Davidroid 2:dbd596540d46 257
Davidroid 2:dbd596540d46 258 /**
Davidroid 2:dbd596540d46 259 * @brief Interrupt Request for the user button's interrupt.
Davidroid 2:dbd596540d46 260 * @param None.
Davidroid 2:dbd596540d46 261 * @retval None.
Davidroid 2:dbd596540d46 262 */
Davidroid 16:e39f206f26c8 263 void button_irq(void)
Davidroid 2:dbd596540d46 264 {
Davidroid 2:dbd596540d46 265 button_irq_triggered = true;
Davidroid 1:1c01b873ad45 266 button.disable_irq();
Davidroid 1:1c01b873ad45 267 }
Davidroid 1:1c01b873ad45 268
Davidroid 1:1c01b873ad45 269 /**
Davidroid 2:dbd596540d46 270 * @brief Interrupt Request for the component's XFAULT interrupt.
Davidroid 2:dbd596540d46 271 * @param None.
Davidroid 2:dbd596540d46 272 * @retval None.
Davidroid 1:1c01b873ad45 273 */
Davidroid 16:e39f206f26c8 274 void xfault_irq(void)
Davidroid 1:1c01b873ad45 275 {
Davidroid 1:1c01b873ad45 276 xfault_irq_triggered = true;
Davidroid 16:e39f206f26c8 277 led->disable_xfault_irq();
Davidroid 1:1c01b873ad45 278 }
Davidroid 1:1c01b873ad45 279
Davidroid 1:1c01b873ad45 280 /**
Davidroid 2:dbd596540d46 281 * @brief Interrupt Handler for the user button's interrupt.
Davidroid 2:dbd596540d46 282 * @param None.
Davidroid 2:dbd596540d46 283 * @retval None.
Davidroid 1:1c01b873ad45 284 */
Davidroid 16:e39f206f26c8 285 void button_handler(void)
Davidroid 1:1c01b873ad45 286 {
Davidroid 2:dbd596540d46 287 /* User Button's timer to measure the time the button remains pressed. */
Davidroid 2:dbd596540d46 288 static Timer button_pressed_timer;
Davidroid 2:dbd596540d46 289
Davidroid 1:1c01b873ad45 290 bool button_pressed_flag = (button.read() == 0 ? true : false);
Davidroid 1:1c01b873ad45 291
Davidroid 1:1c01b873ad45 292 if (button_pressed_flag)
Davidroid 1:1c01b873ad45 293 {
Davidroid 1:1c01b873ad45 294 button_pressed_led = 1;
Davidroid 1:1c01b873ad45 295 button_pressed_timer.start();
Davidroid 1:1c01b873ad45 296 }
Davidroid 1:1c01b873ad45 297 else
Davidroid 1:1c01b873ad45 298 {
Davidroid 1:1c01b873ad45 299 button_pressed_led = 0;
Davidroid 1:1c01b873ad45 300 button_pressed_timer.stop();
Davidroid 1:1c01b873ad45 301
Davidroid 1:1c01b873ad45 302 /* Either changing current demo's state or switching to the next demo. */
Davidroid 2:dbd596540d46 303 int time_pressed = button_pressed_timer.read_ms();
Davidroid 2:dbd596540d46 304 if (time_pressed < SWITCH_DEMO_BUTTON_PRESS_ms)
Davidroid 2:dbd596540d46 305 action = SWITCH_STATE;
Davidroid 2:dbd596540d46 306 else if (time_pressed < SWITCH_POWER_BUTTON_PRESS_ms)
Davidroid 2:dbd596540d46 307 action = SWITCH_DEMO;
Davidroid 1:1c01b873ad45 308 else
Davidroid 2:dbd596540d46 309 action = SWITCH_POWER;
Davidroid 1:1c01b873ad45 310
Davidroid 1:1c01b873ad45 311 button_pressed_timer.reset();
Davidroid 1:1c01b873ad45 312 }
Davidroid 1:1c01b873ad45 313
Davidroid 1:1c01b873ad45 314 button.enable_irq();
Davidroid 1:1c01b873ad45 315 }
Davidroid 0:f5a41692e1fb 316
Davidroid 2:dbd596540d46 317 /**
Davidroid 2:dbd596540d46 318 * @brief Interrupt Handler for the component's XFAULT interrupt.
Davidroid 2:dbd596540d46 319 * @param None.
Davidroid 2:dbd596540d46 320 * @retval None.
Davidroid 2:dbd596540d46 321 */
Davidroid 16:e39f206f26c8 322 void xfault_handler(void)
Davidroid 2:dbd596540d46 323 {
Davidroid 2:dbd596540d46 324 /* Printing to the console. */
Davidroid 14:f2ba2ca417d3 325 printf("XFAULT Interrupt detected! Re-initializing LED driver...");
Davidroid 14:f2ba2ca417d3 326
Davidroid 14:f2ba2ca417d3 327 /* Re-starting-up LED Control Component. */
Davidroid 16:e39f206f26c8 328 led->start_up();
Davidroid 14:f2ba2ca417d3 329
Davidroid 14:f2ba2ca417d3 330 /* Printing to the console. */
Davidroid 14:f2ba2ca417d3 331 printf("Done.\r\n\n");
Davidroid 2:dbd596540d46 332
Davidroid 2:dbd596540d46 333 /* Re-initializing the demo. */
Davidroid 16:e39f206f26c8 334 init_demo();
Davidroid 2:dbd596540d46 335
Davidroid 16:e39f206f26c8 336 led->enable_xfault_irq();
Davidroid 2:dbd596540d46 337 }
Davidroid 2:dbd596540d46 338
Davidroid 0:f5a41692e1fb 339
Davidroid 0:f5a41692e1fb 340 /* Main ----------------------------------------------------------------------*/
Davidroid 0:f5a41692e1fb 341
Davidroid 0:f5a41692e1fb 342 int main()
Davidroid 0:f5a41692e1fb 343 {
Davidroid 0:f5a41692e1fb 344 /*----- Initialization. -----*/
Davidroid 0:f5a41692e1fb 345
Davidroid 2:dbd596540d46 346 /* Printing to the console. */
Davidroid 5:b00bbf1edfa9 347 printf("LED Control Application Example\r\n\n" \
Davidroid 5:b00bbf1edfa9 348 "Demos:\r\n");
Davidroid 5:b00bbf1edfa9 349 int demo = 0;
Davidroid 5:b00bbf1edfa9 350 for (demo = 0; demo < LED_DEMO_SIZE; demo++)
Davidroid 7:5763474c7551 351 printf("%d) %-26s\r\n", demo + 1, demos[demo]);
Davidroid 5:b00bbf1edfa9 352 printf("\r\nActions:\r\n" \
Davidroid 5:b00bbf1edfa9 353 "+ Short Button Press [<%.1fs] --> Manual Dimming\r\n" \
Davidroid 5:b00bbf1edfa9 354 "+ Medium Button Press --> Switch Demo\r\n" \
Davidroid 5:b00bbf1edfa9 355 "+ Long Button Press [>%.1fs] --> Switch Power ON/OFF\r\n\n" \
Davidroid 4:aeeb361d0227 356 , SWITCH_DEMO_BUTTON_PRESS_ms / 1000.0f, SWITCH_POWER_BUTTON_PRESS_ms / 1000.0f);
Davidroid 2:dbd596540d46 357
Davidroid 1:1c01b873ad45 358 /* Initializing LED Control Component. */
Davidroid 16:e39f206f26c8 359 led = new Led6001(D4, A3, D6, D5);
Davidroid 16:e39f206f26c8 360 if (led->init() != COMPONENT_OK)
Davidroid 1:1c01b873ad45 361 exit(EXIT_FAILURE);
Davidroid 1:1c01b873ad45 362
Davidroid 1:1c01b873ad45 363 /* Attaching interrupt request functions. */
Davidroid 16:e39f206f26c8 364 button.fall(button_irq);
Davidroid 16:e39f206f26c8 365 button.rise(button_irq);
Davidroid 16:e39f206f26c8 366 led->attach_xfault_irq(&xfault_irq);
Davidroid 16:e39f206f26c8 367 led->enable_xfault_irq();
Davidroid 16:e39f206f26c8 368 ticker.attach_us(ticker_irq, LOOP_PERIOD_us);
Davidroid 1:1c01b873ad45 369
Davidroid 14:f2ba2ca417d3 370 /* Starting-up LED Control Component. */
Davidroid 16:e39f206f26c8 371 led->start_up();
Davidroid 14:f2ba2ca417d3 372
Davidroid 2:dbd596540d46 373 /* Initializing the demo. */
Davidroid 16:e39f206f26c8 374 init_demo();
Davidroid 0:f5a41692e1fb 375
Davidroid 0:f5a41692e1fb 376
Davidroid 0:f5a41692e1fb 377 /*----- LED Control. -----*/
Davidroid 1:1c01b873ad45 378
Davidroid 2:dbd596540d46 379 /* Either performing the component handler, interrupt handlers, or waiting for events. */
Davidroid 1:1c01b873ad45 380 while (true)
Davidroid 1:1c01b873ad45 381 {
Davidroid 2:dbd596540d46 382 if (ticker_irq_triggered)
Davidroid 1:1c01b873ad45 383 {
Davidroid 2:dbd596540d46 384 ticker_irq_triggered = false;
Davidroid 16:e39f206f26c8 385 led_handler();
Davidroid 1:1c01b873ad45 386 } else if (button_irq_triggered)
Davidroid 1:1c01b873ad45 387 {
Davidroid 1:1c01b873ad45 388 button_irq_triggered = false;
Davidroid 16:e39f206f26c8 389 button_handler();
Davidroid 5:b00bbf1edfa9 390 } else if (xfault_irq_triggered)
Davidroid 1:1c01b873ad45 391 {
Davidroid 1:1c01b873ad45 392 xfault_irq_triggered = false;
Davidroid 16:e39f206f26c8 393 xfault_handler();
Davidroid 5:b00bbf1edfa9 394 } else {
Davidroid 1:1c01b873ad45 395 /* It is recommended that SEVONPEND in the System Control Register is NOT set. */
Davidroid 1:1c01b873ad45 396 __WFE();
Davidroid 1:1c01b873ad45 397 }
Davidroid 1:1c01b873ad45 398 }
Davidroid 1:1c01b873ad45 399 }