| | |
| | | #include <cstdlib> |
| | | #include <cmath> |
| | | #include <semaphore.h> |
| | | #include <pthread.h> |
| | | #include <mutex> |
| | | #include <cstring> |
| | | #include <vector> |
| | | #include <list> |
| | |
| | | static rtk_info *RtkBuffer = NULL; |
| | | static int RtkBufferNum = 0, RtkBufferIn = 0; |
| | | |
| | | static pthread_mutex_t clock_mutex = PTHREAD_MUTEX_INITIALIZER; |
| | | static std::mutex clock_mutex; |
| | | static struct RtkTime rtkClock; |
| | | |
| | | static void SetExamParamDefault(void); |
| | | static void EngineStartHold(union sigval sig); |
| | | static void EngineStartHold(apptimer_var_t val); |
| | | static void ExecuteExam(const struct RtkTime* rtkTime); |
| | | static void ExecuteExam(double speed, int move, double azimuth, const struct RtkTime* rtkTime); |
| | | static uint32_t CalcTimeDiff(const rtk_info *a, const rtk_info *b); |
| | | static void ReadDriverExamPrimerTimeout(union sigval sig); |
| | | static void ReadDriverExamPrimerTimeout(apptimer_var_t val); |
| | | static void UpdateCarBodyCoord(struct RtkTime *rtkTime, double azimuth, double pitch, double roll, PointF main_ant, car_model *carModel); |
| | | static bool UpdateCarCoord(double &spd, int &mov, int &idx); |
| | | |
| | | static void PrintObdInfo(struct RtkTime *rtkTime, double speed); |
| | | |
| | | |
| | | static void ClockGener(apptimer_var_t val); |
| | | |
| | | void DriverTestInit(void) |
| | | { |
| | |
| | | RtkBuffer = (rtk_info *) malloc(RTK_BUFFER_SIZE * sizeof(rtk_info)); |
| | | RtkBufferNum = RtkBufferIn = 0; |
| | | |
| | | pthread_mutex_init(&clock_mutex, NULL); |
| | | // AppTimer_add(ClockGener, 200); // App自己产生定时节拍 |
| | | } |
| | | |
| | | static void SetExamParamDefault(void) |
| | |
| | | examParam.crossing_turn_unknown_tts = DEFAULT_CROSSING_TURN_UNKNOWN_TTS; |
| | | } |
| | | |
| | | static void ReadDriverExamPrimerTimeout(union sigval sig) |
| | | static void ReadDriverExamPrimerTimeout(apptimer_var_t val) |
| | | { |
| | | AppTimer_delete(ReadDriverExamPrimerTimeout); |
| | | AppTimer_add(ReadDriverExamPrimerTimeout, D_SEC(2)); |
| | | ReadDriverExamPrimer(); |
| | | } |
| | | |
| | |
| | | } |
| | | } |
| | | |
| | | static void ClockGener(apptimer_var_t val) |
| | | { |
| | | rtk_info rtk; |
| | | |
| | | rtk.qf = 3; |
| | | rtk.heading = 0; |
| | | rtk.pitch = 0; |
| | | rtk.roll = 0; |
| | | rtk.x = 0; |
| | | rtk.y = 0; |
| | | |
| | | struct timeval tv; |
| | | struct timezone tz; |
| | | |
| | | gettimeofday(&tv, &tz); |
| | | |
| | | struct tm *pTime = localtime(&tv.tv_sec); |
| | | |
| | | rtk.YY = (pTime->tm_year + 1900) % 100; |
| | | rtk.MM = pTime->tm_mon + 1; |
| | | rtk.DD = pTime->tm_mday; |
| | | rtk.hh = pTime->tm_hour; |
| | | rtk.mm = pTime->tm_min; |
| | | rtk.ss = pTime->tm_sec; |
| | | rtk.dss = tv.tv_usec / 1000; |
| | | |
| | | // DEBUG("模拟时间 :%d-%d-%d %d:%d:%d.%d", rtk.YY, 1+pTime->tm_mon, pTime->tm_mday, pTime->tm_hour, pTime->tm_min, pTime->tm_sec, rtk.dss); |
| | | |
| | | UpdateRTKInfo(&rtk); |
| | | |
| | | AppTimer_add(ClockGener, 200); |
| | | } |
| | | |
| | | void UpdateRTKInfo(const rtk_info *s) |
| | | { |
| | | pthread_mutex_lock(&clock_mutex); |
| | | std::unique_lock<std::mutex> lk(clock_mutex); |
| | | rtkClock.YY = s->YY; |
| | | rtkClock.MM = s->MM; |
| | | rtkClock.DD = s->DD; |
| | |
| | | rtkClock.mm = s->mm; |
| | | rtkClock.ss = s->ss; |
| | | rtkClock.mss = s->dss; |
| | | pthread_mutex_unlock(&clock_mutex); |
| | | lk.unlock(); |
| | | |
| | | if (ExamStart) { |
| | | ExecuteExam(&rtkClock); // 执行无需车辆定位的项目 |
| | |
| | | } |
| | | } |
| | | |
| | | static void EngineStartHold(union sigval sig) { |
| | | AppTimer_delete(EngineStartHold); |
| | | static void EngineStartHold(apptimer_var_t val) { |
| | | DEBUG("点火超时"); |
| | | if (ReadCarStatus(ENGINE_START) == ENGINE_START_ACTIVE) { |
| | | struct RtkTime rtkTime; |
| | | |
| | | pthread_mutex_lock(&clock_mutex); |
| | | std::unique_lock<std::mutex> lk(clock_mutex); |
| | | rtkTime = rtkClock; |
| | | pthread_mutex_unlock(&clock_mutex); |
| | | lk.unlock(); |
| | | |
| | | // 不及时松开启动开关,扣10分 |
| | | if (ExamType == TEST_TYPE_AREA) { |
| | |
| | | { |
| | | // 关机 |
| | | if (event == 1) { |
| | | ShutdownInd(timeout); |
| | | |
| | | } |
| | | // 重启 |
| | | if (event == 0) { |
| | |
| | | if (res != 0) { |
| | | struct RtkTime rtkTime; |
| | | |
| | | pthread_mutex_lock(&clock_mutex); |
| | | std::unique_lock<std::mutex> lk(clock_mutex); |
| | | rtkTime = rtkClock; |
| | | pthread_mutex_unlock(&clock_mutex); |
| | | |
| | | lk.unlock(); |
| | | AddExamFault(40101, &rtkTime); |
| | | } |
| | | exam_dummy_light = 2; |