#include "task_communication.h" /* typedef -----------------------------------------------------------*/ comData s_comData = { .maxFeed = 60, .maxRunFeed = 0, }; // 定义测试函数 void test_isPointInPolygon(comData *p_comData) { // 定义多边形的经纬度坐标集合 double polygonLat[] = {34.34934, 34.25916, 34.36221, 34.21619}; double polygonLng[] = {108.84569, 108.80257, 109.03829, 109.05611}; // 测试点在多边形内部的情况 double point1Lat = 34.33312; double point1Lng = 108.8531; /* 尝试获取互斥量,等待无限长时间 */ if(osMutexAcquire(s_messageDate_locationHandle, osWaitForever) == osOK) { /* 安全地访问s_rs485RecDate结构体 */ point1Lat = s_messageDate.latitude / 100000; point1Lng = s_messageDate.longitude / 100000; /* 访问完成,释放互斥量 */ osMutexRelease(s_messageDate_locationHandle); } bool result1 = isPointInPolygon(point1Lat, point1Lng, polygonLat, polygonLng); printf("Test case 1: Point (%f, %f) is%s inside the polygon.\n", point1Lat, point1Lng, result1 ? "" : " not"); if(result1){ // 处于围栏内 p_comData->fenceStatus = 0; }else{ // 处于围栏外 p_comData->fenceStatus = 1; } // 从初始态转为中间静止态 if(p_comData->driveStatus == 0){ p_comData->driveStatus = 1; } } // 下发的车时速控制,运行状态的切换 // 初始化时 // 时速为0的情况 :1. MQTT通信超时 2. 围栏未初始化时 // 时速为max的情况:在围栏内行驶 // 运行中超出围栏 以每秒减1km/h的速度下调直至超出围栏 void Speed_Control(comData *p_comData, ec800Date *p_ec800Date, rs485RecDate *p_rs485RecDate){ // 1. 判断时速为0的情况 if((p_ec800Date->fenceRecSuccess == 0) || (p_comData->Malfunction == 0x04)){ // 围栏未初始化时 p_comData->maxRunFeed = 0; }else{ // 2. 时速为max的情况 if(p_comData->fenceStatus == 0){ // 围栏内行驶 p_comData->maxRunFeed = p_comData->maxFeed; }else{ if(p_comData->driveStatus == 1){ // 如果初始态超出围栏 p_comData->maxRunFeed = 0; }else { // 运行态超出围栏 if(p_comData->maxRunFeed > 0){ p_comData->maxRunFeed = p_comData->maxRunFeed - 1; }else{ p_comData->maxRunFeed = 0; } } // 车速判断 判断车的运行状态 if(p_rs485RecDate->vehicleSpeed == 0){ p_comData->driveStatus = 2; }else if(p_rs485RecDate->vehicleSpeed >= 10){ p_comData->driveStatus = 3; } } } } /* USER CODE BEGIN Header_Task_communication */ /** * @brief Function implementing the communication thread. * @param argument: Not used * @retval None */ /* USER CODE END Header_Task_communication */ void task_communication_content(void) { // unsigned long times = 0; LED0_TOGGLE(); // 灯翻转 EC800_FTP_OTA_Upgrade(); // OTA升级 // 固件升级时不做其他操作,保证固件更新的完成 if(s_ec800Date.hardwareUpdate != 0){ HAL_NVIC_DisableIRQ(USART3_IRQn); // 避免被中斷 // HAL_NVIC_DisableIRQ(USART1_IRQn); vTaskSuspend(ec800_dataUploaHandle); // 挂起任务 osDelay(200); }else{ if(s_ec800Date.fenceRecSuccess == 1){ // 围栏数据接收完成 执行围栏判断 test_isPointInPolygon(&s_comData); // 电子围栏 } Speed_Control(&s_comData, &s_ec800Date, &s_rs485RecDate); // 速度控制 rs485_poll_sendReceive(s_comData.maxRunFeed); // 与车进行通信 osDelay(1000); } // times = getRunTimeCounterValue(); // printf("test_isPointInPolygon:%ld\r\n", times); }