2025-10-10 16:07:00 +08:00

216 lines
4.1 KiB
C

#include <common/bk_include.h>
// led show spi data state for tianzhiheng
#if 0//
#include "FreeRTOS.h"
#include "task.h"
#include <os/os.h>
#include <common/bk_kernel_err.h>
#include "bk_fake_clock.h"
#include <os/mem.h>
#include "bk_gpio.h"
#include "app_led.h"
#include "bk_uart.h"
#define LED_DEBUG
#ifdef LED_DEBUG
#define LED_PRT os_printf
#define LED_WARN warning_prf
#define LED_FATAL fatal_prf
#else
#define LED_PRT null_prf
#define LED_WARN null_prf
#define LED_FATAL null_prf
#endif
#define LED_QITEM_COUNT (2)
#if CONFIG_SPIDMA
#define LED_GPIO_INDEX GPIO9
#else
#define LED_GPIO_INDEX GPIO17
#endif
#define LED_INITIAL_VAL 1
#define LED_ON_VAL 0 // LOW LED ON
#define LED_DISCONNECT_VAL 125 // ms
#define LED_MONITOR_VAL 50 // ms
#define LED_SOFTAP_VAL 250 // ms
typedef struct led_st {
beken_timer_t led_timer;
DEV_STATE state;
GPIO_INDEX gpio_idx;
} LED_ST, LED_PTR;
typedef struct led_message {
DEV_STATE led_msg;
} LED_MSG_T;
static LED_ST ledctr;
beken_queue_t led_msg_que = NULL;
xTaskHandle led_thread_handle = NULL;
void app_led_send_msg(DEV_STATE new_msg)
{
bk_err_t ret;
LED_MSG_T msg;
if (led_msg_que) {
msg.led_msg = new_msg;
ret = rtos_push_to_queue(&led_msg_que, &msg, BEKEN_NO_WAIT);
if (kNoErr != ret)
os_printf("app_led_send_msg failed\r\n");
}
}
static void app_led_timer_poll_handler(void)
{
bk_err_t err;
bk_gpio_output_reverse(ledctr.gpio_idx);
err = rtos_reload_timer(&ledctr.led_timer);
BK_ASSERT(kNoErr == err);
}
static void app_led_timer_handler(void *data)
{
app_led_send_msg(TIMER_POLL);
}
static void app_led_poll_handler(DEV_STATE next_sta)
{
uint32_t intval = 0;
bk_err_t err;
//LED_PRT("state:%d, next_sta:%d\r\n", ledctr.state, next_sta);
if (ledctr.state == next_sta)
return;
err = rtos_stop_timer(&ledctr.led_timer);
BK_ASSERT(kNoErr == err);
switch (next_sta) {
case STA_NONE:
break;
case POWER_ON:
case LED_DISCONNECT: {
intval = LED_DISCONNECT_VAL;
ledctr.state = LED_DISCONNECT;
break;
}
case MONITOR_MODE: {
intval = LED_MONITOR_VAL;
ledctr.state = MONITOR_MODE;
break;
}
case SOFTAP_MODE: {
intval = LED_SOFTAP_VAL;
ledctr.state = SOFTAP_MODE;
break;
}
case LED_CONNECT: {
intval = 0;
ledctr.state = LED_CONNECT;
bk_gpio_output(ledctr.gpio_idx, LED_ON_VAL);
break;
}
default:
break;
}
if (intval) {
err = rtos_change_period(&ledctr.led_timer, intval);
BK_ASSERT(kNoErr == err);
}
}
static void app_led_main(beken_thread_arg_t data)
{
bk_err_t err;
os_memset(&ledctr, 0, sizeof(LED_ST));
ledctr.state = STA_NONE;
ledctr.gpio_idx = LED_GPIO_INDEX;
bk_gpio_config_output(ledctr.gpio_idx);
bk_gpio_output(ledctr.gpio_idx, LED_INITIAL_VAL);
err = rtos_init_timer(&ledctr.led_timer,
1 * 1000,
app_led_timer_handler,
(void *)0);
BK_ASSERT(kNoErr == err);
err = rtos_start_timer(&ledctr.led_timer);
BK_ASSERT(kNoErr == err);
while (1) {
LED_MSG_T msg;
err = rtos_pop_from_queue(&led_msg_que, &msg, BEKEN_WAIT_FOREVER);
if (kNoErr == err) {
switch (msg.led_msg) {
case TIMER_POLL:
app_led_timer_poll_handler();
break;
default:
app_led_poll_handler(msg.led_msg);
break;
}
}
}
app_led_exit:
LED_PRT("app_led_main exit\r\n");
rtos_deinit_queue(&led_msg_que);
led_msg_que = NULL;
led_thread_handle = NULL;
rtos_delete_thread(NULL);
}
UINT32 app_led_init(void)
{
int ret;
LED_PRT("app_led_init\r\n");
if ((!led_thread_handle) && (!led_msg_que)) {
ret = rtos_init_queue(&led_msg_que,
"led_queue",
sizeof(LED_MSG_T),
LED_QITEM_COUNT);
if (kNoErr != ret) {
LED_PRT("temp detect ceate queue failed\r\n");
return kGeneralErr;
}
ret = rtos_create_thread(&led_thread_handle,
BEKEN_DEFAULT_WORKER_PRIORITY,
"app led",
(beken_thread_function_t)app_led_main,
1024,
NULL);
if (ret != kNoErr) {
rtos_deinit_queue(&led_msg_que);
led_msg_que = NULL;
LED_PRT("Error: Failed to create app_led_init: %d\r\n", ret);
return kGeneralErr;
}
}
return kNoErr;
}
#endif