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 Mar 14 12:20:07 2016 +0000
Revision:
15:ea1e402ce919
Parent:
14:f2ba2ca417d3
Child:
16:e39f206f26c8
+ Restored D6 as PWM dimming pin.

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 0:f5a41692e1fb 44
Davidroid 1:1c01b873ad45 45 /* Component specific header files. */
Davidroid 1:1c01b873ad45 46 #include "led6001_class.h"
Davidroid 1:1c01b873ad45 47
Davidroid 1:1c01b873ad45 48
Davidroid 1:1c01b873ad45 49 /* Definitions ---------------------------------------------------------------*/
Davidroid 1:1c01b873ad45 50
Davidroid 3:ed347127fc38 51 /* PI. */
Davidroid 3:ed347127fc38 52 #ifndef M_PI
Davidroid 14:f2ba2ca417d3 53 #define M_PI (3.14159265358979323846f)
Davidroid 3:ed347127fc38 54 #endif
Davidroid 3:ed347127fc38 55
Davidroid 2:dbd596540d46 56 /* Loop period in micro-seconds. */
Davidroid 14:f2ba2ca417d3 57 #define LOOP_PERIOD_us (1E5)
Davidroid 3:ed347127fc38 58
Davidroid 3:ed347127fc38 59 /* Sin period in micro-seconds. */
Davidroid 14:f2ba2ca417d3 60 #define PWM_SIN_PERIOD_us (1E7)
Davidroid 14:f2ba2ca417d3 61 #define ANALOG_SIN_PERIOD_us (1E7)
Davidroid 2:dbd596540d46 62
Davidroid 2:dbd596540d46 63 /* Duration of button press in milli-seconds. */
Davidroid 14:f2ba2ca417d3 64 #define SWITCH_DEMO_BUTTON_PRESS_ms (500)
Davidroid 14:f2ba2ca417d3 65 #define SWITCH_POWER_BUTTON_PRESS_ms (2000)
Davidroid 2:dbd596540d46 66
Davidroid 2:dbd596540d46 67 /* Dimming Step. */
Davidroid 14:f2ba2ca417d3 68 #define DIMMING_STEP (0.05f)
Davidroid 2:dbd596540d46 69
Davidroid 2:dbd596540d46 70
Davidroid 2:dbd596540d46 71 /* Types ---------------------------------------------------------------------*/
Davidroid 2:dbd596540d46 72
Davidroid 2:dbd596540d46 73 /* Demos. */
Davidroid 2:dbd596540d46 74 typedef enum
Davidroid 2:dbd596540d46 75 {
Davidroid 5:b00bbf1edfa9 76 MANUAL_PWM_DIMMING = 0,
Davidroid 5:b00bbf1edfa9 77 MANUAL_ANALOG_DIMMING,
Davidroid 5:b00bbf1edfa9 78 AUTOMATIC_PWM_DIMMING,
Davidroid 5:b00bbf1edfa9 79 AUTOMATIC_ANALOG_DIMMING,
Davidroid 5:b00bbf1edfa9 80 PHOTO_BASED_ANALOG_DIMMING,
Davidroid 2:dbd596540d46 81 LED_DEMO_SIZE
Davidroid 2:dbd596540d46 82 } LED_Demo_t;
Davidroid 2:dbd596540d46 83
Davidroid 2:dbd596540d46 84 /* Actions. */
Davidroid 2:dbd596540d46 85 typedef enum
Davidroid 2:dbd596540d46 86 {
Davidroid 2:dbd596540d46 87 SWITCH_POWER = 0,
Davidroid 2:dbd596540d46 88 SWITCH_DEMO,
Davidroid 2:dbd596540d46 89 SWITCH_STATE,
Davidroid 2:dbd596540d46 90 NO_ACTION
Davidroid 2:dbd596540d46 91 } LED_Action_t;
Davidroid 1:1c01b873ad45 92
Davidroid 1:1c01b873ad45 93
Davidroid 1:1c01b873ad45 94 /* Variables -----------------------------------------------------------------*/
Davidroid 1:1c01b873ad45 95
Davidroid 2:dbd596540d46 96 /* Main loop's ticker. */
Davidroid 2:dbd596540d46 97 static Ticker ticker;
Davidroid 1:1c01b873ad45 98
Davidroid 2:dbd596540d46 99 /* User Button's interrupt. */
Davidroid 2:dbd596540d46 100 static InterruptIn button(USER_BUTTON);
Davidroid 1:1c01b873ad45 101
Davidroid 1:1c01b873ad45 102 /* MCU Board's Led which provides the user with a visual feedback on
Davidroid 1:1c01b873ad45 103 the user button's status (ON = pressed, OFF = released). */
Davidroid 1:1c01b873ad45 104 DigitalOut button_pressed_led(LED1);
Davidroid 1:1c01b873ad45 105
Davidroid 2:dbd596540d46 106 /* LED Control Component. */
Davidroid 2:dbd596540d46 107 LED6001 *led;
Davidroid 2:dbd596540d46 108
Davidroid 2:dbd596540d46 109 /* Interrupt flags. */
Davidroid 14:f2ba2ca417d3 110 static volatile bool ticker_irq_triggered = false;
Davidroid 14:f2ba2ca417d3 111 static volatile bool button_irq_triggered = false;
Davidroid 14:f2ba2ca417d3 112 static volatile bool xfault_irq_triggered = false;
Davidroid 2:dbd596540d46 113
Davidroid 2:dbd596540d46 114 /* Demo State. */
Davidroid 2:dbd596540d46 115 static volatile LED_Demo_t demo;
Davidroid 2:dbd596540d46 116 static volatile LED_Action_t action;
Davidroid 2:dbd596540d46 117 static volatile bool power_on;
Davidroid 2:dbd596540d46 118
Davidroid 2:dbd596540d46 119 /* Demos' Names. */
Davidroid 2:dbd596540d46 120 static char* demos[] =
Davidroid 2:dbd596540d46 121 {
Davidroid 2:dbd596540d46 122 "Manual PWM Dimming",
Davidroid 2:dbd596540d46 123 "Manual Analog Dimming",
Davidroid 3:ed347127fc38 124 "Sinusoidal PWM Dimming",
Davidroid 3:ed347127fc38 125 "Sinusoidal Analog Dimming",
Davidroid 5:b00bbf1edfa9 126 "Photo-based Analog Dimming"
Davidroid 2:dbd596540d46 127 };
Davidroid 1:1c01b873ad45 128
Davidroid 1:1c01b873ad45 129
Davidroid 1:1c01b873ad45 130 /* Functions -----------------------------------------------------------------*/
Davidroid 1:1c01b873ad45 131
Davidroid 1:1c01b873ad45 132 /**
Davidroid 14:f2ba2ca417d3 133 * @brief Initializing the demo.
Davidroid 2:dbd596540d46 134 * @param None.
Davidroid 2:dbd596540d46 135 * @retval None.
Davidroid 1:1c01b873ad45 136 */
Davidroid 14:f2ba2ca417d3 137 void InitDemo(void)
Davidroid 1:1c01b873ad45 138 {
Davidroid 2:dbd596540d46 139 power_on = true;
Davidroid 2:dbd596540d46 140 action = SWITCH_DEMO;
Davidroid 2:dbd596540d46 141 demo = (LED_Demo_t) (LED_DEMO_SIZE - 1);
Davidroid 1:1c01b873ad45 142 }
Davidroid 1:1c01b873ad45 143
Davidroid 1:1c01b873ad45 144 /**
Davidroid 2:dbd596540d46 145 * @brief Handling the LED capabilities and executing several demos.
Davidroid 2:dbd596540d46 146 * @param None.
Davidroid 2:dbd596540d46 147 * @retval None.
Davidroid 1:1c01b873ad45 148 */
Davidroid 2:dbd596540d46 149 void LEDHandler(void)
Davidroid 1:1c01b873ad45 150 {
Davidroid 3:ed347127fc38 151 static int tick = 0;
Davidroid 14:f2ba2ca417d3 152 static float pwm_dimming;
Davidroid 14:f2ba2ca417d3 153 static float analog_dimming;
Davidroid 3:ed347127fc38 154
Davidroid 3:ed347127fc38 155 /* Handling the power switch. */
Davidroid 2:dbd596540d46 156 if (action == SWITCH_POWER)
Davidroid 3:ed347127fc38 157 {
Davidroid 3:ed347127fc38 158 /* Switching the LED power ON/OFF. */
Davidroid 2:dbd596540d46 159 power_on = !power_on;
Davidroid 2:dbd596540d46 160
Davidroid 3:ed347127fc38 161 if (power_on)
Davidroid 3:ed347127fc38 162 {
Davidroid 3:ed347127fc38 163 /* Initializing PWM and Analog dimming to maximum values. */
Davidroid 3:ed347127fc38 164 pwm_dimming = 1.0f;
Davidroid 3:ed347127fc38 165 analog_dimming = 1.0f;
Davidroid 3:ed347127fc38 166 }
Davidroid 3:ed347127fc38 167 else
Davidroid 3:ed347127fc38 168 {
Davidroid 3:ed347127fc38 169 /* Printing to the console. */
Davidroid 3:ed347127fc38 170 printf("%-56s\r", "Power OFF");
Davidroid 3:ed347127fc38 171
Davidroid 3:ed347127fc38 172 /* Powering OFF the LED. */
Davidroid 3:ed347127fc38 173 led->PowerOFF();
Davidroid 3:ed347127fc38 174 }
Davidroid 3:ed347127fc38 175 }
Davidroid 3:ed347127fc38 176
Davidroid 3:ed347127fc38 177 /* Handling the LED dimming when powered ON. */
Davidroid 2:dbd596540d46 178 if (power_on)
Davidroid 2:dbd596540d46 179 {
Davidroid 2:dbd596540d46 180 /* Switching to the next demo. */
Davidroid 2:dbd596540d46 181 if (action == SWITCH_DEMO)
Davidroid 2:dbd596540d46 182 {
Davidroid 2:dbd596540d46 183 pwm_dimming = 1.0f;
Davidroid 2:dbd596540d46 184 analog_dimming = 1.0f;
Davidroid 3:ed347127fc38 185 tick = 0;
Davidroid 2:dbd596540d46 186 demo = (LED_Demo_t) ((demo + 1) % LED_DEMO_SIZE);
Davidroid 2:dbd596540d46 187 }
Davidroid 2:dbd596540d46 188
Davidroid 3:ed347127fc38 189 /* Setting the LED dimming depending on the selected demo. */
Davidroid 2:dbd596540d46 190 switch (demo)
Davidroid 2:dbd596540d46 191 {
Davidroid 2:dbd596540d46 192 /* Changing PWM dimming according to the user button. */
Davidroid 5:b00bbf1edfa9 193 case MANUAL_PWM_DIMMING:
Davidroid 2:dbd596540d46 194 if (action == SWITCH_STATE)
Davidroid 2:dbd596540d46 195 {
Davidroid 2:dbd596540d46 196 pwm_dimming -= DIMMING_STEP;
Davidroid 5:b00bbf1edfa9 197 pwm_dimming = (pwm_dimming < 0.0f ? 1.0f : pwm_dimming);
Davidroid 2:dbd596540d46 198 }
Davidroid 2:dbd596540d46 199 break;
Davidroid 3:ed347127fc38 200
Davidroid 2:dbd596540d46 201 /* Changing Analog dimming according to the user button. */
Davidroid 5:b00bbf1edfa9 202 case MANUAL_ANALOG_DIMMING:
Davidroid 2:dbd596540d46 203 if (action == SWITCH_STATE)
Davidroid 2:dbd596540d46 204 {
Davidroid 2:dbd596540d46 205 analog_dimming -= DIMMING_STEP;
Davidroid 5:b00bbf1edfa9 206 analog_dimming = (analog_dimming < 0.0f ? 1.0f : analog_dimming);
Davidroid 2:dbd596540d46 207 }
Davidroid 2:dbd596540d46 208 break;
Davidroid 3:ed347127fc38 209
Davidroid 2:dbd596540d46 210 /* Changing PWM dimming continuously. */
Davidroid 5:b00bbf1edfa9 211 case AUTOMATIC_PWM_DIMMING:
Davidroid 3:ed347127fc38 212 pwm_dimming = 0.5f * sin(2 * M_PI * (tick++ * LOOP_PERIOD_us) / PWM_SIN_PERIOD_us) + 0.5f;
Davidroid 7:5763474c7551 213 tick %= (int) (PWM_SIN_PERIOD_us / LOOP_PERIOD_us);
Davidroid 2:dbd596540d46 214 action = SWITCH_STATE;
Davidroid 2:dbd596540d46 215 break;
Davidroid 3:ed347127fc38 216
Davidroid 2:dbd596540d46 217 /* Changing Analog dimming continuously. */
Davidroid 5:b00bbf1edfa9 218 case AUTOMATIC_ANALOG_DIMMING:
Davidroid 3:ed347127fc38 219 analog_dimming = 0.5f * sin(2 * M_PI * (tick++ * LOOP_PERIOD_us) / ANALOG_SIN_PERIOD_us) + 0.5f;
Davidroid 7:5763474c7551 220 tick %= (int) (ANALOG_SIN_PERIOD_us / LOOP_PERIOD_us);
Davidroid 2:dbd596540d46 221 action = SWITCH_STATE;
Davidroid 2:dbd596540d46 222 break;
Davidroid 3:ed347127fc38 223
Davidroid 2:dbd596540d46 224 /* Setting Analog dimming according to the photo sensor. */
Davidroid 5:b00bbf1edfa9 225 case PHOTO_BASED_ANALOG_DIMMING:
Davidroid 3:ed347127fc38 226 analog_dimming = 1.0f - led->GetCurrent();
Davidroid 2:dbd596540d46 227 action = SWITCH_STATE;
Davidroid 2:dbd596540d46 228 break;
Davidroid 2:dbd596540d46 229 }
Davidroid 2:dbd596540d46 230
Davidroid 3:ed347127fc38 231 /* Writing PWM and Analog dimming values to the LED. */
Davidroid 3:ed347127fc38 232 if (action != NO_ACTION)
Davidroid 3:ed347127fc38 233 {
Davidroid 3:ed347127fc38 234 /* Printing to the console. */
Davidroid 5:b00bbf1edfa9 235 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 236
Davidroid 2:dbd596540d46 237 /* Writing PWM and Analog dimming values to the LED. */
Davidroid 2:dbd596540d46 238 led->SetPWMDimming(pwm_dimming);
Davidroid 2:dbd596540d46 239 led->SetAnalogDimming(analog_dimming);
Davidroid 2:dbd596540d46 240 }
Davidroid 3:ed347127fc38 241 }
Davidroid 2:dbd596540d46 242
Davidroid 3:ed347127fc38 243 /* Resetting the action. */
Davidroid 3:ed347127fc38 244 action = NO_ACTION;
Davidroid 2:dbd596540d46 245 }
Davidroid 2:dbd596540d46 246
Davidroid 2:dbd596540d46 247 /**
Davidroid 2:dbd596540d46 248 * @brief Interrupt Request for the main loop's ticker related interrupt.
Davidroid 2:dbd596540d46 249 * @param None.
Davidroid 2:dbd596540d46 250 * @retval None.
Davidroid 2:dbd596540d46 251 */
Davidroid 2:dbd596540d46 252 void TickerIRQ(void)
Davidroid 2:dbd596540d46 253 {
Davidroid 2:dbd596540d46 254 ticker_irq_triggered = true;
Davidroid 2:dbd596540d46 255 }
Davidroid 2:dbd596540d46 256
Davidroid 2:dbd596540d46 257 /**
Davidroid 2:dbd596540d46 258 * @brief Interrupt Request for the user button's interrupt.
Davidroid 2:dbd596540d46 259 * @param None.
Davidroid 2:dbd596540d46 260 * @retval None.
Davidroid 2:dbd596540d46 261 */
Davidroid 2:dbd596540d46 262 void ButtonIRQ(void)
Davidroid 2:dbd596540d46 263 {
Davidroid 2:dbd596540d46 264 button_irq_triggered = true;
Davidroid 1:1c01b873ad45 265 button.disable_irq();
Davidroid 1:1c01b873ad45 266 }
Davidroid 1:1c01b873ad45 267
Davidroid 1:1c01b873ad45 268 /**
Davidroid 2:dbd596540d46 269 * @brief Interrupt Request for the component's XFAULT interrupt.
Davidroid 2:dbd596540d46 270 * @param None.
Davidroid 2:dbd596540d46 271 * @retval None.
Davidroid 1:1c01b873ad45 272 */
Davidroid 1:1c01b873ad45 273 void XFaultIRQ(void)
Davidroid 1:1c01b873ad45 274 {
Davidroid 1:1c01b873ad45 275 xfault_irq_triggered = true;
Davidroid 1:1c01b873ad45 276 led->DisableXFaultIRQ();
Davidroid 1:1c01b873ad45 277 }
Davidroid 1:1c01b873ad45 278
Davidroid 1:1c01b873ad45 279 /**
Davidroid 2:dbd596540d46 280 * @brief Interrupt Handler for the user button's interrupt.
Davidroid 2:dbd596540d46 281 * @param None.
Davidroid 2:dbd596540d46 282 * @retval None.
Davidroid 1:1c01b873ad45 283 */
Davidroid 1:1c01b873ad45 284 void ButtonHandler(void)
Davidroid 1:1c01b873ad45 285 {
Davidroid 2:dbd596540d46 286 /* User Button's timer to measure the time the button remains pressed. */
Davidroid 2:dbd596540d46 287 static Timer button_pressed_timer;
Davidroid 2:dbd596540d46 288
Davidroid 1:1c01b873ad45 289 bool button_pressed_flag = (button.read() == 0 ? true : false);
Davidroid 1:1c01b873ad45 290
Davidroid 1:1c01b873ad45 291 if (button_pressed_flag)
Davidroid 1:1c01b873ad45 292 {
Davidroid 1:1c01b873ad45 293 button_pressed_led = 1;
Davidroid 1:1c01b873ad45 294 button_pressed_timer.start();
Davidroid 1:1c01b873ad45 295 }
Davidroid 1:1c01b873ad45 296 else
Davidroid 1:1c01b873ad45 297 {
Davidroid 1:1c01b873ad45 298 button_pressed_led = 0;
Davidroid 1:1c01b873ad45 299 button_pressed_timer.stop();
Davidroid 1:1c01b873ad45 300
Davidroid 1:1c01b873ad45 301 /* Either changing current demo's state or switching to the next demo. */
Davidroid 2:dbd596540d46 302 int time_pressed = button_pressed_timer.read_ms();
Davidroid 2:dbd596540d46 303 if (time_pressed < SWITCH_DEMO_BUTTON_PRESS_ms)
Davidroid 2:dbd596540d46 304 action = SWITCH_STATE;
Davidroid 2:dbd596540d46 305 else if (time_pressed < SWITCH_POWER_BUTTON_PRESS_ms)
Davidroid 2:dbd596540d46 306 action = SWITCH_DEMO;
Davidroid 1:1c01b873ad45 307 else
Davidroid 2:dbd596540d46 308 action = SWITCH_POWER;
Davidroid 1:1c01b873ad45 309
Davidroid 1:1c01b873ad45 310 button_pressed_timer.reset();
Davidroid 1:1c01b873ad45 311 }
Davidroid 1:1c01b873ad45 312
Davidroid 1:1c01b873ad45 313 button.enable_irq();
Davidroid 1:1c01b873ad45 314 }
Davidroid 0:f5a41692e1fb 315
Davidroid 2:dbd596540d46 316 /**
Davidroid 2:dbd596540d46 317 * @brief Interrupt Handler for the component's XFAULT interrupt.
Davidroid 2:dbd596540d46 318 * @param None.
Davidroid 2:dbd596540d46 319 * @retval None.
Davidroid 2:dbd596540d46 320 */
Davidroid 2:dbd596540d46 321 void XFaultHandler(void)
Davidroid 2:dbd596540d46 322 {
Davidroid 2:dbd596540d46 323 /* Printing to the console. */
Davidroid 14:f2ba2ca417d3 324 printf("XFAULT Interrupt detected! Re-initializing LED driver...");
Davidroid 14:f2ba2ca417d3 325
Davidroid 14:f2ba2ca417d3 326 /* Re-starting-up LED Control Component. */
Davidroid 14:f2ba2ca417d3 327 led->StartUp();
Davidroid 14:f2ba2ca417d3 328
Davidroid 14:f2ba2ca417d3 329 /* Printing to the console. */
Davidroid 14:f2ba2ca417d3 330 printf("Done.\r\n\n");
Davidroid 2:dbd596540d46 331
Davidroid 2:dbd596540d46 332 /* Re-initializing the demo. */
Davidroid 14:f2ba2ca417d3 333 InitDemo();
Davidroid 2:dbd596540d46 334
Davidroid 2:dbd596540d46 335 led->EnableXFaultIRQ();
Davidroid 2:dbd596540d46 336 }
Davidroid 2:dbd596540d46 337
Davidroid 0:f5a41692e1fb 338
Davidroid 0:f5a41692e1fb 339 /* Main ----------------------------------------------------------------------*/
Davidroid 0:f5a41692e1fb 340
Davidroid 0:f5a41692e1fb 341 int main()
Davidroid 0:f5a41692e1fb 342 {
Davidroid 0:f5a41692e1fb 343 /*----- Initialization. -----*/
Davidroid 0:f5a41692e1fb 344
Davidroid 2:dbd596540d46 345 /* Printing to the console. */
Davidroid 5:b00bbf1edfa9 346 printf("LED Control Application Example\r\n\n" \
Davidroid 5:b00bbf1edfa9 347 "Demos:\r\n");
Davidroid 5:b00bbf1edfa9 348 int demo = 0;
Davidroid 5:b00bbf1edfa9 349 for (demo = 0; demo < LED_DEMO_SIZE; demo++)
Davidroid 7:5763474c7551 350 printf("%d) %-26s\r\n", demo + 1, demos[demo]);
Davidroid 5:b00bbf1edfa9 351 printf("\r\nActions:\r\n" \
Davidroid 5:b00bbf1edfa9 352 "+ Short Button Press [<%.1fs] --> Manual Dimming\r\n" \
Davidroid 5:b00bbf1edfa9 353 "+ Medium Button Press --> Switch Demo\r\n" \
Davidroid 5:b00bbf1edfa9 354 "+ Long Button Press [>%.1fs] --> Switch Power ON/OFF\r\n\n" \
Davidroid 4:aeeb361d0227 355 , SWITCH_DEMO_BUTTON_PRESS_ms / 1000.0f, SWITCH_POWER_BUTTON_PRESS_ms / 1000.0f);
Davidroid 2:dbd596540d46 356
Davidroid 1:1c01b873ad45 357 /* Initializing LED Control Component. */
Davidroid 15:ea1e402ce919 358 led = new LED6001(D4, A3, D6, D5);
Davidroid 2:dbd596540d46 359 if (led->Init() != COMPONENT_OK)
Davidroid 1:1c01b873ad45 360 exit(EXIT_FAILURE);
Davidroid 1:1c01b873ad45 361
Davidroid 1:1c01b873ad45 362 /* Attaching interrupt request functions. */
Davidroid 1:1c01b873ad45 363 button.fall(ButtonIRQ);
Davidroid 1:1c01b873ad45 364 button.rise(ButtonIRQ);
Davidroid 1:1c01b873ad45 365 led->AttachXFaultIRQ(&XFaultIRQ);
Davidroid 5:b00bbf1edfa9 366 led->EnableXFaultIRQ();
Davidroid 2:dbd596540d46 367 ticker.attach_us(TickerIRQ, LOOP_PERIOD_us);
Davidroid 1:1c01b873ad45 368
Davidroid 14:f2ba2ca417d3 369 /* Starting-up LED Control Component. */
Davidroid 14:f2ba2ca417d3 370 led->StartUp();
Davidroid 14:f2ba2ca417d3 371
Davidroid 2:dbd596540d46 372 /* Initializing the demo. */
Davidroid 14:f2ba2ca417d3 373 InitDemo();
Davidroid 0:f5a41692e1fb 374
Davidroid 0:f5a41692e1fb 375
Davidroid 0:f5a41692e1fb 376 /*----- LED Control. -----*/
Davidroid 1:1c01b873ad45 377
Davidroid 2:dbd596540d46 378 /* Either performing the component handler, interrupt handlers, or waiting for events. */
Davidroid 1:1c01b873ad45 379 while (true)
Davidroid 1:1c01b873ad45 380 {
Davidroid 2:dbd596540d46 381 if (ticker_irq_triggered)
Davidroid 1:1c01b873ad45 382 {
Davidroid 2:dbd596540d46 383 ticker_irq_triggered = false;
Davidroid 1:1c01b873ad45 384 LEDHandler();
Davidroid 1:1c01b873ad45 385 } else if (button_irq_triggered)
Davidroid 1:1c01b873ad45 386 {
Davidroid 1:1c01b873ad45 387 button_irq_triggered = false;
Davidroid 1:1c01b873ad45 388 ButtonHandler();
Davidroid 5:b00bbf1edfa9 389 } else if (xfault_irq_triggered)
Davidroid 1:1c01b873ad45 390 {
Davidroid 1:1c01b873ad45 391 xfault_irq_triggered = false;
Davidroid 1:1c01b873ad45 392 XFaultHandler();
Davidroid 5:b00bbf1edfa9 393 } else {
Davidroid 1:1c01b873ad45 394 /* It is recommended that SEVONPEND in the System Control Register is NOT set. */
Davidroid 1:1c01b873ad45 395 __WFE();
Davidroid 1:1c01b873ad45 396 }
Davidroid 1:1c01b873ad45 397 }
Davidroid 1:1c01b873ad45 398 }