#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