AVS/GD32F103C8T6/App/User/Peripheral/QGEL50X/qgel50x.c
2023-10-18 17:36:51 +08:00

328 lines
7.9 KiB
C

#include "qgel50x.h"
#ifdef USE_QGEL50X
/* 0: 未播放; 1: 正在播放 */
static uint8_t qgel50x_status = 0; /* 播放状态(模块) */
static uint8_t qgel50x_play_status = 0; /* 播放状态(用户) */
static uint8_t qgel50x_send_count = 0;
static uint8_t qgel50x_status_stop_try_count = 0;
static uint8_t qgel50x_status_playing_try_count = 0;
static uint8_t qgel50x_door_opening_warning_task_uuid = 0;
static uint8_t qgel50x_left_turn_warning_task_uuid = 0;
static uint8_t qgel50x_right_turn_warning_task_uuid = 0;
static uint8_t qgel50x_reverse_warning_task_uuid = 0;
static uint8_t qgel50x_arrival_warning_task_uuid = 0;
static uint8_t qgel50x_departure_warning_task_uuid = 0;
static uint8_t qgel50x_please_note_that_task_uuid = 0;
static void qgel50x_door_opening_warning_task(uint8_t uuid);
static void qgel50x_left_turn_warning_task(uint8_t uuid);
static void qgel50x_right_turn_warning_task(uint8_t uuid);
static void qgel50x_reverse_warning_task(uint8_t uuid);
static void qgel50x_arrival_warning_task(uint8_t uuid);
static void qgel50x_departure_warning_task(uint8_t uuid);
static void qgel50x_please_note_that_task(uint8_t uuid);
static void qgel50x_status_parsing_task(uint8_t uuid);
void qgel50x_init(void)
{
/* 创建任务, 并挂起 */
qgel50x_door_opening_warning_task_uuid = task_create(qgel50x_door_opening_warning_task, 200);
task_suspend(qgel50x_door_opening_warning_task_uuid);
qgel50x_left_turn_warning_task_uuid = task_create(qgel50x_left_turn_warning_task, 200);
task_suspend(qgel50x_left_turn_warning_task_uuid);
qgel50x_right_turn_warning_task_uuid = task_create(qgel50x_right_turn_warning_task, 200);
task_suspend(qgel50x_right_turn_warning_task_uuid);
qgel50x_reverse_warning_task_uuid = task_create(qgel50x_reverse_warning_task, 200);
task_suspend(qgel50x_reverse_warning_task_uuid);
qgel50x_arrival_warning_task_uuid = task_create(qgel50x_arrival_warning_task, 200);
task_suspend(qgel50x_arrival_warning_task_uuid);
qgel50x_departure_warning_task_uuid = task_create(qgel50x_departure_warning_task, 200);
task_suspend(qgel50x_departure_warning_task_uuid);
qgel50x_please_note_that_task_uuid = task_create(qgel50x_please_note_that_task, 100);
task_suspend(qgel50x_please_note_that_task_uuid);
task_create(qgel50x_status_parsing_task, 10);
}
void qgel50x_send_pulse(uint8_t count)
{
for (uint8_t i = 0; i < count; i++)
{
gpio_bit_write(QGEL50X_TG1_PERIPH, QGEL50X_TG1_PIN, SET);
delay_us(100);
gpio_bit_write(QGEL50X_TG1_PERIPH, QGEL50X_TG1_PIN, RESET);
delay_us(100);
}
}
/**
* @brief 音量 +
*/
void qgel50x_volume_up(void)
{
qgel50x_send_pulse(3);
}
/**
* @brief 音量 -
*/
void qgel50x_volume_down(void)
{
qgel50x_send_pulse(4);
}
/**
* @brief 停止播放
*/
void qgel50x_stop(void)
{
/* 停止 */
qgel50x_send_pulse(1);
delay_ms(100);
qgel50x_play_status = 0;
/* 挂起任务 */
task_suspend(qgel50x_door_opening_warning_task_uuid);
task_suspend(qgel50x_left_turn_warning_task_uuid);
task_suspend(qgel50x_right_turn_warning_task_uuid);
task_suspend(qgel50x_reverse_warning_task_uuid);
task_suspend(qgel50x_arrival_warning_task_uuid);
task_suspend(qgel50x_departure_warning_task_uuid);
task_suspend(qgel50x_please_note_that_task_uuid);
}
/**
* @brief 开门预警
*/
void qgel50x_door_opening_warning(void)
{
task_resume(qgel50x_door_opening_warning_task_uuid);
}
void qgel50x_left_turn_warning(void)
{
task_resume(qgel50x_left_turn_warning_task_uuid);
}
void qgel50x_right_turn_warning(void)
{
task_resume(qgel50x_right_turn_warning_task_uuid);
}
void qgel50x_reverse_warning(void)
{
task_resume(qgel50x_reverse_warning_task_uuid);
}
void qgel50x_arrival_warning(void)
{
task_resume(qgel50x_arrival_warning_task_uuid);
}
void qgel50x_departure_warning(void)
{
//task_resume(qgel50x_status_parsing_task_uuid);
}
void qgel50x_please_note_that(void)
{
/* 开始任务 */
task_resume(qgel50x_please_note_that_task_uuid);
}
static void qgel50x_door_opening_warning_task(uint8_t uuid)
{
/* 默认以200ms间隔检测 */
task_set_frequency(uuid, 200);
/* 未播放语音 */
if(qgel50x_status == 0)
{
if(qgel50x_play_status == 0)
{
/* 车辆上下客,请勿靠近 */
qgel50x_send_pulse(27);
/* 正在播放, 此时 模块状态 应为 1 */
qgel50x_play_status = 1;
}
else
{
/* 未播放 */
qgel50x_play_status = 0;
task_set_frequency(uuid, 2000);
}
}
}
static void qgel50x_left_turn_warning_task(uint8_t uuid)
{
/* 默认以200ms间隔检测 */
task_set_frequency(uuid, 200);
/* 未播放语音 */
if(qgel50x_status == 0)
{
if(qgel50x_play_status == 0)
{
/* 车辆左转,请注意避让 */
qgel50x_send_pulse(31);
/* 正在播放, 此时 模块状态 应为 1 */
qgel50x_play_status = 1;
}
else
{
/* 未播放 */
qgel50x_play_status = 0;
task_set_frequency(uuid, 2000);
}
}
}
void qgel50x_right_turn_warning_task(uint8_t uuid)
{
/* 默认以200ms间隔检测 */
task_set_frequency(uuid, 200);
/* 未播放语音 */
if(qgel50x_status == 0)
{
if(qgel50x_play_status == 0)
{
/* 车辆右转,请注意避让 */
qgel50x_send_pulse(30);
/* 正在播放, 此时 模块状态 应为 1 */
qgel50x_play_status = 1;
}
else
{
/* 未播放 */
qgel50x_play_status = 0;
task_set_frequency(uuid, 2000);
}
}
}
void qgel50x_reverse_warning_task(uint8_t uuid)
{
/* 默认以200ms间隔检测 */
task_set_frequency(uuid, 200);
/* 未播放语音 */
if(qgel50x_status == 0)
{
if(qgel50x_play_status == 0)
{
/* 倒车,请注意避让 */
qgel50x_send_pulse(28);
/* 正在播放, 此时 模块状态 应为 1 */
qgel50x_play_status = 1;
}
else
{
/* 未播放 */
qgel50x_play_status = 0;
task_set_frequency(uuid, 2000);
}
}
}
static void qgel50x_arrival_warning_task(uint8_t uuid)
{
/* 默认以200ms间隔检测 */
task_set_frequency(uuid, 200);
/* 未播放语音 */
if(qgel50x_status == 0)
{
if(qgel50x_play_status == 0)
{
/* 车辆进站,请注意 */
qgel50x_send_pulse(26);
/* 正在播放, 此时 模块状态 应为 1 */
qgel50x_play_status = 1;
}
else
{
/* 未播放 */
qgel50x_play_status = 0;
task_set_frequency(uuid, 2000);
}
}
}
static void qgel50x_departure_warning_task(uint8_t uuid)
{
}
static void qgel50x_please_note_that_task(uint8_t uuid)
{
qgel50x_send_count++;
switch (qgel50x_send_count)
{
case 1:
qgel50x_send_pulse(15); /* 请 */
task_set_frequency(uuid, 300);
break;
case 2:
qgel50x_send_pulse(16); /* 注意 */
task_set_frequency(uuid, 500);
break;
case 3:
qgel50x_send_count = 0;
task_set_frequency(uuid, 2000);
break;
}
}
static void qgel50x_status_parsing_task(uint8_t uuid)
{
/* 正在播放 */
if(gpio_input_bit_get(QGEL50X_TG4_PERIPH, QGEL50X_TG4_PIN) == SET)
{
qgel50x_status_playing_try_count++;
if(qgel50x_status_playing_try_count > 4)
{
qgel50x_status = SET;
qgel50x_status_playing_try_count = 0;
}
}
else
{
qgel50x_status_stop_try_count++;
if(qgel50x_status_stop_try_count > 4)
{
qgel50x_status = RESET;
qgel50x_status_stop_try_count = 0;
}
}
}
#endif