#include "v58.h" /* 0: 未播放; 1: 正在播放 */ static uint8_t v58_status = 0; /* 播放状态(模块) */ static uint8_t v58_play_status = 0; /* 播放状态(用户) */ static uint8_t v58_send_count = 0; static uint8_t v58_status_stop_try_count = 0; static uint8_t v58_status_playing_try_count = 0; static uint8_t v58_door_opening_warning_task_uuid = 0; static uint8_t v58_left_turn_warning_task_uuid = 0; static uint8_t v58_right_turn_warning_task_uuid = 0; static uint8_t v58_reverse_warning_task_uuid = 0; static uint8_t v58_arrival_warning_task_uuid = 0; static uint8_t v58_departure_warning_task_uuid = 0; static uint8_t v58_please_note_that_task_uuid = 0; static void v58_door_opening_warning_task(uint8_t uuid); static void v58_left_turn_warning_task(uint8_t uuid); static void v58_right_turn_warning_task(uint8_t uuid); static void v58_reverse_warning_task(uint8_t uuid); static void v58_arrival_warning_task(uint8_t uuid); static void v58_departure_warning_task(uint8_t uuid); static void v58_please_note_that_task(uint8_t uuid); static void v58_status_parsing_task(uint8_t uuid); void v58_init(void) { /* 创建任务, 并挂起 */ v58_door_opening_warning_task_uuid = task_create(v58_door_opening_warning_task, 200); task_suspend(v58_door_opening_warning_task_uuid); v58_left_turn_warning_task_uuid = task_create(v58_left_turn_warning_task, 200); task_suspend(v58_left_turn_warning_task_uuid); v58_right_turn_warning_task_uuid = task_create(v58_right_turn_warning_task, 200); task_suspend(v58_right_turn_warning_task_uuid); v58_reverse_warning_task_uuid = task_create(v58_reverse_warning_task, 200); task_suspend(v58_reverse_warning_task_uuid); v58_arrival_warning_task_uuid = task_create(v58_arrival_warning_task, 200); task_suspend(v58_arrival_warning_task_uuid); v58_departure_warning_task_uuid = task_create(v58_departure_warning_task, 200); task_suspend(v58_departure_warning_task_uuid); v58_please_note_that_task_uuid = task_create(v58_please_note_that_task, 100); task_suspend(v58_please_note_that_task_uuid); task_create(v58_status_parsing_task, 10); } void v58_send_pulse(uint8_t count) { for (uint8_t i = 0; i < count; i++) { gpio_bit_write(V58_DATA_PERIPH, V58_DATA_PIN, SET); delay_us(100); gpio_bit_write(V58_DATA_PERIPH, V58_DATA_PIN, RESET); delay_us(100); } } /** * @brief 音量 + */ void v58_volume_up(void) { v58_send_pulse(2); } /** * @brief 音量 - */ void v58_volume_down(void) { v58_send_pulse(3); } /** * @brief 停止播放 */ void v58_stop(void) { /* 停止 */ v58_send_pulse(1); delay_ms(100); v58_play_status = 0; /* 挂起任务 */ task_suspend(v58_door_opening_warning_task_uuid); task_suspend(v58_left_turn_warning_task_uuid); task_suspend(v58_right_turn_warning_task_uuid); task_suspend(v58_reverse_warning_task_uuid); task_suspend(v58_arrival_warning_task_uuid); task_suspend(v58_departure_warning_task_uuid); task_suspend(v58_please_note_that_task_uuid); } /** * @brief 开门预警 */ void v58_door_opening_warning(void) { task_resume(v58_door_opening_warning_task_uuid); } void v58_left_turn_warning(void) { task_resume(v58_left_turn_warning_task_uuid); } void v58_right_turn_warning(void) { task_resume(v58_right_turn_warning_task_uuid); } void v58_reverse_warning(void) { task_resume(v58_reverse_warning_task_uuid); } void v58_arrival_warning(void) { task_resume(v58_arrival_warning_task_uuid); } void v58_departure_warning(void) { // task_resume(v58_status_parsing_task_uuid); } void v58_please_note_that(void) { /* 开始任务 */ task_resume(v58_please_note_that_task_uuid); } static void v58_door_opening_warning_task(uint8_t uuid) { /* 默认以200ms间隔检测 */ task_set_frequency(uuid, 200); /* 未播放语音 */ if (v58_status == 0) { if (v58_play_status == 0) { /* 车辆上下客,请勿靠近 */ v58_send_pulse(8); /* 正在播放, 此时 模块状态 应为 1 */ v58_play_status = 1; } else { /* 未播放 */ v58_play_status = 0; task_set_frequency(uuid, 2000); } } } static void v58_left_turn_warning_task(uint8_t uuid) { /* 默认以200ms间隔检测 */ task_set_frequency(uuid, 200); /* 未播放语音 */ if (v58_status == 0) { if (v58_play_status == 0) { /* 车辆左转,请注意避让 */ v58_send_pulse(10); /* 正在播放, 此时 模块状态 应为 1 */ v58_play_status = 1; } else { /* 未播放 */ v58_play_status = 0; task_set_frequency(uuid, 2000); } } } void v58_right_turn_warning_task(uint8_t uuid) { /* 默认以200ms间隔检测 */ task_set_frequency(uuid, 200); /* 未播放语音 */ if (v58_status == 0) { if (v58_play_status == 0) { /* 车辆右转,请注意避让 */ v58_send_pulse(9); /* 正在播放, 此时 模块状态 应为 1 */ v58_play_status = 1; } else { /* 未播放 */ v58_play_status = 0; task_set_frequency(uuid, 2000); } } } void v58_reverse_warning_task(uint8_t uuid) { /* 默认以200ms间隔检测 */ task_set_frequency(uuid, 200); /* 未播放语音 */ if (v58_status == 0) { if (v58_play_status == 0) { /* 倒车,请注意避让 */ v58_send_pulse(13); /* 正在播放, 此时 模块状态 应为 1 */ v58_play_status = 1; } else { /* 未播放 */ v58_play_status = 0; task_set_frequency(uuid, 2000); } } } static void v58_arrival_warning_task(uint8_t uuid) { /* 默认以200ms间隔检测 */ task_set_frequency(uuid, 200); /* 未播放语音 */ if (v58_status == 0) { if (v58_play_status == 0) { /* 车辆进站,请注意 */ v58_send_pulse(7); /* 正在播放, 此时 模块状态 应为 1 */ v58_play_status = 1; } else { /* 未播放 */ v58_play_status = 0; task_set_frequency(uuid, 2000); } } } static void v58_departure_warning_task(uint8_t uuid) { } static void v58_please_note_that_task(uint8_t uuid) { v58_send_count++; switch (v58_send_count) { case 1: v58_send_pulse(19); /* 请 */ task_set_frequency(uuid, 360); break; case 2: v58_send_pulse(39); /* 注意 */ task_set_frequency(uuid, 450); break; case 3: v58_send_count = 0; task_set_frequency(uuid, 2000); break; } } static void v58_status_parsing_task(uint8_t uuid) { /* 正在播放 */ if (gpio_input_bit_get(V58_STATUS_PERIPH, V58_STATUS_PIN) == SET) { v58_status_playing_try_count++; if (v58_status_playing_try_count > 4) { v58_status = SET; v58_status_playing_try_count = 0; } } else { v58_status_stop_try_count++; if (v58_status_stop_try_count > 4) { v58_status = RESET; v58_status_stop_try_count = 0; } } }