mg_sonoff/src/ledHandler.c

67 lines
1.8 KiB
C

// Author: Dirk Jahnke
// January 24, 2018
//
// Manage on board LED of SONOFF device
//
#include <stdio.h>
#include <time.h>
#include "mgos.h"
#include "mgos_gpio.h"
#include "mgos_sys_config.h"
#include "mgos_timers.h"
#include "ledHandler.h"
static int ON_BOARD_LED = 13; /* sonoff basic LED pin */
static enum LEDStatus currentStatus = LED_OFF;
static int numTicksLedHasThisState = 0;
void set_led_status(enum LEDStatus newStatus) {
numTicksLedHasThisState = 0;
currentStatus = newStatus;
LOG(LL_INFO, ("set_led_status to %d", newStatus));
}
static void blink_on_board_led_cb(void *arg) {
switch (currentStatus) {
case LED_OFF:
mgos_gpio_write(ON_BOARD_LED, 1); // off
break;
case LED_ON:
mgos_gpio_write(ON_BOARD_LED, 0); // on
break;
case LED_BLINK_SLOW:
++numTicksLedHasThisState;
if (numTicksLedHasThisState >= 4) {
numTicksLedHasThisState = 0;
mgos_gpio_toggle(ON_BOARD_LED);
}
break;
case LED_BLINK_FAST:
// toggle LED each tick
mgos_gpio_toggle(ON_BOARD_LED);
break;
case LED_ONCE:
++numTicksLedHasThisState;
if (numTicksLedHasThisState == 1) {
mgos_gpio_write(ON_BOARD_LED, 0); // on
} else
if (numTicksLedHasThisState > 8) {
set_led_status(LED_OFF);
}
break;
default:
LOG(LL_ERROR, ("Invalid current LED status: %d -- ignored", currentStatus));
break;
}
(void) arg;
}
void init_led_handler() {
mgos_gpio_set_mode(ON_BOARD_LED, MGOS_GPIO_MODE_OUTPUT);
mgos_set_timer(250, MGOS_TIMER_REPEAT, blink_on_board_led_cb, NULL);
LOG(LL_INFO, ("LED handler initialized"));
}