From f7a18ec4494b9c5c9ef3fd440bbf68ffc6425e18 Mon Sep 17 00:00:00 2001
From: yy1717 <fctom1215@outlook.com>
Date: 星期四, 08 十二月 2022 15:40:56 +0800
Subject: [PATCH] 智慧驾培首次提交
---
lib/src/main/cpp/common/apptimer.h | 68 +
lib/src/main/cpp/mcu/dfu.h | 40
lib/src/main/cpp/driver_test.cpp | 68 +
lib/src/main/cpp/test_items/stop_and_start.cpp | 42
lib/src/main/cpp/utils/num.h | 2
lib/src/main/cpp/test_items2/prepare.cpp | 12
lib/src/main/cpp/CMakeLists.txt | 10
lib/src/main/cpp/rtk_module/rtk.cpp | 204 ----
lib/src/main/cpp/test_common/Geometry.cpp | 8
lib/src/main/cpp/mcu/ahp.cpp | 180 ++++
lib/src/main/cpp/mcu/mcu_if.h | 46
lib/src/main/cpp/master/comm_if.cpp | 30
lib/src/main/cpp/native-lib.cpp | 125 +
lib/src/main/cpp/mcu/ada.cpp | 160 +++
lib/src/main/cpp/common/serial_port.cpp | 160 +--
lib/src/main/cpp/test_common/Geometry.h | 8
lib/src/main/cpp/mcu/ada.h | 58 +
lib/src/main/cpp/rtk_platform/platform.cpp | 73
lib/src/main/cpp/rtk_module/rtk.h | 33
lib/src/main/cpp/rtk_platform/parse_net.cpp | 61
lib/src/main/cpp/test_items/area_exam.cpp | 2
lib/src/main/cpp/mcu/dfu.cpp | 147 +++
lib/src/main/cpp/test_items2/dummy_light.cpp | 6
lib/src/main/cpp/common/serial_port.h | 30
lib/src/main/cpp/mcu/ahp.h | 39
lib/src/main/cpp/common/apptimer.cpp | 382 +++++---
lib/src/main/cpp/utils/num.cpp | 9
lib/src/main/cpp/common/net.h | 4
lib/src/main/cpp/common/net.cpp | 26
lib/src/main/cpp/test_common/car_sensor.cpp | 29
lib/src/main/cpp/mcu/mcu_if.cpp | 482 +----------
lib/src/main/cpp/rtk_module/virtual_rtk.cpp | 15
32 files changed, 1,412 insertions(+), 1,147 deletions(-)
diff --git a/lib/src/main/cpp/CMakeLists.txt b/lib/src/main/cpp/CMakeLists.txt
index 125e4eb..af96185 100644
--- a/lib/src/main/cpp/CMakeLists.txt
+++ b/lib/src/main/cpp/CMakeLists.txt
@@ -5,6 +5,9 @@
cmake_minimum_required(VERSION 3.4.1)
+set(CMAKE_BUILD_TYPE "Release")
+add_definitions("-O3")
+
# Creates and names a library, sets it as either STATIC
# or SHARED, and provides the relative paths to its source code.
# You can define multiple libraries, and CMake builds them for you.
@@ -21,12 +24,19 @@
common/serial_port.cpp
common/net.cpp
common/apptimer.cpp
+ common/crc32.cpp
+ common/md5.cpp
+ common/string_util.cpp
+ common/xtea.cpp
rtk_platform/parse_net.cpp
rtk_platform/platform.cpp
rtk_module/parse_gps.cpp
test_common/Geometry.cpp
driver_test.cpp
mcu/mcu_if.cpp
+ mcu/ahp.cpp
+ mcu/ada.cpp
+ mcu/dfu.cpp
test_common/car_sensor.cpp
test_common/odo_graph.cpp
diff --git a/lib/src/main/cpp/common/apptimer.cpp b/lib/src/main/cpp/common/apptimer.cpp
index b37cd86..bcfe799 100644
--- a/lib/src/main/cpp/common/apptimer.cpp
+++ b/lib/src/main/cpp/common/apptimer.cpp
@@ -1,188 +1,262 @@
-//POSIX.1b Timer
-#include <jni.h>
-#include <stdbool.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <signal.h>
-#include <string.h>
-#include <sys/time.h>
-#include <pthread.h>
-#include <errno.h>
-#include <time.h>
-#include "../jni_log.h"
+//
+// Created by YY on 2021/3/16.
+//
+
#include "apptimer.h"
+#include "../jni_log.h"
-#define MAX_TIMER 32
+#include <cstdint>
+#include <functional>
+#include <chrono>
+#include <mutex>
+#include <condition_variable>
+#include <list>
+#include <thread>
+#include <map>
+#include <string>
+#include <sstream>
+#include <iomanip>
-static struct {
- timer_t timerId;
+#define DEBUG(fmt, args...) LOGD("<apptimer> <%s>: " fmt, __func__, ##args)
- void (*func)(union sigval sig);
+std::mutex mtx;
- int value;
- uint8_t *user_data;
-} AppTimer[MAX_TIMER];
+std::map<void(*)(apptimer_var_t), CTimer *> TimerList;
-static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
+static void RemoveTimerList(const CTimer *p);
-static int createTimer(timer_t *timerId, void (*func)(union sigval sig),
- int value,
- uint8_t *usr_data, int usr_data_length,
- uint8_t **usr_data_ptr) {
- struct sigevent sev;
- pthread_attr_t attr;
+CTimer::CTimer() {
+ flag = 0;
+ var.var_ptr = nullptr;
+ var.var1 = var.var2 = var.var_length = 0;
+ pthread = nullptr;
+}
- // Register printMsg to SIGALRM
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached
+CTimer::~CTimer() {
+ if (pthread != nullptr) {
+ delete pthread;
+ }
+ if (var.var_ptr != nullptr) {
+ delete var.var_ptr;
+ }
+}
- memset(&sev, 0, sizeof(sev));
+bool CTimer::_updateStatus(CTimer *timer) {
+ if (timer->flag == 0) {
+ return false;
+ } else {
+ return true; //cancel
+ }
+}
- sev.sigev_notify = SIGEV_THREAD;
- sev.sigev_notify_function = func;
- sev.sigev_notify_attributes = &attr;
+void CTimer::_do_task_func(uint32_t msec, CTimer *timer, std::function<void(apptimer_var_t)> callback) {
+ std::unique_lock<std::mutex> lk(timer->cv_mtx);
- if (usr_data != NULL && usr_data_length != 0) {
- if ((sev.sigev_value.sival_ptr = malloc(usr_data_length)) != NULL) {
- *usr_data_ptr = (uint8_t *) sev.sigev_value.sival_ptr;
- memcpy(sev.sigev_value.sival_ptr, usr_data, usr_data_length); //Copy usr data
- sev.sigev_value.sival_int = usr_data_length;
- } else {
- return -1;
+ auto now = std::chrono::steady_clock::now();
+
+ if (timer->cv.wait_until(lk, now + std::chrono::milliseconds(msec), std::bind(_updateStatus, timer)) == false) {
+ RemoveTimerList(timer); // 浠庡垪琛ㄤ腑鍒犻櫎绱㈠紩
+
+ if (timer->flag == 0) {
+ callback(timer->var);
}
} else {
- sev.sigev_value.sival_int = value;
+// LOGD("Cancel %d", static_cast<int>(timer->flag));
+ RemoveTimerList(timer);
}
- /* create timer */
- if (timer_create(CLOCK_REALTIME, &sev, timerId) == -1) {
- return -1;
+ //delete timer;
+ lk.unlock();
+ std::thread(clear, timer).detach();
+}
+
+void CTimer::copy(int value1, int value2, const void *data, int length)
+{
+ this->var.var1 = value1;
+ this->var.var2 = value2;
+ this->var.var_length = length;
+ if (length > 0 && data != nullptr) {
+ this->var.var_ptr = new uint8_t[length];
+ memcpy(this->var.var_ptr, data, length);
+ } else {
+ this->var.var_ptr = nullptr;
}
-// LOGD("timer_create\n");
- return 0;
}
-static int setTimer(timer_t timerId, int timeMSec) {
- struct itimerspec its;
-
- /* Start the timer */
- its.it_value.tv_sec = timeMSec / 1000;
- its.it_value.tv_nsec = (timeMSec % 1000) * 1000000;
-
- its.it_interval.tv_sec = 0;
- its.it_interval.tv_nsec = 0;
-
- if (timer_settime(timerId, 0, &its, NULL) == -1) {
- return -1;
+void CTimer::clear(CTimer *timer)
+{
+ if (timer != nullptr) {
+ delete timer;
}
-// LOGD("timer_settime\n");
- return 0;
}
-void AppTimer_Init(void) {
- memset(AppTimer, 0, sizeof(AppTimer));
- pthread_mutex_init(&mutex, NULL);
+bool CTimer::start(uint32_t msec, std::function<void(apptimer_var_t)> callback) {
+ if (pthread == nullptr) {
+ try {
+ pthread = new std::thread(_do_task_func, msec, this, callback);
+ pthread->detach();
+ } catch (std::exception &ex) {
+ DEBUG("%s", ex.what());
+ return false;
+ }
+// this->callbackThread = std::thread(_do_task_func, msec, this, callback);
+// this->callbackThread.detach();
+ }
+ return true;
}
-void AppTimer_add(void (*func)(union sigval), int timeMS) {
- int i;
-// LOGD("AppTimer_add\n");
- pthread_mutex_lock(&mutex);
- for (i = 0; i < MAX_TIMER; i++) {
- if (AppTimer[i].func == NULL) {
- if (createTimer(&(AppTimer[i].timerId), func, 0, NULL, 0, &(AppTimer[i].user_data)) == 0) {
- AppTimer[i].func = func;
+void CTimer::stop() {
+ std::unique_lock<std::mutex> lk(this->cv_mtx);
+ this->flag = 1;
+ this->cv.notify_one();
+}
- if (setTimer(AppTimer[i].timerId, timeMS) !=
- 0) { //Set timer fail, delele it
- timer_delete(AppTimer[i].timerId);
- if (AppTimer[i].user_data != NULL) {
- free(AppTimer[i].user_data);
- AppTimer[i].user_data = NULL;
- }
- AppTimer[i].func = NULL;
- }
- }
+void AppTimer_init(void)
+{
+ TimerList.clear();
+}
+
+void AppTimer_add(void(*cb)(apptimer_var_t), uint32_t msec)
+{
+ CTimer *cTimer = new CTimer();
+ cTimer->copy(0, 0, nullptr, 0);
+
+ std::lock_guard<std::mutex> lock(mtx);
+ TimerList.insert(std::pair<void (*)(apptimer_var_t), CTimer *>(cb, cTimer));
+
+ if (cTimer->start(msec, cb) == false) {
+ auto it = TimerList.find(cb);
+ if (it != TimerList.end()) {
+ CTimer *ptr = it->second;
+ TimerList.erase(it);
+ }
+ delete cTimer;
+ }
+}
+
+void AppTimer_add(void(*cb)(apptimer_var_t), uint32_t msec, int value1, int value2)
+{
+ CTimer *cTimer = new CTimer();
+ cTimer->copy(value1, value2, nullptr, 0);
+
+ std::lock_guard<std::mutex> lock(mtx);
+ TimerList.insert(std::pair<void (*)(apptimer_var_t), CTimer *>(cb, cTimer));
+
+ if (cTimer->start(msec, cb) == false) {
+ LOGD("寤虹珛澶辫触");
+ auto it = TimerList.find(cb);
+ if (it != TimerList.end()) {
+ CTimer *ptr = it->second;
+ TimerList.erase(it);
+ }
+ delete cTimer;
+ }
+}
+
+void AppTimer_add(void(*cb)(apptimer_var_t), uint32_t msec, void *data, int lenght)
+{
+ CTimer *cTimer = new CTimer();
+ cTimer->copy(0, 0, data, lenght);
+
+ std::lock_guard<std::mutex> lock(mtx);
+ TimerList.insert(std::pair<void (*)(apptimer_var_t), CTimer *>(cb, cTimer));
+
+ if (cTimer->start(msec, cb) == false) {
+ auto it = TimerList.find(cb);
+ if (it != TimerList.end()) {
+ CTimer *ptr = it->second;
+ TimerList.erase(it);
+ }
+ delete cTimer;
+ }
+}
+
+void AppTimer_delete(void(*cb)(apptimer_var_t))
+{
+ std::lock_guard<std::mutex> lock(mtx);
+
+ auto it = TimerList.find(cb);
+ if (it != TimerList.end()) {
+ CTimer *ptr = it->second;
+ TimerList.erase(it);
+ ptr->stop();
+ }
+}
+
+static void RemoveTimerList(const CTimer *p)
+{
+ std::lock_guard<std::mutex> lock(mtx);
+
+ for (auto it = TimerList.begin(); it != TimerList.end(); ++it) {
+ CTimer *ptr = it->second;
+ if (ptr == p) {
+ TimerList.erase(it);
break;
}
}
- pthread_mutex_unlock(&mutex);
-}
-
-void AppTimer_add(void (*func)(union sigval), int timeMS, uint8_t *data, int length) {
- int i;
-// LOGD("AppTimer_add\n");
- pthread_mutex_lock(&mutex);
- for (i = 0; i < MAX_TIMER; i++) {
- if (AppTimer[i].func == NULL) {
- if (createTimer(&(AppTimer[i].timerId), func, 0, data, length, &(AppTimer[i].user_data)) == 0) {
- AppTimer[i].func = func;
-
- if (setTimer(AppTimer[i].timerId, timeMS) !=
- 0) { //Set timer fail, delele it
- timer_delete(AppTimer[i].timerId);
- if (AppTimer[i].user_data != NULL) {
- free(AppTimer[i].user_data);
- AppTimer[i].user_data = NULL;
- }
- AppTimer[i].func = NULL;
- }
- }
- break;
- }
- }
- pthread_mutex_unlock(&mutex);
-}
-
-void AppTimer_add(void (*func)(union sigval), int timeMS, int value) {
- int i;
-// LOGD("AppTimer_add\n");
- pthread_mutex_lock(&mutex);
- for (i = 0; i < MAX_TIMER; i++) {
- if (AppTimer[i].func == NULL) {
- if (createTimer(&(AppTimer[i].timerId), func, value, NULL, 0, &(AppTimer[i].user_data)) == 0) {
- AppTimer[i].func = func;
-
- if (setTimer(AppTimer[i].timerId, timeMS) !=
- 0) { //Set timer fail, delele it
- timer_delete(AppTimer[i].timerId);
- if (AppTimer[i].user_data != NULL) {
- free(AppTimer[i].user_data);
- AppTimer[i].user_data = NULL;
- }
- AppTimer[i].func = NULL;
- }
- }
- break;
- }
- }
- pthread_mutex_unlock(&mutex);
-}
-
-void AppTimer_delete(void (*func)(union sigval)) {
- int i;
-// LOGD("AppTimer_delete\n");
- pthread_mutex_lock(&mutex);
- for (i = 0; i < MAX_TIMER; i++) {
- if (AppTimer[i].func == func) {
- timer_delete(AppTimer[i].timerId);
- if (AppTimer[i].user_data != NULL) {
- free(AppTimer[i].user_data);
- AppTimer[i].user_data = NULL;
- }
- AppTimer[i].func = NULL;
- }
- }
- pthread_mutex_unlock(&mutex);
}
uint32_t AppTimer_GetTickCount(void)
{
- struct timespec ts;
+ std::chrono::milliseconds as = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch());
- clock_gettime(CLOCK_MONOTONIC, &ts);
+ return as.count();
+}
- return (ts.tv_sec * 1000 + ts.tv_nsec / 1000000);
+uint32_t AppTimer_GetGmtTickCount(void)
+{
+ std::chrono::seconds as = std::chrono::duration_cast<std::chrono::seconds>(std::chrono::system_clock::now().time_since_epoch());
+
+ return as.count();
+}
+
+std::string FormatTime(const char *fmt)
+{
+ auto now = std::chrono::system_clock::now();
+ auto timet = std::chrono::system_clock::to_time_t(now);
+ auto localTime = *std::localtime(&timet);
+
+ std::stringstream ss;
+ std::string str;
+ ss << std::put_time(&localTime, "%Y-%m-%d %H:%M:%S");
+ str = ss.str();
+ return str;
+}
+
+std::time_t MktimeString(const char *str, const char *fmt)
+{
+ struct std::tm dt;
+ std::istringstream ss(str);
+
+ ss >> std::get_time(&dt, fmt);
+
+ std::stringstream out;
+ out << std::put_time(&dt, "%Y-%m-%d %H:%M:%S");
+// DEBUG("%s, %ld", out.str().c_str(), std::mktime(&dt));
+
+ time_t utc = std::mktime(&dt);
+
+ return utc;
+}
+
+time_t TimeStamp(int year, int mon, int day, int hour, int min, int sec)
+{
+ // YYHHDDhhmmss(GMT+8)
+ struct tm test_tm;
+
+ struct timeval tv;
+ struct timezone tz;
+
+ gettimeofday(&tv,&tz);
+
+ memset(&test_tm, 0, sizeof(test_tm));
+
+ test_tm.tm_year = year - 1900;
+ test_tm.tm_mon = mon - 1;
+ test_tm.tm_mday = day;
+ test_tm.tm_hour = hour;
+ test_tm.tm_min = min;
+ test_tm.tm_sec = sec;
+
+ return mktime(&test_tm) - tz.tz_minuteswest*60;
}
diff --git a/lib/src/main/cpp/common/apptimer.h b/lib/src/main/cpp/common/apptimer.h
index 89dab30..60e9b4b 100644
--- a/lib/src/main/cpp/common/apptimer.h
+++ b/lib/src/main/cpp/common/apptimer.h
@@ -1,23 +1,69 @@
-#ifndef _APPTIMER_H_
-#define _APPTIMER_H_
+//
+// Created by YY on 2021/3/16.
+//
-#include <stdint.h>
-#include <signal.h>
+#ifndef NDKADV_APPTIMER_H
+#define NDKADV_APPTIMER_H
+
+#include <cstdint>
+#include <functional>
+#include <thread>
+#include <chrono>
+#include <atomic>
+#include <mutex>
+#include <condition_variable>
+#include <string>
+#include <ctime>
#define D_SEC(n) ((n)*1000UL)
#define D_MIN(n) ((n)*1000UL*60UL)
#define D_HOUR(n) ((n)*1000UL*60UL*60UL)
-extern void AppTimer_Init(void);
+typedef struct {
+ int var1;
+ int var2;
+ void * var_ptr;
+ int var_length;
+} apptimer_var_t;
-extern void AppTimer_add(void (*func)(union sigval), int timeMS);
+class CTimer {
+public:
+ CTimer();
+ virtual ~CTimer();
+ static bool _updateStatus(CTimer *timer);
+ static void _do_task_func(uint32_t msec, CTimer *timer, std::function<void(apptimer_var_t)> callback);
+ bool start(uint32_t msec, std::function<void(apptimer_var_t)> callback);
+ void stop();
+ void copy(int value1, int value2, const void *data, int length);
+ static void clear(CTimer *timer);
+private:
+ std::mutex cv_mtx;
+ std::condition_variable cv;
+// std::thread callbackThread;
+ std::thread *pthread;
+ apptimer_var_t var;
+public:
+ std::atomic_int flag;
+};
-extern void AppTimer_add(void (*func)(union sigval), int timeMS, uint8_t *data, int length);
+void AppTimer_init(void);
-extern void AppTimer_add(void (*func)(union sigval), int timeMS, int value);
+void AppTimer_add(void(*cb)(apptimer_var_t), uint32_t msec);
-extern void AppTimer_delete(void (*func)(union sigval));
+void AppTimer_add(void(*cb)(apptimer_var_t), uint32_t msec, int value1, int value2 = 0);
-extern uint32_t AppTimer_GetTickCount(void);
+void AppTimer_add(void(*cb)(apptimer_var_t), uint32_t msec, void *data, int lenght);
-#endif
+void AppTimer_delete(void (*cb) (apptimer_var_t));
+
+uint32_t AppTimer_GetTickCount(void);
+
+uint32_t AppTimer_GetGmtTickCount(void);
+
+std::string FormatTime(const char *fmt);
+
+std::time_t MktimeString(const char *str, const char *fmt);
+
+time_t TimeStamp(int year, int mon, int day, int hour, int min, int sec);
+
+#endif //NDKADV_APPTIMER_H
diff --git a/lib/src/main/cpp/common/net.cpp b/lib/src/main/cpp/common/net.cpp
index 4923c65..2f6fed0 100644
--- a/lib/src/main/cpp/common/net.cpp
+++ b/lib/src/main/cpp/common/net.cpp
@@ -12,7 +12,7 @@
#include <sys/select.h>
#include <arpa/inet.h>
#include <regex>
-#include <pthread.h>
+#include <thread>
#include <semaphore.h>
#include <string>
@@ -70,12 +70,7 @@
m_sIp = ip;
m_nPort = port;
- pthread_t platform_pid;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached
- pthread_create(&platform_pid, &attr, TcpConnectThread, this);
-
+ std::thread(TcpConnectThread, this).detach();
return true;
}
@@ -317,7 +312,7 @@
return( -1 );
}
-void *CTcpPort::TcpConnectThread(void *p)
+void CTcpPort::TcpConnectThread(void *p)
{
CTcpPort *pCTcpPort = (CTcpPort *)p;
@@ -325,7 +320,7 @@
if (pCTcpPort->is_domain_name(pCTcpPort->m_sIp.c_str())) {
if (pCTcpPort->GetHostIP(pCTcpPort->m_sIp.c_str(), net_addr) != 0) {
- goto CONNECT_END;
+ return;
}
} else {
strcpy(net_addr, pCTcpPort->m_sIp.c_str());
@@ -338,22 +333,15 @@
pCTcpPort->event_func(0, pCTcpPort, pCTcpPort->event_func_context);
}
- pthread_t platform_pid;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached
- pthread_create(&platform_pid, &attr, TcpListenThread, p);
+ std::thread(TcpListenThread, p).detach();
} else {
if (pCTcpPort->event_func != NULL) {
pCTcpPort->event_func(-1, pCTcpPort, pCTcpPort->event_func_context);
}
}
-
-CONNECT_END:
- pthread_exit(NULL);
}
-void *CTcpPort::TcpListenThread(void *p)
+void CTcpPort::TcpListenThread(void *p)
{
int fds_ret;
struct timeval tv;
@@ -403,8 +391,6 @@
if (pCTcpPort->event_func) {
pCTcpPort->event_func(-1, pCTcpPort, pCTcpPort->event_func_context);
}
-
- pthread_exit(NULL);
}
void CTcpPort::set_event_callback(void (*callback)(int, void *, void *), void *context)
diff --git a/lib/src/main/cpp/common/net.h b/lib/src/main/cpp/common/net.h
index 9f5685c..6894885 100644
--- a/lib/src/main/cpp/common/net.h
+++ b/lib/src/main/cpp/common/net.h
@@ -45,8 +45,8 @@
void(*receive_data_func)(void *, int, void *, void *); //鏁版嵁鍥炶皟鍑芥暟鎸囬拡
void *receive_data_func_context; //鏁版嵁鍥炶皟鍑芥暟涓婁笅鏂�
- static void *TcpConnectThread(void *p);
- static void *TcpListenThread(void *p);
+ static void TcpConnectThread(void *p);
+ static void TcpListenThread(void *p);
};
//int WriteTCP(int fd, const uint8_t * buf, uint32_t len);
diff --git a/lib/src/main/cpp/common/serial_port.cpp b/lib/src/main/cpp/common/serial_port.cpp
index a41832b..a7c36a0 100644
--- a/lib/src/main/cpp/common/serial_port.cpp
+++ b/lib/src/main/cpp/common/serial_port.cpp
@@ -4,7 +4,7 @@
#include <jni.h>
#include <string>
-
+#include <mutex>
#include <sys/stat.h>
#include <stdbool.h>
#include <stdint.h>
@@ -15,16 +15,22 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
-#include <pthread.h>
#include "../jni_log.h"
#include "serial_port.h"
using namespace std;
-static volatile int serial_port_fd[2] = {0, 0};
-static pthread_mutex_t mutex[2] = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_MUTEX_INITIALIZER};
+SerialPort::SerialPort(struct serial_config cfg)
+{
+ this->cfg = cfg;
+}
-int setRTS(int fd, int level)
+SerialPort::~SerialPort()
+{
+ UninitSerialPort();
+}
+
+int SerialPort::setRTS(int level)
{
int status;
@@ -47,7 +53,7 @@
/*********************************************************************
* PUBLIC FUNCTIONS
*/
-static int SetSerialPort(int fd, int speed, int databits, char parity, int stopbits, int flowctrl) {
+int SerialPort::SetSerialPort(int fd, int speed, int databits, char parity, int stopbits, int flowctrl) {
int status = 0;
struct termios opt;
int speed_arr[] = {B921600, B576000, B500000, B460800, B230400, B115200, B38400, B19200,
@@ -142,7 +148,7 @@
return status;
}
-static int OpenSerialPort(const char *name) {
+int SerialPort::OpenSerialPort(const char *name) {
int uart_fd;
// uart_fd = open(name, O_RDWR /*| O_NONBLOCK/*| O_NOCTTY | O_NDELAY*/);
@@ -151,14 +157,13 @@
return uart_fd;
}
-static void CloseSerialPort(int fd) {
+void SerialPort::CloseSerialPort(int fd) {
close(fd);
}
-int WriteSerialPort(int id, const void *buf, int len) {
+int SerialPort::WriteSerialPort(const void *buf, int len) {
int ret = -1;
int fds_ret;
- int fd = GetSerialPort(id);
struct timeval tv;
fd_set wrfds;
@@ -173,7 +178,7 @@
FD_ZERO(&wrfds); //clean
FD_SET(fd, &wrfds); //set
- pthread_mutex_lock(&mutex[id]);
+ lock_guard<std::mutex> lock(mtx);
fds_ret = select(fd + 1, NULL, &wrfds, NULL, &tv);
@@ -194,113 +199,66 @@
LOGE("Serial Port error 2\n");
}
- pthread_mutex_unlock(&mutex[id]);
-
return ret;
}
-int GetSerialPort(int id) {
- return serial_port_fd[id];
-}
-
-int InitSerialPort(int id, int baud, int dataBits, char parity, int stopBits, int flowctrl)
+int SerialPort::InitSerialPort(void)
{
- char name[32];
+// char name[32];
+//
+// if (id == UART_0) {
+// strcpy(name, "/dev/ttyCH341USB5");
+// } else if (id == UART_1) {
+// strcpy(name, "/dev/ttyCH341USB6");
+// } else {
+// return -1;
+// }
- if (id == UART_0) {
- strcpy(name, "/dev/ttyHSL0");
- } else if (id == UART_1) {
- strcpy(name, "/dev/ttyHSL1");
- } else {
+ fd = OpenSerialPort(cfg.name);
+ if (fd <= 0) {
return -1;
}
- UninitSerialPort(id);
-
- serial_port_fd[id] = OpenSerialPort(name);
- if (serial_port_fd[id] <= 0) {
- return -1;
- }
-
- if (SetSerialPort(serial_port_fd[id], baud, dataBits, parity, stopBits, flowctrl) != 0) {
+ if (SetSerialPort(fd, cfg.baud, cfg.data_bit, cfg.verify_bit, cfg.stop_bit, cfg.flow_ctrl) != 0) {
return -2;
}
- pthread_mutex_init(&mutex[id], NULL);
return 0;
}
-void UninitSerialPort(int id)
+void SerialPort::UninitSerialPort(void)
{
- if (serial_port_fd[id] > 0) {
- CloseSerialPort(serial_port_fd[id]);
- pthread_mutex_destroy(&mutex[id]);
- serial_port_fd[id] = 0;
+ if (fd > 0) {
+ CloseSerialPort(fd);
+ fd = 0;
}
}
-int ReadSerialPort(int id, uint8_t *out, uint16_t length)
+int SerialPort::ReadSerialPort(uint8_t *out, uint16_t length)
{
- if (serial_port_fd[id] <= 0) return 0;
- return read(serial_port_fd[id], out, length);
-}
+ if (fd <= 0) return 0;
-//extern "C"
-//JNIEXPORT jint JNICALL
-//Java_com_example_yy_jnicallback_MyService_InitSerialPort(
-// JNIEnv *env,
-// jobject /* this */,
-// jstring name,
-// jint baud,
-// jint dataBits,
-// jbyte parity,
-// jint stopBits) {
-//
-// const char *s = env->GetStringUTFChars(name, 0);
-// char item_value[128];
-// strcpy(item_value, s);
-// env->ReleaseStringUTFChars(name, s);
-// LOGD("serial port = %s", item_value);
-//
-// if (serial_port_fd > 0) {
-// CloseSerialPort(serial_port_fd);
-// pthread_mutex_destroy(&mutex);
-// serial_port_fd = 0;
-// }
-//
-// serial_port_fd = OpenSerialPort(item_value);
-// if (serial_port_fd <= 0) {
-// return -1;
-// }
-//
-// if (SetSerialPort(serial_port_fd, baud, dataBits, parity, stopBits) != 0) {
-// return -2;
-// }
-// pthread_mutex_init(&mutex, NULL);
-// return 0;
-//}
-//
-//extern "C"
-//JNIEXPORT void JNICALL
-//Java_com_example_yy_jnicallback_MyService_MonitSerialPort(
-// JNIEnv *env,
-// jobject /* this */) {
-// if (serial_port_fd > 0) {
-// uint8_t UartRxBuf[4096];
-//
-///* uint8_t pkt[] = {0x7E, 0x80, 0x02, 0x00, 0x00, 0x26, 0x00, 0x00, 0x01, 0x38, 0x20, 0x20,
-// 0x55, 0x45, 0x04, 0x4E,
-// 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x02, 0x61, 0x63,
-// 0x0C, 0x06, 0xEA, 0x04,
-// 0xFE, 0x00, 0x00, 0x01, 0x63, 0x00, 0xB4, 0x13, 0x03, 0x05, 0x18, 0x18,
-// 0x52, 0x01, 0x04, 0x00,
-// 0x00, 0x00, 0x00, 0x05, 0x02, 0x00, 0x00, 0x4D, 0x7E};
-// WriteSerialPort(serial_port_fd, pkt, sizeof(pkt));*/
-//
-// int length = read(serial_port_fd, UartRxBuf, sizeof(UartRxBuf));
-//
-// if (length > 0) {
-// Parse(DATA_ACCESS_MCU, UartRxBuf, length);
-// }
-// }
-//}
+ struct timeval tv;
+ fd_set wrfds;
+
+ tv.tv_sec = 5;
+ tv.tv_usec = 0;
+
+ FD_ZERO(&wrfds); //clean
+ FD_SET(fd, &wrfds); //set
+
+ int fds_ret = select(fd + 1, &wrfds, NULL, NULL, &tv);
+
+ if (fds_ret < 0) {
+ return -1;
+ }
+ else if(fds_ret == 0) {
+ // timeout
+ return -2;
+ }
+ else if(FD_ISSET(fd, &wrfds)) {
+ return read(fd, out, length);
+ }
+
+ return -3;
+}
diff --git a/lib/src/main/cpp/common/serial_port.h b/lib/src/main/cpp/common/serial_port.h
index e20f27c..762f0a7 100644
--- a/lib/src/main/cpp/common/serial_port.h
+++ b/lib/src/main/cpp/common/serial_port.h
@@ -6,12 +6,10 @@
#define JNICALLBACK_SERIAL_PORT_H
#include <stdint.h>
-
-#define UART_0 0
-#define UART_1 1
+#include <mutex>
struct serial_config {
- char name[32];
+ char name[64];
int baud;
int data_bit;
char verify_bit;
@@ -19,12 +17,24 @@
int flow_ctrl;
};
-int InitSerialPort(int id, int baud, int dataBits, char parity, int stopBits, int flowctrl);
-void UninitSerialPort(int id);
+class SerialPort {
+private:
+ int fd = -1;
+ std::mutex mtx;
+ struct serial_config cfg;
+ int setRTS(int level);
+ int SetSerialPort(int fd, int speed, int databits, char parity, int stopbits, int flowctrl);
+ int OpenSerialPort(const char *name);
+ void CloseSerialPort(int fd);
+ void UninitSerialPort(void);
+public:
+ SerialPort(struct serial_config cfg);
+ virtual ~SerialPort();
+ int InitSerialPort(void);
+ int WriteSerialPort(const void *buf, int len);
+ int ReadSerialPort(uint8_t *out, uint16_t length);
+};
-int GetSerialPort(int id);
-int ReadSerialPort(int id, uint8_t *out, uint16_t length);
-int WriteSerialPort(int id, const void *buf, int len);
-int setRTS(int fd, int level);
+typedef int (SerialPort::*pSerialPortClassFun)(const void *buf, int len);
#endif //JNICALLBACK_SERIAL_PORT_H
diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp
index a25a74a..365bbd8 100644
--- a/lib/src/main/cpp/driver_test.cpp
+++ b/lib/src/main/cpp/driver_test.cpp
@@ -8,7 +8,7 @@
#include <cstdlib>
#include <cmath>
#include <semaphore.h>
-#include <pthread.h>
+#include <mutex>
#include <cstring>
#include <vector>
#include <list>
@@ -158,19 +158,22 @@
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)
{
@@ -195,7 +198,7 @@
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)
@@ -293,10 +296,8 @@
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();
}
@@ -669,9 +670,42 @@
}
}
+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;
@@ -679,7 +713,7 @@
rtkClock.mm = s->mm;
rtkClock.ss = s->ss;
rtkClock.mss = s->dss;
- pthread_mutex_unlock(&clock_mutex);
+ lk.unlock();
if (ExamStart) {
ExecuteExam(&rtkClock); // 鎵ц鏃犻渶杞﹁締瀹氫綅鐨勯」鐩�
@@ -969,15 +1003,14 @@
}
}
-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) {
@@ -1316,7 +1349,7 @@
{
// 鍏虫満
if (event == 1) {
- ShutdownInd(timeout);
+
}
// 閲嶅惎
if (event == 0) {
@@ -1337,10 +1370,9 @@
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;
diff --git a/lib/src/main/cpp/master/comm_if.cpp b/lib/src/main/cpp/master/comm_if.cpp
index 4bed281..18a4d2f 100644
--- a/lib/src/main/cpp/master/comm_if.cpp
+++ b/lib/src/main/cpp/master/comm_if.cpp
@@ -21,6 +21,8 @@
#include <iostream>
#include <vector>
#include <list>
+#include <thread>
+#include <mutex>
#include <semaphore.h>
#include <unistd.h>
@@ -94,10 +96,10 @@
static list<struct msg_2_main_t> MessageBuffer;
static sem_t sem_msg_income;
-static pthread_mutex_t msg_mutex = PTHREAD_MUTEX_INITIALIZER;
+static std::mutex msg_mutex;
static void SendMsgToMainProcIndep(int cmd, const char *value);
-static void *SendMsgToMainProcThread(void *p);
+static void SendMsgToMainProcThread(void);
static void SendMsgToMainProcIndep(int cmd, const char *value)
{
@@ -111,14 +113,14 @@
msg.value.clear();
}
- pthread_mutex_lock(&msg_mutex);
+ lock_guard<mutex> lock(msg_mutex);
+
MessageBuffer.push_front(msg);
- pthread_mutex_unlock(&msg_mutex);
sem_post(&sem_msg_income);
}
-static void *SendMsgToMainProcThread(void *p) {
+static void SendMsgToMainProcThread(void) {
while (true) {
sem_wait(&sem_msg_income);
@@ -126,9 +128,9 @@
struct msg_2_main_t msg;
int success;
- pthread_mutex_lock(&msg_mutex);
+ unique_lock<mutex> lock(msg_mutex);
msg = MessageBuffer.back();
- pthread_mutex_unlock(&msg_mutex);
+ lock.unlock();
if (msg.value.length() > 0)
success = SendMsgToMainProc(msg.cmd, msg.value.c_str());
@@ -136,9 +138,9 @@
success = SendMsgToMainProc(msg.cmd, NULL);
if (success == 0) {
- pthread_mutex_lock(&msg_mutex);
+ lock.lock();
MessageBuffer.pop_back();
- pthread_mutex_unlock(&msg_mutex);
+ lock.unlock();
} else {
// 寤惰繜閲嶅彂
DEBUG("鍙戦�佸け璐�");
@@ -154,13 +156,7 @@
sem_init(&sem_msg_income, 0, 0);
MessageBuffer.clear();
- pthread_mutex_init(&msg_mutex, NULL);
-
- pthread_t pid;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
- pthread_create(&pid, &attr, SendMsgToMainProcThread, NULL);
+ std::thread(SendMsgToMainProcThread).detach();
}
void MA_NdkStart(void)
@@ -2057,7 +2053,7 @@
{
switch (cmd) {
case ID_MS_FILE: {
- UploadDfuFile(value, length);
+ ////////////////////UploadDfuFile(value, length);
break;
}
default:
diff --git a/lib/src/main/cpp/mcu/ada.cpp b/lib/src/main/cpp/mcu/ada.cpp
new file mode 100644
index 0000000..4ab6d02
--- /dev/null
+++ b/lib/src/main/cpp/mcu/ada.cpp
@@ -0,0 +1,160 @@
+//
+// Created by Administrator on 2022/11/15.
+//
+
+#include <thread>
+#include "ada.h"
+#include "../common/string_util.h"
+#include "../common/serial_port.h"
+#include "mcu_if.h"
+#include "dfu.h"
+#include "../jni_log.h"
+#include "../defs.h"
+
+#define DEBUG(fmt, args...) LOGD("<ada> <%s>: " fmt, __func__, ##args)
+
+static Dfu *dfu = nullptr;
+static SerialPort *pCls = nullptr;
+
+static void InquiryAdaInfo(void)
+{
+ SendMcuCommand(pCls, &SerialPort::WriteSerialPort, ID_ADA_INFO_REQ, nullptr, 0);
+}
+
+static void AdaCommandEntry(uint16_t id, const uint8_t *data, int length)
+{
+ DEBUG("McuCommandEntry 0x%02X", id);
+ switch (id) {
+ case ID_ADA_INFO_RESP: {
+ DEBUG("ID_ADA_INFO_RESP");
+ ada_info_t info;
+
+ info.version = StringUtil::BuffertoString(data, 8);
+ info.sn = StringUtil::BcdBuffertoString(data + 8, 8);
+ break;
+ }
+ case ID_ADA_DFU_RESP: {
+ if (dfu != nullptr) {
+ dfu->RemoteAck(data, length);
+ }
+ break;
+ }
+ case ID_ADA_OBD: {
+// DEBUG("ID_ADA_OBD %d %d", length, sizeof(car_sensor_t));
+ if (length == sizeof(car_sensor_t)) {
+ car_sensor_t *ptr = (car_sensor_t *) data;
+ }
+ break;
+ }
+ default:break;
+ }
+}
+
+#define PARSE_BUFF_SIZE 4096
+
+static void UartThread1(void *p) {
+ struct serial_config *cfg = (struct serial_config *) p;
+ SerialPort serialPort(*cfg);
+
+ int res = serialPort.InitSerialPort();
+ DEBUG("Serial %s open %d", cfg->name, res);
+ uint8_t RxBuf[PARSE_BUFF_SIZE];
+ int RxBufLen = 0;
+
+ ParseUart parse(AdaCommandEntry);
+
+ while (res == 0) {
+ int ul = serialPort.ReadSerialPort((uint8_t *)RxBuf + RxBufLen, sizeof(RxBuf) - RxBufLen);
+ if (ul < 0) {
+ continue;
+ } else if (ul == 0){
+ // usb涓插彛鏂紑
+ break;
+ }
+ RxBufLen += ul;
+
+ /*{
+ static char buffd[16384];
+
+ buffd[0] = 0;
+ int i = 0;
+ for (i = 0; i < ul; i++) {
+ if ((i % 32) == 0) {
+ sprintf(buffd + strlen(buffd), "\n");
+ }
+ sprintf(buffd + strlen(buffd), "%02X ", RxBuf[i]);
+ if (strlen(buffd) > 800) {
+ DEBUG("%s <- %s...", "UART", buffd);
+ buffd[0] = 0;
+ }
+ }
+ if (strlen(buffd) > 0)
+ DEBUG("%s <- %s", "UART", buffd);
+ }*/
+
+ if (RxBufLen > 0) {
+ parse.ParseMcu(RxBuf, RxBufLen);
+ RxBufLen = 0;
+ }
+ }
+}
+
+static void AdaRun(void)
+{
+ static struct serial_config serialConfig;
+
+ strcpy(serialConfig.name, "/dev/ttyCH341USB4");
+ serialConfig.baud = 115200;
+ serialConfig.data_bit = 8;
+ serialConfig.verify_bit = 'N';
+ serialConfig.stop_bit = 1;
+ serialConfig.flow_ctrl = 0;
+
+ while (true) {
+ std::thread t(UartThread1, &serialConfig);
+ t.join();
+ std::this_thread::sleep_for(std::chrono::seconds(3));
+ }
+}
+
+void InitAda(void)
+{
+ // TODO
+ std::thread(AdaRun).detach();
+}
+
+static void SendDfuFile(int fileLen, int sentLen, int blockLen, const uint8_t *data) {
+ uint8_t buffer[1024];
+ int x = 0;
+
+ DEBUG("SendDfuFile fileLen %d sentLen %d blockLen %d", fileLen, sentLen, blockLen);
+
+ buffer[x++] = BREAK_UINT32(fileLen, 3);
+ buffer[x++] = BREAK_UINT32(fileLen, 2);
+ buffer[x++] = BREAK_UINT32(fileLen, 1);
+ buffer[x++] = BREAK_UINT32(fileLen, 0);
+
+ buffer[x++] = BREAK_UINT32(sentLen, 3);
+ buffer[x++] = BREAK_UINT32(sentLen, 2);
+ buffer[x++] = BREAK_UINT32(sentLen, 1);
+ buffer[x++] = BREAK_UINT32(sentLen, 0);
+
+ buffer[x++] = HI_UINT16(blockLen);
+ buffer[x++] = LO_UINT16(blockLen);
+
+ memcpy(buffer + x, data, blockLen);
+ x += blockLen;
+
+ SendMcuCommand(pCls, &SerialPort::WriteSerialPort, ID_ADA_DFU_UPLOAD, buffer, x);
+}
+
+void EnterAdaDfu(const uint8_t *file, int length)
+{
+ if (dfu != nullptr) {
+ delete dfu;
+ }
+ dfu = new Dfu(SendDfuFile, file, length);
+ dfu->Run();
+ delete dfu;
+ dfu = nullptr;
+}
diff --git a/lib/src/main/cpp/mcu/ada.h b/lib/src/main/cpp/mcu/ada.h
new file mode 100644
index 0000000..e61809d
--- /dev/null
+++ b/lib/src/main/cpp/mcu/ada.h
@@ -0,0 +1,58 @@
+//
+// Created by Administrator on 2022/11/15.
+//
+
+#ifndef MYAPPLICATION3_ADA_H
+#define MYAPPLICATION3_ADA_H
+
+#include <cstdint>
+#include <string>
+
+#define ID_ADA_INFO_REQ 0x0001
+#define ID_ADA_INFO_RESP 0x8001
+#define ID_ADA_DFU_UPLOAD 0x0002
+#define ID_ADA_DFU_RESP 0x8002
+#define ID_ADA_OBD 0x800A
+
+typedef struct {
+ std::string version;
+ std::string sn;
+}ada_info_t;
+
+#pragma pack(push, 1)
+typedef struct {
+ uint32_t total_odo;
+ uint32_t this_odo;
+ uint32_t this_time;
+ uint16_t voltage;
+ uint16_t speed;
+ uint16_t rpm;
+ int16_t steering_wheel;
+ uint8_t key_status;
+ uint8_t gear;
+ uint8_t accelerator;
+ uint8_t door;
+ uint8_t seat_belt;
+ uint8_t clutch;
+ uint8_t horn;
+ uint8_t wiper;
+ uint8_t hand_break;
+ uint8_t main_break;
+ uint8_t left_sign;
+ uint8_t right_sign;
+ uint8_t clearance_lamp;
+ uint8_t dipped_beam_lamp;
+ uint8_t main_beam_lamp;
+ uint8_t fog_lamp;
+ uint8_t assist_break;
+ uint8_t surround1;
+ uint8_t surround2;
+ uint8_t surround3;
+ uint8_t surround4;
+ uint8_t resever[3];
+}car_sensor_t;
+#pragma pack(pop)
+
+void InitAda(void);
+
+#endif //MYAPPLICATION3_ADA_H
diff --git a/lib/src/main/cpp/mcu/ahp.cpp b/lib/src/main/cpp/mcu/ahp.cpp
new file mode 100644
index 0000000..a14afb6
--- /dev/null
+++ b/lib/src/main/cpp/mcu/ahp.cpp
@@ -0,0 +1,180 @@
+//
+// Created by YY on 2022/11/14.
+//
+
+#include "ahp.h"
+#include "../common/string_util.h"
+#include "../common/serial_port.h"
+#include "mcu_if.h"
+#include "dfu.h"
+#include "../jni_log.h"
+#include "../defs.h"
+#include "../rtk_module/parse_gps.h"
+
+#define DEBUG(fmt, args...) LOGD("<ahp> <%s>: " fmt, __func__, ##args)
+
+static Dfu *dfu = nullptr;
+static uint8_t RxBuf[4096];
+static int RxBufLen = 0;
+
+static SerialPort *pCls = nullptr;
+
+static void AhpCommandEntry(uint16_t id, const uint8_t *data, int length) {
+ switch (id) {
+ case ID_AHP_INFO_RESP: {
+ aph_info_t info;
+
+ info.version = StringUtil::BuffertoString(data, 8);
+ info.sn = StringUtil::BcdBuffertoString(data + 8, 8);
+ break;
+ }
+ case ID_AHP_DFU_RESP: {
+ if (dfu != nullptr) {
+ dfu->RemoteAck(data, length);
+ }
+ break;
+ }
+
+ case ID_GNSS_DATA: {
+// DEBUG("ID_GNSS_DATA %d", length);
+ memcpy(RxBuf + RxBufLen, data, length);
+ RxBufLen += length;
+
+// std::string out = StringUtil::BuffertoString(RxBuf, RxBufLen);
+// DEBUG("%s", out.c_str());
+
+ const uint8_t *ptr = parseGPS(RxBuf, RxBuf + RxBufLen);
+ if (ptr != RxBuf) {
+ memcpy(RxBuf, ptr, RxBufLen - (ptr - RxBuf));
+ RxBufLen -= ptr - RxBuf;
+ } else if (RxBufLen == sizeof(RxBuf)) { //濉弧浜嗭紝涓旀病鏈変竴涓猏r锛岄兘鎶涘純
+ DEBUG("Parse GPS error");
+ RxBufLen = 0;
+ }
+
+ break;
+ }
+ default:break;
+ }
+}
+
+#define PARSE_BUFF_SIZE 4096
+
+static void UartThread(void *p) {
+ struct serial_config *cfg = (struct serial_config *) p;
+
+ pCls = new SerialPort(*cfg);
+
+ int res = pCls->InitSerialPort();
+ DEBUG("Serial %s open %d", cfg->name, res);
+
+ uint8_t RxBuf[PARSE_BUFF_SIZE];
+ int RxBufLen = 0;
+
+ ParseUart parse(AhpCommandEntry);
+
+ while (res == 0) {
+ int ul = pCls->ReadSerialPort((uint8_t *)RxBuf + RxBufLen, sizeof(RxBuf) - RxBufLen);
+ if (ul < 0) {
+ continue;
+ } else if (ul == 0) {
+ // usb涓插彛鏂紑
+ break;
+ }
+ RxBufLen += ul;
+
+ /*{
+ static char buffd[16384];
+
+ buffd[0] = 0;
+ int i = 0;
+ for (i = 0; i < ul; i++) {
+ if ((i % 32) == 0) {
+ sprintf(buffd + strlen(buffd), "\n");
+ }
+ sprintf(buffd + strlen(buffd), "%02X ", RxBuf[i]);
+ if (strlen(buffd) > 800) {
+ DEBUG("%s <- %s...", "UART", buffd);
+ buffd[0] = 0;
+ }
+ }
+ if (strlen(buffd) > 0)
+ DEBUG("%s <- %s", "UART", buffd);
+ }*/
+
+ if (RxBufLen > 0) {
+// DEBUG("RECV LEN %d", RxBufLen);
+ parse.ParseMcu(RxBuf, RxBufLen);
+ RxBufLen = 0;
+ }
+ }
+
+ delete pCls;
+ pCls = nullptr;
+}
+
+static void AhpRun(void)
+{
+ static struct serial_config serialConfig;
+
+ strcpy(serialConfig.name, "/dev/ttyCH341USB3");
+ serialConfig.baud = 115200;
+ serialConfig.data_bit = 8;
+ serialConfig.verify_bit = 'N';
+ serialConfig.stop_bit = 1;
+ serialConfig.flow_ctrl = 0;
+
+ while (true) {
+ std::thread t(UartThread, &serialConfig);
+ t.join();
+ std::this_thread::sleep_for(std::chrono::seconds(3));
+ }
+}
+
+void InitAhp(void)
+{
+ // TODO
+ std::thread(AhpRun).detach();
+}
+
+static void SendDfuFile(int fileLen, int sentLen, int blockLen, const uint8_t *data) {
+ uint8_t buffer[1024];
+ int x = 0;
+
+ DEBUG("SendDfuFile fileLen %d sentLen %d blockLen %d", fileLen, sentLen, blockLen);
+
+ buffer[x++] = BREAK_UINT32(fileLen, 3);
+ buffer[x++] = BREAK_UINT32(fileLen, 2);
+ buffer[x++] = BREAK_UINT32(fileLen, 1);
+ buffer[x++] = BREAK_UINT32(fileLen, 0);
+
+ buffer[x++] = BREAK_UINT32(sentLen, 3);
+ buffer[x++] = BREAK_UINT32(sentLen, 2);
+ buffer[x++] = BREAK_UINT32(sentLen, 1);
+ buffer[x++] = BREAK_UINT32(sentLen, 0);
+
+ buffer[x++] = HI_UINT16(blockLen);
+ buffer[x++] = LO_UINT16(blockLen);
+
+ memcpy(buffer + x, data, blockLen);
+ x += blockLen;
+
+ SendMcuCommand(pCls, &SerialPort::WriteSerialPort, ID_AHP_DFU_UPLOAD, buffer, x);
+}
+
+void EnterAhpDfu(const uint8_t *file, int length)
+{
+ if (dfu != nullptr) {
+ delete dfu;
+ }
+ dfu = new Dfu(SendDfuFile, file, length);
+ dfu->Run();
+ delete dfu;
+ dfu = nullptr;
+}
+
+void WriteRtkCommand(const char *data, int length)
+{
+ DEBUG("鍙戦�丷TK鍛戒护 %s", StringUtil::BuffertoString((uint8_t *)data, length).c_str());
+ SendMcuCommand(pCls, &SerialPort::WriteSerialPort, ID_CTRL_CMD, reinterpret_cast<const uint8_t *>(data), length);
+}
diff --git a/lib/src/main/cpp/mcu/ahp.h b/lib/src/main/cpp/mcu/ahp.h
new file mode 100644
index 0000000..cab342f
--- /dev/null
+++ b/lib/src/main/cpp/mcu/ahp.h
@@ -0,0 +1,39 @@
+//
+// Created by YY on 2022/11/14.
+//
+
+#ifndef MYAPPLICATION3_AHP_H
+#define MYAPPLICATION3_AHP_H
+
+#include <cstdint>
+#include <string>
+
+#define ID_AHP_INFO_REQ 0x0001
+#define ID_AHP_INFO_RESP 0x8001
+#define ID_AHP_DFU_UPLOAD 0x0002
+#define ID_AHP_DFU_RESP 0x8002
+#define ID_RTK_DATA 0x0008
+#define ID_GNSS_DATA 0x8008
+#define ID_CTRL_CMD 0x0009
+
+typedef struct {
+ std::string version;
+ std::string sn;
+} aph_info_t;
+
+struct aph_dfu_data {
+ uint32_t file_size;
+ uint32_t offset;
+ uint16_t length;
+ uint8_t data[0];
+};
+
+struct aph_dfu_resp {
+ uint8_t status;
+ uint8_t data[0];
+};
+
+void InitAhp(void);
+void WriteRtkCommand(const char *data, int length);
+
+#endif //MYAPPLICATION3_AHP_H
diff --git a/lib/src/main/cpp/mcu/dfu.cpp b/lib/src/main/cpp/mcu/dfu.cpp
new file mode 100644
index 0000000..421e705
--- /dev/null
+++ b/lib/src/main/cpp/mcu/dfu.cpp
@@ -0,0 +1,147 @@
+//
+// Created by Administrator on 2022/11/28.
+//
+
+#include <cstring>
+#include "dfu.h"
+#include "../defs.h"
+#include "../jni_log.h"
+
+#define DEBUG(fmt, args...) LOGD("<dfu> <%s>: " fmt, __func__, ##args)
+
+Dfu::Dfu(SendDfuPtr fun, const uint8_t *data, int length) {
+ dfuTryCnt = 0;
+ dfuFileBitmap = new uint8_t [128];
+ memset(dfuFileBitmap, 0, sizeof(dfuFileBitmap));
+
+ if (length > 0) {
+ dfuFile = new uint8_t[length];
+ dfuFileLength = length;
+ memcpy(dfuFile, data, length);
+ }
+ SendDfuFile = fun;
+}
+
+Dfu::~Dfu() {
+ delete []dfuFileBitmap;
+ if (dfuFile != nullptr) {
+ delete []dfuFile;
+ }
+}
+
+int Dfu::GoNextDfu(void)
+{
+ int dfuFileSent = 0, currDfuBlockLength = 0;
+
+ if (dfuFileLength == 0 || dfuFile == NULL || SendDfuFile == nullptr || dfuCancel)
+ return DFU_END;
+
+ int row = 0, col = 0;
+
+ dfuFileSent = dfuFileLength;
+
+ for (row = 0; row < sizeof(dfuFileBitmap); ++row) {
+ for (col = 0; col < 8; ++col) {
+ if ((dfuFileBitmap[row] & BV(col)) == 0) {
+ DEBUG("ROW = %d COL = %d", row, col);
+ dfuFileSent = row * DFU_FILE_BLOCK_SIZE * 8 + col * DFU_FILE_BLOCK_SIZE;
+ goto GET_FILE_START;
+ }
+ }
+ }
+
+ GET_FILE_START:
+ currDfuBlockLength = (dfuFileLength - dfuFileSent > DFU_FILE_BLOCK_SIZE) ? DFU_FILE_BLOCK_SIZE : (dfuFileLength - dfuFileSent);
+
+ if (dfuFileSent >= dfuFileLength || currDfuBlockLength == 0) {
+ return DFU_END;
+ }
+
+ SendDfuFile(dfuFileLength, dfuFileSent, currDfuBlockLength, dfuFile + dfuFileSent);
+
+ if (dfuFileSent > 0 && dfuFileSent + currDfuBlockLength < dfuFileLength) {
+ dfuFileBitmap[row] |= BV(col);
+ }
+
+ if (dfuFileSent == 0 || dfuFileSent + currDfuBlockLength == dfuFileLength) {
+ dfuTryCnt++;
+ if (dfuTryCnt > DFU_MAX_TRY) {
+ return DFU_END;
+ }
+ DEBUG("GoNextDfuLater 3 sec...");
+ return DFU_LONG_WAIT;
+ }
+ return DFU_SHORT_WAIT;
+}
+
+void Dfu::RemoteAck(const uint8_t *data, int length)
+{
+ DEBUG("ID_MC_AHP_DFU_RESP %d len %d", data[0], length);
+
+ if (data[0] == 0) {
+ // 绗竴鍖呬紶杈撴垚鍔�
+ dfuFileBitmap[0] |= 0x01;
+ } else if (data[0] == 10) {
+ // 鍗囩骇瀹屾垚
+ memset(dfuFileBitmap, 0xFF, sizeof(dfuFileBitmap));
+ } else if (data[0] == 11) {
+ // 鏀惧純浼犺緭
+ dfuCancel = true;
+ } else if (data[0] == 12) {
+ // 鍏ㄩ儴閲嶄紶
+ memset(dfuFileBitmap, 0, sizeof(dfuFileBitmap));
+ } else if (data[0] == 13) {
+ // 閮ㄥ垎閲嶄紶锛屾湁鍚庣画瀛楁
+ DEBUG("BITMAP %02X %02X %02X %02X %02X", data[1], data[2], data[3], data[4], data[5]);
+
+ int total = dfuFileLength / DFU_FILE_BLOCK_SIZE + ((dfuFileLength % DFU_FILE_BLOCK_SIZE)?1:0);
+ int a = 0, b = 0;
+ for (int i = 1; i < length; ++i) {
+ for (int j = 0; j < 8; ++j) {
+ if ((data[i] & BV(j))) b++;
+ a++;
+ if (a == total) {
+ i = length;
+ break;
+ }
+ }
+ }
+
+ DEBUG("BITMAP total %d succ %d", total, b);
+
+ //memset(dfuFileBitmap, 0, sizeof(dfuFileBitmap));
+ memcpy(dfuFileBitmap, data + 1, length - 1);
+
+ if (total % 8) {
+ dfuFileBitmap[total/8] &= ~BV((total%8) - 1);
+ } else {
+ dfuFileBitmap[(total+7)/8 - 1] &= ~BV(7);
+ }
+// dfuFileBitmap[total/8] &= ~BV(total%8);
+ }
+
+ std::unique_lock<std::mutex> lk(cv_mtx);
+ expired = true;
+ cv.notify_one();
+}
+
+void Dfu::Run(void)
+{
+ while(true) {
+ std::unique_lock<std::mutex> lk(cv_mtx);
+ expired = false;
+ int status = GoNextDfu();
+
+ if (status == DFU_END) {
+ break;
+ }
+
+ if (cv.wait_for(lk, std::chrono::milliseconds(status == DFU_LONG_WAIT? 3000: 10), [this] { return expired == true; }) ==
+ false) {
+ // timeout
+ } else {
+ // cancel
+ dfuTryCnt = 0;
+ }
+ }
+}
diff --git a/lib/src/main/cpp/mcu/dfu.h b/lib/src/main/cpp/mcu/dfu.h
new file mode 100644
index 0000000..7abb59e
--- /dev/null
+++ b/lib/src/main/cpp/mcu/dfu.h
@@ -0,0 +1,40 @@
+//
+// Created by Administrator on 2022/11/28.
+//
+
+#ifndef MYAPPLICATION3_DFU_H
+#define MYAPPLICATION3_DFU_H
+
+#include <cstdint>
+#include <mutex>
+#include <atomic>
+#include <condition_variable>
+
+#define DFU_SHORT_WAIT 0
+#define DFU_LONG_WAIT 1
+#define DFU_END 2
+
+const int DFU_MAX_TRY = 3;
+const int DFU_FILE_BLOCK_SIZE = 896;
+
+class Dfu {
+public:
+ typedef void (*SendDfuPtr)(int fileLen, int sentLen, int blockLen, const uint8_t *data);
+ Dfu(SendDfuPtr fun, const uint8_t *data, int length);
+ ~Dfu();
+ void RemoteAck(const uint8_t *data, int length);
+ void Run(void);
+ SendDfuPtr SendDfuFile = nullptr;
+private:
+ uint8_t *dfuFile = nullptr;
+ uint8_t *dfuFileBitmap = nullptr;
+ int dfuFileLength = 0;
+ int dfuTryCnt = 0;
+ int GoNextDfu(void);
+ bool dfuCancel = false;
+ std::atomic_bool expired;
+ std::mutex cv_mtx;
+ std::condition_variable cv;
+};
+
+#endif //MYAPPLICATION3_DFU_H
diff --git a/lib/src/main/cpp/mcu/mcu_if.cpp b/lib/src/main/cpp/mcu/mcu_if.cpp
index c658caa..9d9f928 100644
--- a/lib/src/main/cpp/mcu/mcu_if.cpp
+++ b/lib/src/main/cpp/mcu/mcu_if.cpp
@@ -3,9 +3,11 @@
//
#include <cstring>
-#include <pthread.h>
+#include <thread>
+#include <mutex>
#include <cstdlib>
#include "mcu_if.h"
+#include "ahp.h"
#include "../common/apptimer.h"
#include "../utils/crc16.h"
#include "../defs.h"
@@ -15,92 +17,34 @@
#include "../rtk_module/parse_gps.h"
#include "../native-lib.h"
#include "../rtk_module/virtual_rtk.h"
+#include "../common/string_util.h"
#define DEBUG(fmt, args...) LOGD("<mcu_if> <%s>: " fmt, __func__, ##args)
#define MCU_UART UART_1
-enum parse_status_t {
- SYNC_HEAD_ONE,
- SYNC_HEAD_TWO,
- GET_ID_HI,
- GET_ID_LO,
- GET_LENGTH_HI,
- GET_LENGTH_LO,
- GET_PAYLOAD,
- GET_CRC16_HI,
- GET_CRC16_LO
-};
-
-#define ID_CM_APP_BOOT 0x0001
-#define ID_MC_MCU_BOOT 0x8001
-#define ID_CM_DFU_UPLOAD 0x0002
-#define ID_MC_DFU_RSP 0x8002
-#define ID_CM_RW_INFO 0x0003
-#define ID_MC_RW_INFO_RSP 0x8003
-#define ID_CM_MCU_DFU_REQ 0x0004
-#define ID_MC_MCU_DFU_RSP 0x8004
-#define ID_CM_MCU_DFU_DATA 0x0005
-#define ID_CM_MCU_DFU_DATA_CMP 0x0006
-#define ID_MC_CAR_INFO2 0x8006
-#define ID_MC_CAR_INFO 0x8007
+#define ID_CM_AHP_INQ 0x0001
+#define ID_MC_AHP_RESP 0x8001
+#define ID_CM_AHP_DFU_DATA_UPLOAD 0x0002
+#define ID_MC_AHP_DFU_RESP 0x8002
#define ID_MC_RTK_DATA 0x8008
#define ID_CM_RTK_DATA 0x0008
#define ID_CM_READ_RFCARD 0x0009
-#define ID_MC_RFCARD_RSP 0x8009
-#define ID_CM_SHUTDOWN 0x0020
-#define ID_MC_GNSS_DATA 0x800A
-#define ID_CM_SINAN_CMD_DATA 0x000B
-
-static parse_status_t parse_status;
-
-static struct {
- uint16_t id;
- uint16_t length;
- uint16_t rx_len;
- uint8_t buffer[4096 + 4];
- uint16_t crc16;
-}McuPkt;
-
-static uint8_t *dfuFile = NULL;
-static uint8_t dfuFileBitmap[128];
-
-static int dfuFileLength = 0;
-static int dfuTryCnt = 0;
-const int DFU_MAX_TRY = 3;
-const int DFU_FILE_BLOCK_SIZE = 896;
static int (*WriteMcu)(int id, const void *buf, int len);
static int WriteBluetooth(int id, const void *buf, int len);
-static void *UartThread1(void *p);
-static void ParseMcuTimeout(union sigval sig);
-static void McuCommandEntry(uint16_t id, const uint8_t *data, int length);
+static void ReadCardTimeout(apptimer_var_t val);
-static void SendDfuFile(int fileLen, int sentLen, int blockLen, const uint8_t *data);
-static void GoNextDfuLater(union sigval sig);
-static void GoNextDfu(void);
-static void ReadCardTimeout(union sigval sig);
-
-void McuCommModeSel(int mode)
-{
- if (mode == 0) {
- WriteMcu = WriteSerialPort;
- } else {
- WriteMcu = WriteBluetooth;
- }
+ParseUart::ParseUart(funptr fun) {
+ McuPkt.buffer = new uint8_t [4096 + 4];
+ this->fun = fun;
+ parse_status = SYNC_HEAD_ONE;
}
-void ParseMcuInit(void)
-{
- dfuFile = NULL;
- dfuFileLength = 0;
-
- parse_status = SYNC_HEAD_ONE;
- AppTimer_delete(ParseMcuTimeout);
-
-// SendMcuCommand(ID_CM_APP_BOOT, NULL, 0);
+ParseUart::~ParseUart() {
+ delete []McuPkt.buffer;
}
static int WriteBluetooth(int id, const void *buf, int len)
@@ -109,70 +53,26 @@
return len;
}
-
-#define PARSE_BUFF_SIZE 4096
-
-static void *UartThread1(void *p) {
- struct serial_config *cfg = (struct serial_config *) p;
-
- int res = InitSerialPort(MCU_UART, cfg->baud, cfg->data_bit, cfg->verify_bit, cfg->stop_bit, cfg->flow_ctrl);
- DEBUG("Serial %s open %d", cfg->name, res);
- uint8_t RxBuf[PARSE_BUFF_SIZE];
- int RxBufLen = 0;
-
- if (res == 0)
- ParseMcuInit();
-
- while (res == 0) {
- int ul = ReadSerialPort(MCU_UART, (uint8_t *)RxBuf + RxBufLen, sizeof(RxBuf) - RxBufLen);
- RxBufLen += ul;
-
- /*{
- static char buffd[16384];
-
- buffd[0] = 0;
- int i = 0;
- for (i = 0; i < ul; i++) {
- if ((i % 32) == 0) {
- sprintf(buffd + strlen(buffd), "\n");
- }
- sprintf(buffd + strlen(buffd), "%02X ", RxBuf[i]);
- if (strlen(buffd) > 800) {
- DEBUG("%s <- %s...", "UART", buffd);
- buffd[0] = 0;
- }
- }
- if (strlen(buffd) > 0)
- DEBUG("%s <- %s", "UART", buffd);
- }*/
-
- if (RxBufLen > 0) {
-// DEBUG("RECV LEN %d", RxBufLen);
- if (Virtual2IsConnected()) {
-
- } else {
- ParseMcu(RxBuf, RxBufLen);
- }
- RxBufLen = 0;
- }
- }
- if (res == 0) {
- UninitSerialPort(MCU_UART);
- }
- pthread_exit(NULL);
-}
-
-void ParseMcu(const uint8_t *data, int length)
+void ParseUart::ParseMcu(const uint8_t *data, int length)
{
int x = 0;
+ uint32_t now = AppTimer_GetTickCount();
+
+ if (now < sync_time) {
+ sync_time = now;
+ }
+
+ if (now - sync_time >= D_SEC(5)) {
+ parse_status = SYNC_HEAD_ONE;
+ }
+
while (x < length) {
uint8_t c = data[x];
switch (parse_status) {
case SYNC_HEAD_ONE:
if (c == 0x55) {
parse_status = SYNC_HEAD_TWO;
- AppTimer_delete(ParseMcuTimeout);
- AppTimer_add(ParseMcuTimeout, D_SEC(5));
+ sync_time = now;
}
x++;
break;
@@ -209,7 +109,6 @@
if (McuPkt.length >= 1500) {
DEBUG("Pkt Too large!");
parse_status = SYNC_HEAD_ONE;
- AppTimer_delete(ParseMcuTimeout);
}
McuPkt.buffer[0] = HI_UINT16(McuPkt.id);
@@ -241,14 +140,14 @@
uint16_t crc16 = CRCCCITT(McuPkt.buffer, McuPkt.length + 4, 0, 0);
-// DEBUG("mcuif crc16 but 0x%04X exp 0x%04X", McuPkt.crc16, crc16);
+// DEBUG("mcuif 0x%02X: crc16 but 0x%04X exp 0x%04X", McuPkt.id, McuPkt.crc16, crc16);
- if (McuPkt.crc16 == crc16) {
- McuCommandEntry(McuPkt.id, McuPkt.buffer + 4, McuPkt.length);
+ if (McuPkt.crc16 == crc16 && fun != nullptr) {
+ fun(McuPkt.id, McuPkt.buffer + 4, McuPkt.length);
+ //McuCommandEntry(McuPkt.id, McuPkt.buffer + 4, McuPkt.length);
}
parse_status = SYNC_HEAD_ONE;
- AppTimer_delete(ParseMcuTimeout);
x++;
break;
}
@@ -258,8 +157,11 @@
}
}
-void SendMcuCommand(uint16_t id, const uint8_t *data, int length)
+void SendMcuCommand(SerialPort *pClass, pSerialPortClassFun fun, uint16_t id, const uint8_t *data, int length)
{
+ if (pClass == nullptr)
+ return;
+
uint8_t buffer[2048];
int x = 0;
@@ -279,325 +181,34 @@
buffer[x++] = HI_UINT16(crc16);
buffer[x++] = LO_UINT16(crc16);
- WriteMcu(MCU_UART, buffer, x);
-}
-
-void ConfigMCU(bool ayDevice)
-{
- if (ayDevice) {
- McuCommModeSel(0);
-
- // TODO
- static struct serial_config serialConfig;
-
- strcpy(serialConfig.name, "/dev/ttyHSL1");
- serialConfig.baud = 115200;
- serialConfig.data_bit = 8;
- serialConfig.verify_bit = 'N';
- serialConfig.stop_bit = 1;
- serialConfig.flow_ctrl = 0;
-
- pthread_t pid;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached
- pthread_create(&pid, &attr, UartThread1, &serialConfig);
- } else {
- McuCommModeSel(1);
- }
+ (pClass->*fun)(buffer, x);
}
void SendRtkToMcu(const uint8_t *data, int length)
{
- SendMcuCommand(ID_CM_RTK_DATA, data, length);
+ //SendMcuCommand(ID_CM_RTK_DATA, data, length);
}
-static void ParseMcuTimeout(union sigval sig) {
- AppTimer_delete(ParseMcuTimeout);
- parse_status = SYNC_HEAD_ONE;
-}
-
-static void sendrtk(union sigval sig) {
+static void sendrtk(apptimer_var_t val) {
uint8_t data[486];
memset(data, 0x86, sizeof(data));
- SendMcuCommand(ID_CM_RTK_DATA, data, sizeof(data));
+ //SendMcuCommand(ID_CM_RTK_DATA, data, sizeof(data));
- SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
+ //SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
- AppTimer_delete(sendrtk);
AppTimer_add(sendrtk, D_SEC(1));
-}
-
-static uint8_t GnssBuf[PARSE_BUFF_SIZE];
-static int GnssBufLen = 0;
-
-static void McuCommandEntry(uint16_t id, const uint8_t *data, int length)
-{
- static int ii = 0;
-
- switch (id) {
- case ID_MC_MCU_BOOT:
- DEBUG("MCU BOOT");
- if (length == 8) {
- PlatformStatusChanged(CAN_UPDATE_EVT, data, length);
- }
-
- break;
- case ID_MC_DFU_RSP:
- DEBUG("ID_MC_DFU_RSP %d len %d", data[0], length);
-
- if (data[0] == 0) {
- // 绗竴鍖呬紶杈撴垚鍔�
- dfuFileBitmap[0] |= 0x01;
- } else if (data[0] == 10) {
- // 鍗囩骇瀹屾垚
- memset(dfuFileBitmap, 0xFF, sizeof(dfuFileBitmap));
- } else if (data[0] == 11) {
- // 鏀惧純浼犺緭
- UploadDfuFileEnd();
- } else if (data[0] == 12) {
- // 鍏ㄩ儴閲嶄紶
- memset(dfuFileBitmap, 0, sizeof(dfuFileBitmap));
- } else if (data[0] == 13) {
- // 閮ㄥ垎閲嶄紶锛屾湁鍚庣画瀛楁
- DEBUG("BITMAP %02X %02X %02X %02X %02X", data[1], data[2], data[3], data[4], data[5]);
-
- int total = dfuFileLength / DFU_FILE_BLOCK_SIZE + ((dfuFileLength % DFU_FILE_BLOCK_SIZE)?1:0);
- int a = 0, b = 0;
- for (int i = 1; i < length; ++i) {
- for (int j = 0; j < 8; ++j) {
- if ((data[i] & BV(j))) b++;
- a++;
- if (a == total) {
- i = length;
- break;
- }
- }
- }
-
- DEBUG("BITMAP total %d succ %d", total, b);
-
- //memset(dfuFileBitmap, 0, sizeof(dfuFileBitmap));
- memcpy(dfuFileBitmap, data + 1, length - 1);
-
- if (total % 8) {
- dfuFileBitmap[total/8] &= ~BV((total%8) - 1);
- } else {
- dfuFileBitmap[(total+7)/8 - 1] &= ~BV(7);
- }
-// dfuFileBitmap[total/8] &= ~BV(total%8);
- }
-
- dfuTryCnt = 0;
- AppTimer_delete(GoNextDfuLater);
- GoNextDfu();
- break;
- case ID_MC_RW_INFO_RSP:
- break;
- case ID_MC_MCU_DFU_RSP:
- break;
- case ID_MC_CAR_INFO2:
- /* DEBUG("ID_MC_CAR_INFO2 %d", length);
-
- {
- static char buffd[16384];
-
- buffd[0] = 0;
- int i = 0;
- for (i = 0; i < length; i++) {
- if ((i % 32) == 0) {
- sprintf(buffd + strlen(buffd), "\n");
- }
- sprintf(buffd + strlen(buffd), "%02X ", data[i]);
- if (strlen(buffd) > 800) {
- DEBUG("%s <- %s...", "杞﹁締淇″彿" , buffd);
- buffd[0] = 0;
- }
- }
- if (strlen(buffd) > 0)
- DEBUG("%s <- %s", "杞﹁締淇″彿" , buffd);
- }*/
-
- if (length > 0) {
- PlatformStatusChanged(CAR_SENSOR_UPDATE_EVT, data, length);
- }
- break;
- case ID_MC_CAR_INFO: {
-// DEBUG("ID_MC_CAR_INFO %d", length);
-
- if (length > 0)
- PlatformStatusChanged(MCU_UPDATE_EVT, data, length);
- break;
- }
- case ID_MC_RTK_DATA:
- DEBUG("ID_MC_RTK_DATA");
- break;
- case ID_MC_RFCARD_RSP:
- DEBUG("ID_MC_RFCARD_RSP");
- AppTimer_delete(ReadCardTimeout);
-
- if (length > 0)
- PlatformStatusChanged(CARD_UPDATE_EVT, data, length);
- break;
- case ID_MC_GNSS_DATA: {
- length = (length > PARSE_BUFF_SIZE - GnssBufLen) ? (PARSE_BUFF_SIZE - GnssBufLen) : length;
-
- memcpy(GnssBuf + GnssBufLen, data, length);
- GnssBufLen += length;
-
- if (GnssBufLen > 0) {
- if (VirtualIsConnected()) { //PC妯℃嫙鐢ㄦ椂
- static bool first = false;
-
- if (!first) {
- first = true;
-
- uint8_t buff[33] = "emulator";
- buff[32] = 1;
- PlatformStatusChanged(RTK_STATUS_EVT, buff, 33);
- }
-
- GnssBufLen = 0;
- } else {
- const uint8_t *ptr = parseGPS(GnssBuf, GnssBuf + GnssBufLen);
- if (ptr != GnssBuf) {
- memcpy(GnssBuf, ptr, GnssBufLen - (ptr - GnssBuf));
- GnssBufLen -= ptr - GnssBuf;
- } else if (GnssBufLen == PARSE_BUFF_SIZE) { //濉弧浜嗭紝涓旀病鏈変竴涓猏r锛岄兘鎶涘純
- DEBUG("Parse GPS error");
- GnssBufLen = 0;
- }
- }
- }
- break;
- }
- default:
- break;
- }
-}
-
-static void SendDfuFile(int fileLen, int sentLen, int blockLen, const uint8_t *data) {
- uint8_t buffer[1024];
- int x = 0;
-
- DEBUG("SendDfuFile fileLen %d sentLen %d blockLen %d", fileLen, sentLen, blockLen);
-
- buffer[x++] = BREAK_UINT32(fileLen, 3);
- buffer[x++] = BREAK_UINT32(fileLen, 2);
- buffer[x++] = BREAK_UINT32(fileLen, 1);
- buffer[x++] = BREAK_UINT32(fileLen, 0);
-
- buffer[x++] = BREAK_UINT32(sentLen, 3);
- buffer[x++] = BREAK_UINT32(sentLen, 2);
- buffer[x++] = BREAK_UINT32(sentLen, 1);
- buffer[x++] = BREAK_UINT32(sentLen, 0);
-
- buffer[x++] = HI_UINT16(blockLen);
- buffer[x++] = LO_UINT16(blockLen);
-
- memcpy(buffer + x, data, blockLen);
- x += blockLen;
-
- SendMcuCommand(ID_CM_DFU_UPLOAD, buffer, x);
-}
-
-static void GoNextDfuLater(union sigval sig) {
- AppTimer_delete(GoNextDfuLater);
-
- GoNextDfu();
-}
-
-static void GoNextDfu(void)
-{
- int dfuFileSent = 0, currDfuBlockLength = 0;
-
- if (dfuFileLength == 0 || dfuFile == NULL)
- return;
-
- int row = 0, col = 0;
-
- dfuFileSent = dfuFileLength;
-
- for (row = 0; row < sizeof(dfuFileBitmap); ++row) {
- for (col = 0; col < 8; ++col) {
- if ((dfuFileBitmap[row] & BV(col)) == 0) {
- DEBUG("ROW = %d COL = %d", row, col);
- dfuFileSent = row * DFU_FILE_BLOCK_SIZE * 8 + col * DFU_FILE_BLOCK_SIZE;
- goto GET_FILE_START;
- }
- }
- }
-
-GET_FILE_START:
- currDfuBlockLength = (dfuFileLength - dfuFileSent > DFU_FILE_BLOCK_SIZE) ? DFU_FILE_BLOCK_SIZE : (dfuFileLength - dfuFileSent);
-
- if (dfuFileSent >= dfuFileLength || currDfuBlockLength == 0) {
- UploadDfuFileEnd();
- return;
- }
-
- SendDfuFile(dfuFileLength, dfuFileSent, currDfuBlockLength, dfuFile + dfuFileSent);
-
- if (dfuFileSent > 0 && dfuFileSent + currDfuBlockLength < dfuFileLength) {
- dfuFileBitmap[row] |= BV(col);
- }
-
- if (dfuFileSent == 0 || dfuFileSent + currDfuBlockLength == dfuFileLength) {
- dfuTryCnt++;
- if (dfuTryCnt > DFU_MAX_TRY) {
- UploadDfuFileEnd();
- return;
- }
- DEBUG("GoNextDfuLater 3 sec...");
- AppTimer_add(GoNextDfuLater, D_SEC(3));
- } else {
- AppTimer_add(GoNextDfuLater, 10);
- }
-}
-
-void UploadDfuFileEnd(void)
-{
- DEBUG("UploadDfuFileEnd");
-
- if (dfuFile != NULL)
- free(dfuFile);
- dfuFileLength = 0;
-
- AppTimer_delete(GoNextDfuLater);
-}
-
-void UploadDfuFile(const uint8_t *file, int length)
-{
- DEBUG("UploadDfuFile %ld", length);
-
- if (length > 0) {
- if (dfuFile != NULL)
- free(dfuFile);
-
- dfuTryCnt = 0;
-
- dfuFile = (uint8_t *) malloc(length);
- dfuFileLength = length;
- memcpy(dfuFile, file, length);
- memset(dfuFileBitmap, 0, sizeof(dfuFileBitmap));
- AppTimer_delete(GoNextDfuLater);
-
- GoNextDfu();
- }
}
static int readCartCnt = 0;
-static void ReadCardTimeout(union sigval sig) {
- AppTimer_delete(ReadCardTimeout);
-
+static void ReadCardTimeout(apptimer_var_t val) {
readCartCnt++;
if (readCartCnt < 2) {
AppTimer_add(ReadCardTimeout, D_SEC(3));
- SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
+ //SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
} else {
uint8_t data[8] = {0};
PlatformStatusChanged(CARD_UPDATE_EVT, data, sizeof(data));
@@ -610,12 +221,5 @@
AppTimer_delete(ReadCardTimeout);
AppTimer_add(ReadCardTimeout, D_SEC(3));
- SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
-}
-
-void ShutdownInd(int timeout)
-{
- uint8_t v = timeout;
-
- SendMcuCommand(ID_CM_SHUTDOWN, &v, 1);
+ //SendMcuCommand(ID_CM_READ_RFCARD, NULL, 0);
}
diff --git a/lib/src/main/cpp/mcu/mcu_if.h b/lib/src/main/cpp/mcu/mcu_if.h
index 0ab43ab..d12aa0d 100644
--- a/lib/src/main/cpp/mcu/mcu_if.h
+++ b/lib/src/main/cpp/mcu/mcu_if.h
@@ -6,17 +6,47 @@
#define RTKDRIVERTEST_MCU_IF_H
#include <cstdint>
+#include "../common/apptimer.h"
+#include "../common/serial_port.h"
-void McuCommModeSel(int mode);
-void ConfigMCU(bool ayDevice);
+enum parse_status_t {
+ SYNC_HEAD_ONE,
+ SYNC_HEAD_TWO,
+ GET_ID_HI,
+ GET_ID_LO,
+ GET_LENGTH_HI,
+ GET_LENGTH_LO,
+ GET_PAYLOAD,
+ GET_CRC16_HI,
+ GET_CRC16_LO
+};
+
+class ParseUart {
+public:
+ typedef void (*funptr)(uint16_t id, const uint8_t *data, int length);
+ ParseUart(funptr fun);
+ ~ParseUart();
+
+ struct {
+ uint16_t id;
+ uint16_t length;
+ uint16_t rx_len;
+ uint8_t *buffer;
+ uint16_t crc16;
+ } McuPkt;
+
+ parse_status_t parse_status;
+ uint32_t sync_time = 0;
+ funptr fun = nullptr;
+ void ParseMcu(const uint8_t *data, int length);
+};
+
+
+
void SendRtkToMcu(const uint8_t *data, int length);
-void ParseMcuInit(void);
-void ParseMcu(const uint8_t *data, int length);
-void SendMcuCommand(uint16_t id, const uint8_t *data, int length);
+void SendMcuCommand(SerialPort *pClass, pSerialPortClassFun fun, uint16_t id, const uint8_t *data, int length);
-void UploadDfuFileEnd(void);
-void UploadDfuFile(const uint8_t *file, int length);
void ReadCard(void);
-void ShutdownInd(int timeout);
+
#endif //RTKDRIVERTEST_MCU_IF_H
diff --git a/lib/src/main/cpp/native-lib.cpp b/lib/src/main/cpp/native-lib.cpp
index 4d2fcdb..c3e60c6 100644
--- a/lib/src/main/cpp/native-lib.cpp
+++ b/lib/src/main/cpp/native-lib.cpp
@@ -1,6 +1,6 @@
#include <jni.h>
#include <string>
-#include <pthread.h>
+#include <mutex>
#include <unistd.h>
#include <cstdlib>
#include <map>
@@ -18,22 +18,26 @@
#include "master/comm_if.h"
#include "rtk_module/virtual_rtk.h"
#include "defs.h"
+#include "mcu/ada.h"
+#include "mcu/ahp.h"
#define DEBUG(fmt, args...) LOGD("<native-lib> <%s>: " fmt, __func__, ##args)
+#define LIBENC_ARRAY_ELEMS(a) (sizeof(a) / sizeof(a[0]))
+
static JavaVM *sg_jvm = NULL;
static jobject sg_obj = NULL;
+static JNIEnv *jenv;
+
const char *RTK_PLATFORM_IP = "47.93.80.84";
const int RTK_PLATFORM_PORT = 12125;
const uint8_t phone[] = {0x20,0x19,0x10,0x15,0x00,0x00,0x00,0x01};
-const char *VIRTUAL_RTK_IP = "192.168.43.76";
+const char *VIRTUAL_RTK_IP = "192.168.16.212";
const int VIRTUAL_RTK_PORT = 9002;
-static pthread_mutex_t tts_mutex = PTHREAD_MUTEX_INITIALIZER;
-
-static int ttsSeq = 1;
+static std::mutex tts_mutex;
static std::map<int, void (*)(int)> TTSCallBack;
@@ -206,12 +210,10 @@
static int GetTtsSeq(void)
{
- int seq = 0;
+ static int seq = 0;
- pthread_mutex_lock(&tts_mutex);
- seq = ttsSeq++;
- pthread_mutex_unlock(&tts_mutex);
-
+ lock_guard<std::mutex> lock(tts_mutex);
+ seq++;
return seq;
}
@@ -414,35 +416,30 @@
}
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_anyun_exam_lib_RemoteService_startNative(JNIEnv *env, jobject thiz, jboolean ayDevice) {
+static void startNative(JNIEnv *env, jobject thiz, jboolean ayDevice) {
// TODO: implement startNative()
// 淇濆瓨鍏ㄥ眬JVM浠ヤ究鍦ㄥ瓙绾跨▼涓娇鐢�
DEBUG("鍚姩Native");
- env->GetJavaVM(&sg_jvm);
// 涓嶈兘鐩存帴璧嬪��(g_obj = ojb)
sg_obj = env->NewGlobalRef(thiz);
srand(time(NULL));
- AppTimer_Init();
- ConfigMCU(ayDevice);
+ AppTimer_init();
+ ///////////////ConfigMCU(ayDevice);
+ InitAda();
+ InitAhp();
DriverTestInit();
- ConfigRTKModule(ayDevice);
+
MA_Init();
InitPlatform(ayDevice, phone, RTK_PLATFORM_IP, RTK_PLATFORM_PORT);
InitVirtualDevice(VIRTUAL_RTK_IP, VIRTUAL_RTK_PORT);
- pthread_mutex_init(&tts_mutex, NULL);
-
- MA_NdkStart();
+// MA_NdkStart();
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_anyun_exam_lib_RemoteService_MainProcMsgEntry(JNIEnv *env, jobject thiz, jint cmd,
+static void MainProcMsgEntry(JNIEnv *env, jobject thiz, jint cmd,
jstring value) {
// TODO: implement MainProcMsgEntry()
union {
@@ -474,9 +471,7 @@
}
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_anyun_exam_lib_RemoteService_MainProcBinMsgEntry(JNIEnv *env, jobject thiz, jint cmd,
+void MainProcBinMsgEntry(JNIEnv *env, jobject thiz, jint cmd,
jbyteArray data, jint length) {
// TODO: implement MainProcBinMsgEntry()
jbyte *c_dat = env->GetByteArrayElements(data, NULL);
@@ -487,11 +482,8 @@
env->ReleaseByteArrayElements(data, c_dat, NULL);
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_anyun_exam_lib_RemoteService_TextSpeakEnd(JNIEnv *env, jobject thiz, jint id) {
+void TextSpeakEnd(JNIEnv *env, jobject thiz, jint id) {
// TODO: implement TextSpeakEnd()
-
auto it = TTSCallBack.find(id);
if (it != TTSCallBack.end()) {
@@ -506,9 +498,7 @@
}
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_anyun_exam_lib_RemoteService_UpgradeMcu(JNIEnv *env, jobject thiz, jstring vercode,
+void UpgradeMcu(JNIEnv *env, jobject thiz, jstring vercode,
jbyteArray rom) {
// TODO: implement UpgradeMcu()
if (vercode != NULL && rom != NULL) {
@@ -523,9 +513,7 @@
}
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_anyun_exam_lib_RemoteService_BluetoothDataComeIn(JNIEnv *env, jobject thiz,
+void BluetoothDataComeIn(JNIEnv *env, jobject thiz,
jbyteArray data, jint length) {
// TODO: implement BluetoothDataComeIn()
jbyte *c_dat = env->GetByteArrayElements(data, NULL);
@@ -535,9 +523,8 @@
env->ReleaseByteArrayElements(data, c_dat, NULL);
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_anyun_exam_lib_RemoteService_BluetoothStatusChange(JNIEnv *env, jobject thiz,
+
+void BluetoothStatusChange(JNIEnv *env, jobject thiz,
jint status) {
// TODO: implement BluetoothStatusChange()
uint8_t sta = status;
@@ -545,9 +532,7 @@
PlatformStatusChanged(BLUETOOTH_STATUS_EVT, &sta, 1);
}
-extern "C"
-JNIEXPORT void JNICALL
-Java_com_anyun_exam_lib_RemoteService_BluetoothConnected(JNIEnv *env, jobject thiz, jstring name,
+void BluetoothConnected(JNIEnv *env, jobject thiz, jstring name,
jstring addr) {
// TODO: implement BluetoothConnected()
if (name != NULL && addr != NULL) {
@@ -576,3 +561,59 @@
PlatformStatusChanged(BLUETOOTH_STATUS_EVT, &sta, 1);
}
}
+
+static JNINativeMethod methods[] = {
+ {"startNative", "(Z)V", reinterpret_cast<void *>(startNative)},
+ {"MainProcMsgEntry", "(ILjava/lang/String;)V", reinterpret_cast<void *>(MainProcMsgEntry)},
+ {"MainProcBinMsgEntry", "(I[BI)V", reinterpret_cast<void *>(MainProcBinMsgEntry)},
+ {"UpgradeMcu", "(Ljava/lang/String;[B)V", reinterpret_cast<void *>(UpgradeMcu)},
+ {"TextSpeakEnd", "(I)V", reinterpret_cast<void *>(TextSpeakEnd)},
+ {"BluetoothConnected", "(Ljava/lang/String;Ljava/lang/String;)V", reinterpret_cast<void *>(BluetoothConnected)},
+ {"BluetoothStatusChange", "(I)V", reinterpret_cast<void *>(BluetoothStatusChange)},
+ {"BluetoothDataComeIn", "([BI)V", reinterpret_cast<void *>(BluetoothDataComeIn)}
+};
+
+jint JNI_OnLoad(JavaVM *vm, void *reserved)
+{
+ sg_jvm = vm;
+
+ if (sg_jvm->GetEnv(reinterpret_cast<void **> (&jenv), JNI_VERSION_1_6) != JNI_OK) {
+ DEBUG("Env not got");
+ return JNI_ERR;
+ }
+
+ jclass clz = jenv->FindClass("com/anyun/exam/lib/RemoteService");
+ if (clz == NULL) {
+ DEBUG("鐩爣绫绘湭鎵惧埌");
+ return JNI_ERR;
+ }
+
+ if (jenv->RegisterNatives(clz, methods, LIBENC_ARRAY_ELEMS(methods))) {
+ DEBUG("methods not registered");
+ return JNI_ERR;
+ }
+
+ DEBUG("JNI_OnLoad");
+
+ return JNI_VERSION_1_6;
+}
+
+void JNI_OnUnload(JavaVM* vm, void* reserved)
+{
+ JNIEnv* env;
+
+ if (vm->GetEnv(reinterpret_cast<void **> (&env), JNI_VERSION_1_6) != JNI_OK) {
+ DEBUG("Env not got");
+ return;
+ }
+
+ jclass clz = env->FindClass("com/anyun/exam/lib/RemoteService");
+ if (clz == NULL) {
+ DEBUG("鐩爣绫绘湭鎵惧埌");
+ return;
+ }
+
+ env->UnregisterNatives(clz);
+
+ DEBUG("JNI_OnUnload");
+}
diff --git a/lib/src/main/cpp/rtk_module/rtk.cpp b/lib/src/main/cpp/rtk_module/rtk.cpp
index 67a2d35..88adfa5 100644
--- a/lib/src/main/cpp/rtk_module/rtk.cpp
+++ b/lib/src/main/cpp/rtk_module/rtk.cpp
@@ -4,10 +4,10 @@
#include <cstring>
#include <cstdio>
-#include <pthread.h>
#include <cmath>
#include <cstdlib>
#include <cctype>
+#include <thread>
#include "rtk.h"
#include "parse_gps.h"
#include "../common/serial_port.h"
@@ -20,10 +20,9 @@
#include "../native-lib.h"
#include "virtual_rtk.h"
#include "../mcu/mcu_if.h"
+#include "../mcu/ahp.h"
#define DEBUG(fmt, args...) LOGD("<rtk> <%s>: " fmt, __func__, ##args)
-
-#define RTK_MODULE_UART UART_0
#define PARSE_BUFF_SIZE 4096
@@ -41,64 +40,17 @@
static gpsStatus_t gpsStatus;
static char rtkModel[32] = {0};
-static int (*WriteRtk)(int id, const void *buf, int len);
-
static rtk_info CurrRTKInfo;
static bool needSetPjk = false;
static int lostCnt;
static void CheckPjkParam(void);
-static void CheckPjkParamTimeout(union sigval sig);
+static void CheckPjkParamTimeout(apptimer_var_t val);
static int WriteBluetooth(int id, const void *buf, int len);
static void GetModuleVersion(void);
-static void VersionTimeout(union sigval sig);
-static void GpsDataTimeout(union sigval sig);
-
-static void *UartThread(void *p);
-
-void RtkCommModeSel(int mode)
-{
- if (mode == 0) {
- WriteRtk = WriteSerialPort;
- } else {
- WriteRtk = WriteBluetooth;
- }
-}
-
-void ConfigRTKModule(bool ayDevice)
-{
- // TODO
- DEBUG("ConfigRTKModule");
-
- memset(&CurrRTKInfo, 0, sizeof(CurrRTKInfo));
- CurrRTKInfo.hh = -1;
-
- memset(&gpsStatus, 0, sizeof(gpsStatus));
- gpsStatus.hh = -1;
-
- if (ayDevice) {
- RtkCommModeSel(0);
-
- static struct serial_config serialConfig;
-
- strcpy(serialConfig.name, "/dev/ttyHSL0");
- serialConfig.baud = 115200;
- serialConfig.data_bit = 8;
- serialConfig.verify_bit = 'N';
- serialConfig.stop_bit = 1;
- serialConfig.flow_ctrl = 0;
-
- pthread_t pid;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached
- pthread_create(&pid, &attr, UartThread, &serialConfig);
- } else {
- RtkCommModeSel(1);
- // 绛夊緟钃濈墮杩炴帴
- }
-}
+static void VersionTimeout(apptimer_var_t val);
+static void GpsDataTimeout(apptimer_var_t val);
// 钃濈墮杩炴帴鍚�
void ConfigRTKModuleLater(void)
@@ -111,12 +63,12 @@
void FactorySettings(void)
{
- WriteRtk(RTK_MODULE_UART, FACTORY, strlen(FACTORY));
+ WriteRtkCommand(FACTORY, strlen(FACTORY));
}
void RebootModule(void)
{
- WriteRtk(RTK_MODULE_UART, REBOOT, strlen(REBOOT));
+ WriteRtkCommand(REBOOT, strlen(REBOOT));
}
void handleRTKRebootComp(const struct nmea *s)
@@ -147,8 +99,8 @@
void SetAYFactoryParam(int freq)
{
- WriteRtk(RTK_MODULE_UART, UNLOGALL, strlen(UNLOGALL));
- WriteRtk(RTK_MODULE_UART, IFCOM2, strlen(IFCOM2));
+ WriteRtkCommand(UNLOGALL, strlen(UNLOGALL));
+ WriteRtkCommand(IFCOM2, strlen(IFCOM2));
if (freq == 0)
freq = 5;
@@ -156,13 +108,13 @@
for (int i = 0; i < sizeof(PJKITEMS)/ sizeof(PJKITEMS[0]); ++i) {
char cmd[64];
sprintf(cmd, "log com1 %s ontime %0.1f\r\n", PJKITEMS[i], 1.0/(double)freq);
- WriteRtk(RTK_MODULE_UART, cmd, strlen(cmd));
+ WriteRtkCommand(cmd, strlen(cmd));
}
for (int i = 0; i < sizeof(GPSITEMS)/ sizeof(GPSITEMS[0]); ++i) {
char cmd[64];
sprintf(cmd, "log com1 %s ontime %0.1f\r\n", GPSITEMS[i], 1.0/(double)freq);
- WriteRtk(RTK_MODULE_UART, cmd, strlen(cmd));
+ WriteRtkCommand(cmd, strlen(cmd));
}
// WriteSerialPort(RTK_MODULE_UART, AY_PJKPARAM, strlen(AY_PJKPARAM));
@@ -175,7 +127,7 @@
sprintf(buff, "set pjkpara 6378137 298.257223563 0 %d 0 500000\r\n", centLon);
- WriteRtk(RTK_MODULE_UART, buff, strlen(buff));
+ WriteRtkCommand(buff, strlen(buff));
DEBUG("%s", buff);
}
@@ -185,79 +137,10 @@
data = gpsStatus;
}
-static void *UartThread(void *p) {
- struct serial_config *cfg = (struct serial_config *) p;
-
- int res = InitSerialPort(RTK_MODULE_UART, cfg->baud, cfg->data_bit, cfg->verify_bit, cfg->stop_bit, cfg->flow_ctrl);
- DEBUG("Serial %s open %d", cfg->name, res);
- uint8_t RxBuf[PARSE_BUFF_SIZE];
- int RxBufLen = 0;
-
- if (res == 0) {
-// CheckPjkParam();
- GetModuleVersion();
- }
-
- while (res == 0) {
- int ul = ReadSerialPort(RTK_MODULE_UART, (uint8_t *)RxBuf + RxBufLen, sizeof(RxBuf) - RxBufLen);
- RxBufLen += ul;
-
- /*{
- static char buffd[16384];
-
- buffd[0] = 0;
- int i = 0;
- for (i = 0; i < ul; i++) {
- if ((i % 32) == 0) {
- sprintf(buffd + strlen(buffd), "\n");
- }
- sprintf(buffd + strlen(buffd), "%02X ", RxBuf[i]);
- if (strlen(buffd) > 800) {
- DEBUG("%s <- %s...", "UART", buffd);
- buffd[0] = 0;
- }
- }
- if (strlen(buffd) > 0)
- DEBUG("%s <- %s", "UART", buffd);
- }*/
-
- if (RxBufLen > 0) {
-#if 1
- if (VirtualIsConnected()) { //PC妯℃嫙鐢ㄦ椂
- static bool first = false;
- if (!first) {
- first = true;
-
- uint8_t buff[33] = "emulator";
- buff[32] = 1;
- PlatformStatusChanged(RTK_STATUS_EVT, buff, 33);
- }
- RxBufLen = 0;
- } else {
- const uint8_t *ptr = parseGPS(RxBuf, RxBuf + RxBufLen);
- if (ptr != RxBuf) {
- memcpy(RxBuf, ptr, RxBufLen - (ptr - RxBuf));
- RxBufLen -= ptr - RxBuf;
- } else if (RxBufLen == PARSE_BUFF_SIZE) { //濉弧浜嗭紝涓旀病鏈変竴涓猏r锛岄兘鎶涘純
- DEBUG("Parse GPS error");
- RxBufLen = 0;
- }
- }
-#else
- RxBufLen = 0; //PC妯℃嫙鐢ㄦ椂
-#endif
- }
- }
- if (res == 0) {
- UninitSerialPort(RTK_MODULE_UART);
- }
- pthread_exit(NULL);
-}
-
void handleUnrecognisedNMEA(const uint8_t *data, uint16_t length) {
char buff[4096] = {0};
memcpy(buff, data, MIN(length, 4000));
-// DEBUG("handleUnrecognisedNMEA: %s", buff);
+ DEBUG("handleUnrecognisedNMEA: %s", buff);
if (length >= 100) {
string cs(buff);
@@ -280,12 +163,20 @@
}
}
+static bool bbs = false;
+
void handleGPGGA(const struct nmea *s)
{
static uint32_t qfCnt = 0;
// DEBUG("handleGPGGA num = %d", s->nmea_num);
if (s->nmea_num >= 10) {
+
+ if (!bbs) {
+ bbs = true;
+ RebootModule();
+ }
+
lostCnt = 0;
AppTimer_delete(GpsDataTimeout);
AppTimer_add(GpsDataTimeout, D_SEC(5));
@@ -325,6 +216,7 @@
// 璁$畻涓ぎ瀛愬崍绾�
int qf = str2int(s->nmea_value[5].data, s->nmea_value[5].length);
+
if (qf > 0) {
qfCnt++;
if (needSetPjk && qfCnt >= 3) {
@@ -430,34 +322,6 @@
str2float(&CurrRTKInfo.y, s->nmea_value[2].data, s->nmea_value[2].length);
str2float(&CurrRTKInfo.x, s->nmea_value[4].data, s->nmea_value[4].length);
- static double sbx = -12;
- static double sby = 27;
-
-// CurrRTKInfo.x = (-2.8984 - 4.913)/2;
-// CurrRTKInfo.y = (31.6962 + 29.4974)/2;
-
- sbx += 0.01;
- sby += 0.01;
-
-// const double by1 = 28.013;
-// const double bx1 = -11.9669;
-//
-// const double by2 = 29.3232;
-// const double bx2 = -9.5057;
-//
-// static double xx = -10.9669, yy = 28.013;
-//
-// CurrRTKInfo.y = yy;
-// CurrRTKInfo.x = xx;
-//
-// if (forwardx) {
-// xx += 0.02;
-// yy += 0.02 * (by2 - by1) / (bx2 - bx1);
-// } else {
-// xx -= 0.02;
-// yy -= 0.02 * (by2 - by1) / (bx2 - bx1);
-// }
-
if (CurrRTKInfo.hh == hh && CurrRTKInfo.mm == mm && CurrRTKInfo.ss == ss && CurrRTKInfo.dss == dss) {
PlatformStatusChanged(RTK_UPDATE_EVT, (uint8_t *)&CurrRTKInfo, sizeof(CurrRTKInfo));
// UpdateRTKInfo(&CurrRTKInfo);
@@ -484,13 +348,6 @@
str2float(&CurrRTKInfo.pitch, s->nmea_value[2].data, s->nmea_value[2].length);
str2float(&CurrRTKInfo.roll, s->nmea_value[3].data, s->nmea_value[3].length);
-// CurrRTKInfo.heading = 60;
-
- static double deg = 0;
-// CurrRTKInfo.heading = deg;
- deg += 2.0;
- if (deg >= 360) deg = 0;
-
if (CurrRTKInfo.hh == hh && CurrRTKInfo.mm == mm && CurrRTKInfo.ss == ss && CurrRTKInfo.dss == dss) {
PlatformStatusChanged(RTK_UPDATE_EVT, (uint8_t *)&CurrRTKInfo, sizeof(CurrRTKInfo));
// UpdateRTKInfo(&CurrRTKInfo);
@@ -507,15 +364,13 @@
static void CheckPjkParam(void)
{
- WriteRtk(RTK_MODULE_UART, INQ_PJK_PARAM, strlen(INQ_PJK_PARAM));
+ WriteRtkCommand(INQ_PJK_PARAM, strlen(INQ_PJK_PARAM));
DEBUG("鑾峰彇PJK鍙傛暟...");
AppTimer_delete(CheckPjkParamTimeout);
AppTimer_add(CheckPjkParamTimeout, D_SEC(3));
}
-static void CheckPjkParamTimeout(union sigval sig) {
- AppTimer_delete(CheckPjkParamTimeout);
-
+static void CheckPjkParamTimeout(apptimer_var_t val) {
DEBUG("鑾峰彇PJK鍙傛暟瓒呮椂");
uint8_t buff[33];
@@ -529,7 +384,7 @@
static int WriteBluetooth(int id, const void *buf, int len)
{
// SendToBluetooth((uint8_t *)buf, len);
- SendMcuCommand(0x000B, (uint8_t *)buf, len);
+// SendMcuCommand(0x000B, (uint8_t *)buf, len);
return len;
}
@@ -537,14 +392,13 @@
{
AppTimer_delete(VersionTimeout);
AppTimer_add(VersionTimeout, D_SEC(3));
- WriteRtk(RTK_MODULE_UART, CMD_VERSION, strlen(CMD_VERSION));
+ WriteRtkCommand(CMD_VERSION, strlen(CMD_VERSION));
DEBUG("鑾峰彇鐗堟湰...");
}
-static void VersionTimeout(union sigval sig)
+static void VersionTimeout(apptimer_var_t val)
{
- AppTimer_delete(VersionTimeout);
DEBUG("鐗堟湰鑾峰彇瓒呮椂");
GetModuleVersion();
@@ -554,10 +408,8 @@
PlatformStatusChanged(RTK_STATUS_EVT, buff, 33);
}
-static void GpsDataTimeout(union sigval sig)
+static void GpsDataTimeout(apptimer_var_t val)
{
- AppTimer_delete(GpsDataTimeout);
-
if (++lostCnt >= 3) {
DEBUG("RTK妯″潡鏀朵笉鍒癎PS鏁版嵁");
GetModuleVersion();
diff --git a/lib/src/main/cpp/rtk_module/rtk.h b/lib/src/main/cpp/rtk_module/rtk.h
index ae52e8d..7d66f83 100644
--- a/lib/src/main/cpp/rtk_module/rtk.h
+++ b/lib/src/main/cpp/rtk_module/rtk.h
@@ -5,6 +5,10 @@
#ifndef RTKDRIVERTEST_RTK_H
#define RTKDRIVERTEST_RTK_H
+#include <string>
+#include <sstream>
+#include "../utils/num.h"
+
typedef struct {
uint16_t gps_status;
int YY;
@@ -21,6 +25,21 @@
double altitude;
double speed;
double trackTure;
+
+ std::string toString(void) {
+ std::stringstream sst;
+
+ sst<<"GPS:"<<"qf="<<gps_status
+ <<" "<<2000+YY<<intw(MM, 2)<<intw(DD, 2)<<intw(hh,2)<<intw(mm, 2)<<intw(ss, 2)<<"."<<intw(mss, 2)
+ <<" satNum"<<satNum
+ <<" latitude="<<round(latitude, 6)
+ <<" longitude="<<round(longitude, 6)
+ <<" altitude="<<round(altitude, 3)
+ <<" speed="<<round(speed, 3)
+ <<" trackTure="<<round(trackTure, 3);
+
+ return sst.str();
+ }
}gpsStatus_t;
typedef struct {
@@ -37,6 +56,20 @@
double roll;
double x;
double y;
+
+ std::string toString(void) {
+ std::stringstream sst;
+
+ sst<<"RTK:"<<"qf="<<qf
+ <<" "<<2000+YY<<intw(MM, 2)<<intw(DD, 2)<<intw(hh,2)<<intw(mm, 2)<<intw(ss, 2)<<"."<<intw(dss, 2)
+ <<" heading="<<round(heading, 3)
+ <<" pitch="<<round(pitch, 3)
+ <<" roll="<<round(roll, 3)
+ <<" x="<<round(x, 3)
+ <<" y="<<round(y, 3);
+
+ return sst.str();
+ }
}rtk_info;
void RtkCommModeSel(int mode);
diff --git a/lib/src/main/cpp/rtk_module/virtual_rtk.cpp b/lib/src/main/cpp/rtk_module/virtual_rtk.cpp
index c7af63d..f205d6b 100644
--- a/lib/src/main/cpp/rtk_module/virtual_rtk.cpp
+++ b/lib/src/main/cpp/rtk_module/virtual_rtk.cpp
@@ -2,7 +2,6 @@
// Created by YY on 2020/1/20.
//
-#include <pthread.h>
#include <cstdlib>
#include <cstring>
#include "virtual_rtk.h"
@@ -34,8 +33,8 @@
static void TcpEventCallback2(int stat, void *p, void *context);
static void TcpDataCallback2(void *buffer, int length, void *p, void *context);
-static void ConnectLater(union sigval sig);
-static void ConnectLater2(union sigval sig);
+static void ConnectLater(apptimer_var_t val);
+static void ConnectLater2(apptimer_var_t val);
void InitVirtualDevice(const char *domain_name, int port)
{
@@ -85,18 +84,14 @@
return temp;
}
-static void ConnectLater(union sigval sig) {
- AppTimer_delete(ConnectLater);
-
+static void ConnectLater(apptimer_var_t val) {
if (ctp != NULL) {
ctp->OpenTcpPort(VAddr.domain_name, VAddr.port);
}
}
-static void ConnectLater2(union sigval sig)
+static void ConnectLater2(apptimer_var_t val)
{
- AppTimer_delete(ConnectLater2);
-
if (ctp2 != NULL) {
ctp2->OpenTcpPort(VAddr.domain_name, VAddr.port + 1);
}
@@ -179,7 +174,7 @@
RxBufLen += length;
if (RxBufLen > 0) {
- ParseMcu(RxBuf, RxBufLen);
+ /////////////////ParseMcu(RxBuf, RxBufLen);
RxBufLen = 0;
}
}
diff --git a/lib/src/main/cpp/rtk_platform/parse_net.cpp b/lib/src/main/cpp/rtk_platform/parse_net.cpp
index afe75aa..2d0fa15 100644
--- a/lib/src/main/cpp/rtk_platform/parse_net.cpp
+++ b/lib/src/main/cpp/rtk_platform/parse_net.cpp
@@ -6,7 +6,7 @@
#include <cstdio>
#include <cstring>
#include <malloc.h>
-#include <pthread.h>
+#include <mutex>
#include <semaphore.h>
#include "../jni_log.h"
#include "../defs.h"
@@ -125,10 +125,10 @@
}largeMessage[DATA_ACCESS_END];
static uint8_t PhoneNumber[PHONE_NUM_SIZE] = {0};
-static pthread_mutex_t seq_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t tx_queue_mutex = PTHREAD_MUTEX_INITIALIZER;
+static mutex seq_mutex;
+static mutex tx_queue_mutex;
-static void ParseTimeout(union sigval sig);
+static void ParseTimeout(apptimer_var_t val);
static uint32_t GetResendTimeout(uint8_t access, uint8_t curr_resend_cnt, uint32_t base_time);
static uint16_t GetMessageSeq(uint8_t access);
static void PacketEntry(uint8_t access, const uint8_t *data, uint16_t length);
@@ -148,8 +148,8 @@
static void ResendItemTimeout(message_tx_table_t **head, uint32_t tm);
static uint32_t GetResentTimeoutTxQueue(message_tx_table_t **head);
-static void *TxQueueMgrThread(void *p);
-static void TriggerResendTxQueue(union sigval sig);
+static void TxQueueMgrThread(void);
+static void TriggerResendTxQueue(apptimer_var_t val);
/*
7E 80 89 00 40 87 00 00 01 37 20 20 55 68 00 76 00 9A 41 11 00 22 00 77 00 00 00 00 00 00 00 00
@@ -225,11 +225,8 @@
}
}
-static void ParseTimeout(union sigval sig) {
- AppTimer_delete(ParseTimeout);
- packet_parse_status[sig.sival_int] = PKT_SYNC_HEAD;
-
- DEBUG("ParseTimeout %d", sig.sival_int);
+static void ParseTimeout(apptimer_var_t val) {
+ packet_parse_status[val.var1] = PKT_SYNC_HEAD;
}
static uint32_t GetResendTimeout(uint8_t access, uint8_t curr_resend_cnt, uint32_t base_time)
@@ -252,10 +249,10 @@
static uint16_t TxSeq[DATA_ACCESS_END] = {0};
uint16_t seq;
- pthread_mutex_lock(&seq_mutex);
+ lock_guard<std::mutex> lock(seq_mutex);
+
seq = TxSeq[access];
TxSeq[access]++;
- pthread_mutex_unlock(&seq_mutex);
return seq;
}
@@ -534,7 +531,7 @@
DEBUG("AddTxQueue id = 0x%X, seq = %d, len = %d", id, seq, length);
- pthread_mutex_lock(&tx_queue_mutex);
+ lock_guard<mutex> lock(tx_queue_mutex);
// If the item is exist, skip it
if (FindTxQueue(head, id, seq) != NULL) {
@@ -595,7 +592,6 @@
}
ATQ_END:
- pthread_mutex_unlock(&tx_queue_mutex);
uint32_t tim = GetResentTimeoutTxQueue(&message_tx_table_head[DATA_ACCESS_PLATFORM]);
@@ -614,7 +610,7 @@
message_tx_table_t *ptr = *head;
- pthread_mutex_lock(&tx_queue_mutex);
+ lock_guard<mutex> lock(tx_queue_mutex);
while ( ptr != NULL ) {
if (ptr->id == id && ptr->seq == seq) {
// delete
@@ -642,7 +638,6 @@
ptr = ptr->next;
}
}
- pthread_mutex_unlock(&tx_queue_mutex);
}
static void RemoveTxQueue(message_tx_table_t **head, uint16_t id)
@@ -652,7 +647,7 @@
message_tx_table_t *ptr = *head;
- pthread_mutex_lock(&tx_queue_mutex);
+ lock_guard<mutex> lock(tx_queue_mutex);
while ( ptr != NULL ) {
if (ptr->id == id) {
// delete
@@ -681,7 +676,6 @@
ptr = ptr->next;
}
}
- pthread_mutex_unlock(&tx_queue_mutex);
}
static void RemoveAllTxQueue(message_tx_table_t **head)
@@ -690,13 +684,12 @@
return;
}
- pthread_mutex_lock(&tx_queue_mutex);
+ lock_guard<mutex> lock(tx_queue_mutex);
for (message_tx_table_t *ptr = *head, *next; ptr != NULL; ptr = next) {
next = ptr->next;
free(ptr);
}
*head = NULL;
- pthread_mutex_unlock(&tx_queue_mutex);
}
static int SendQueue(message_tx_table_t *item)
@@ -704,11 +697,7 @@
DEBUG("SendQueue id = 0x%04X, seq = %d, length = %d", item->id, item->seq, item->length);
if (item != NULL) {
if (item->access == DATA_ACCESS_MCU) {
- if (WriteSerialPort(GetSerialPort(UART_1), item->data, item->length) != item->length) {
- item->time_out = 100 + AppTimer_GetTickCount();
- LOGE("鍙戝線涓插彛鍑洪敊浜�");
-// return -1;
- }
+
} else if(item->access == DATA_ACCESS_PLATFORM) {
if (WritePlatform(item->data, item->length) != item->length) {
item->time_out = D_SEC(3) + AppTimer_GetTickCount();
@@ -769,8 +758,8 @@
// delete
DEBUG("Delete item %d", ptr->curr_cnt);
message_tx_table_t *temp = ptr;
+ lock_guard<mutex> lock(tx_queue_mutex);
- pthread_mutex_lock(&tx_queue_mutex);
if (ptr == *head) {
if (ptr->next == NULL) {
DEBUG("****************** Delete all 2 ******************");
@@ -787,7 +776,6 @@
ptr->prev->next = ptr->next;
ptr = ptr->next;
}
- pthread_mutex_unlock(&tx_queue_mutex);
free(temp);
} else {
@@ -807,7 +795,7 @@
if (head == NULL)
return resentTime;
- pthread_mutex_lock(&tx_queue_mutex);
+ lock_guard<mutex> lock(tx_queue_mutex);
message_tx_table_t *ptr = *head;
while ( ptr != NULL ) {
@@ -819,14 +807,13 @@
}
ptr = ptr->next;
}
- pthread_mutex_unlock(&tx_queue_mutex);
return resentTime;
}
static sem_t sem_tx_mgr;
-static void *TxQueueMgrThread(void *p) {
+static void TxQueueMgrThread(void) {
while (true) {
sem_wait(&sem_tx_mgr);
uint32_t tim = AppTimer_GetTickCount();
@@ -844,11 +831,9 @@
AppTimer_add(TriggerResendTxQueue, tim);
}
}
- pthread_exit(NULL);
}
-static void TriggerResendTxQueue(union sigval sig) {
- AppTimer_delete(TriggerResendTxQueue);
+static void TriggerResendTxQueue(apptimer_var_t val) {
sem_post(&sem_tx_mgr);
}
@@ -864,15 +849,9 @@
PhoneNumber[6] = 0x00;
PhoneNumber[7] = 0x02;*/
- pthread_mutex_init(&seq_mutex, NULL);
- pthread_mutex_init(&tx_queue_mutex, NULL);
sem_init(&sem_tx_mgr, 0, 0);
- pthread_t pid;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached
- pthread_create(&pid, &attr, TxQueueMgrThread, NULL);
+ std::thread(TxQueueMgrThread).detach();
}
void SetPlatformTxPhoneNum(const char *phone)
diff --git a/lib/src/main/cpp/rtk_platform/platform.cpp b/lib/src/main/cpp/rtk_platform/platform.cpp
index 11139bc..6f49707 100644
--- a/lib/src/main/cpp/rtk_platform/platform.cpp
+++ b/lib/src/main/cpp/rtk_platform/platform.cpp
@@ -5,7 +5,8 @@
#include <cstdint>
#include <cstdlib>
#include <cstring>
-#include <pthread.h>
+#include <thread>
+#include <mutex>
#include <semaphore.h>
#include <cmath>
#include "platform.h"
@@ -88,7 +89,7 @@
static CTcpPort *ctp = NULL;
-static pthread_mutex_t events_mutex = PTHREAD_MUTEX_INITIALIZER;
+static std::mutex events_mutex;
static struct gpsBrief gbf;
static struct rtkBrief rbf;
@@ -101,24 +102,24 @@
static struct event_t * FetchEvent(void);
static void RemoveEvent(void);
-static void ReqRtkPlatformConfigTimeout(union sigval sig);
+static void ReqRtkPlatformConfigTimeout(apptimer_var_t val);
static void TcpEventCallback(int stat, void *p, void *context);
static void TcpDataCallback(void *buffer, int length, void *p, void *context);
static void ConnectPlatform(const char *domain_name, int port);
-static void ConnectPlatformLater(union sigval sig);
+static void ConnectPlatformLater(apptimer_var_t val);
-static void *StatusListenThread(void *p);
+static void StatusListenThread(void);
static void PlatformChangeEntry(uint32_t events, const uint8_t *data, int length);
static void RegisterPlatform(void);
-static void RegisterPlatformTimeout(union sigval sig);
+static void RegisterPlatformTimeout(apptimer_var_t val);
static void LoginPlatform(void);
-static void LoginPlatformTimeout(union sigval sig);
-static void TriggerHeartbeat(union sigval sig);
-static void RequestRtkNoResp(union sigval sig);
+static void LoginPlatformTimeout(apptimer_var_t val);
+static void TriggerHeartbeat(apptimer_var_t val);
+static void RequestRtkNoResp(apptimer_var_t val);
static void AddEvnet(uint32_t event, const uint8_t *data, int length)
@@ -138,7 +139,7 @@
memcpy(nw->event.data, data, length);
}
- pthread_mutex_lock(&events_mutex);
+ lock_guard<std::mutex> lock(events_mutex);
struct event_queue_t *p = eventQueue;
@@ -148,22 +149,18 @@
eventQueue = nw;
else
p->next = nw;
-
- pthread_mutex_unlock(&events_mutex);
}
static struct event_t * FetchEvent(void)
{
struct event_t *evp = NULL;
- pthread_mutex_lock(&events_mutex);
+ lock_guard<std::mutex> lock(events_mutex);
struct event_queue_t *p = eventQueue;
if (p != NULL) {
evp = &p->event;
}
-
- pthread_mutex_unlock(&events_mutex);
return evp;
}
@@ -172,7 +169,7 @@
{
void *p1 = NULL, *p2 = NULL;
- pthread_mutex_lock(&events_mutex);
+ lock_guard<std::mutex> lock(events_mutex);
struct event_queue_t *p = eventQueue;
if (p != NULL) {
@@ -180,7 +177,6 @@
p1 = p;
p2 = p->event.data;
}
- pthread_mutex_unlock(&events_mutex);
if (p2 != NULL)
free(p2);
@@ -198,8 +194,6 @@
memset(&rbf, 0, sizeof(rbf));
memset(&defaultMcuRom, 0, sizeof(defaultMcuRom));
- pthread_mutex_init(&events_mutex, NULL);
-
eventQueue = NULL;
memset(&platformStatus, 0, sizeof(platformStatus));
@@ -209,17 +203,11 @@
PlatformTxInit();
- pthread_t pid;
- pthread_attr_t attr;
- pthread_attr_init(&attr);
- pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);//detached
- pthread_create(&pid, &attr, StatusListenThread, NULL);
+ std::thread(StatusListenThread).detach();
}
-static void ReqRtkPlatformConfigTimeout(union sigval sig)
+static void ReqRtkPlatformConfigTimeout(apptimer_var_t val)
{
- AppTimer_delete(ReqRtkPlatformConfigTimeout);
-
AppTimer_add(ReqRtkPlatformConfigTimeout, D_SEC(2));
MA_ReqRtkPlatformConfig();
}
@@ -327,12 +315,11 @@
}
}
-static void ConnectPlatformLater(union sigval sig) {
- AppTimer_delete(ConnectPlatformLater);
+static void ConnectPlatformLater(apptimer_var_t val) {
ConnectPlatform(exceptSocket.domain_name, exceptSocket.port);
}
-static void *StatusListenThread(void *p) {
+static void StatusListenThread(void) {
while (true) {
sem_wait(&sem_status_changed);
@@ -415,6 +402,8 @@
case GPS_UPDATE_EVT: {
const gpsStatus_t *gps = (gpsStatus_t *) data;
+ DEBUG("GPS: %s", const_cast<gpsStatus_t *>(gps)->toString().c_str());
+
gbf.qf = gps->gps_status;
gbf.latitude = gps->latitude;
gbf.longitude = gps->longitude;
@@ -434,6 +423,7 @@
MA_SendRtkBrief(&rbf);
}
+
// MA_SendGpsBrief(&brief);
RequestRtkDownload(gps, 1);
break;
@@ -443,6 +433,8 @@
uint32_t ost1 = ost;
const rtk_info *rtk = (rtk_info *) data;
+
+ DEBUG("RTK: %s", const_cast<rtk_info *>(rtk)->toString().c_str());
rbf.qf = rtk->qf;
rbf.coord_x = rtk->y;
@@ -517,7 +509,7 @@
if (strlen(defaultMcuRom.verCode) > 0 && ver.size() >= 4 &&
strcmp(defaultMcuRom.verCode, ver[3].c_str()) != 0 &&
defaultMcuRom.rom != NULL) {
- UploadDfuFile(defaultMcuRom.rom, defaultMcuRom.length);
+ /////////////////UploadDfuFile(defaultMcuRom.rom, defaultMcuRom.length);
delete[]defaultMcuRom.rom;
defaultMcuRom.rom = NULL;
}
@@ -678,7 +670,7 @@
if (sta == 3) {
// Connected
btConnected = true;
- ParseMcuInit();
+ ////////////////////ParseMcuInit();
ConfigRTKModuleLater();
PlayTTS("钃濈墮杩炴帴", NULL);
@@ -713,7 +705,7 @@
if (Virtual2IsConnected()) {
} else {
- ParseMcu(data, length);
+ ///////////ParseMcu(data, length);
}
break;
}
@@ -737,10 +729,10 @@
return ret;
}
-static void RegisterPlatformTimeout(union sigval sig)
+static void RegisterPlatformTimeout(apptimer_var_t val)
{
DEBUG("RTK骞冲彴娉ㄥ唽瓒呮椂");
- AppTimer_delete(RegisterPlatformTimeout);
+
RegisterPlatform();
}
@@ -753,19 +745,17 @@
strlen((char *)deviceInfo.device_model), deviceInfo.device_sn, deviceInfo.imei);
}
-static void TriggerHeartbeat(union sigval sig) {
- AppTimer_delete(TriggerHeartbeat);
-
+static void TriggerHeartbeat(apptimer_var_t val) {
if (platformStatus.login && platformStatus.connected) {
SendHeartBeat(DATA_ACCESS_PLATFORM);
AppTimer_add(TriggerHeartbeat, D_SEC(30));
}
}
-static void LoginPlatformTimeout(union sigval sig)
+static void LoginPlatformTimeout(apptimer_var_t val)
{
DEBUG("RTK骞冲彴鐧诲綍瓒呮椂");
- AppTimer_delete(LoginPlatformTimeout);
+
LoginPlatform();
}
@@ -829,9 +819,8 @@
AppTimer_add(RequestRtkNoResp, D_SEC(7)); // 搴旇姣忕鏀跺埌涓�娆�
}
-static void RequestRtkNoResp(union sigval sig)
+static void RequestRtkNoResp(apptimer_var_t val)
{
- AppTimer_delete(RequestRtkNoResp);
requestPlatformSendRtk = true;
rtcmLength = 0;
}
diff --git a/lib/src/main/cpp/test_common/Geometry.cpp b/lib/src/main/cpp/test_common/Geometry.cpp
index 0864ff2..f1fbba9 100644
--- a/lib/src/main/cpp/test_common/Geometry.cpp
+++ b/lib/src/main/cpp/test_common/Geometry.cpp
@@ -23,22 +23,22 @@
const double EPSILON = 1e-6;
const double EPSILON2 = 1e-3;
-inline bool isEqual(double a, double b)
+ bool isEqual(double a, double b)
{
return (fabs(a - b) <= EPSILON);
}
-inline bool isEqual2(double a, double b)
+ bool isEqual2(double a, double b)
{
return (fabs(a - b) <= EPSILON2);
}
-inline double toRadians(double degree)
+ double toRadians(double degree)
{
return (degree * M_PI) / 180.0;
}
-inline double toDegree(double radians)
+ double toDegree(double radians)
{
return (radians * 180.0) / M_PI;
}
diff --git a/lib/src/main/cpp/test_common/Geometry.h b/lib/src/main/cpp/test_common/Geometry.h
index 7248273..276fccd 100644
--- a/lib/src/main/cpp/test_common/Geometry.h
+++ b/lib/src/main/cpp/test_common/Geometry.h
@@ -34,10 +34,10 @@
PointF *point;
} Polygon;
-inline double toRadians(double degree);
-inline double toDegree(double radians);
-inline bool isEqual(double a, double b);
-inline bool isEqual2(double a, double b);
+ double toRadians(double degree);
+ double toDegree(double radians);
+ bool isEqual(double a, double b);
+ bool isEqual2(double a, double b);
void MakeLine(Line *line, const PointF *p1, const PointF *p2);
void MakePolygon(Polygon *polygon, std::initializer_list<PointF> point_set);
diff --git a/lib/src/main/cpp/test_common/car_sensor.cpp b/lib/src/main/cpp/test_common/car_sensor.cpp
index 51d43c4..1ee0721 100644
--- a/lib/src/main/cpp/test_common/car_sensor.cpp
+++ b/lib/src/main/cpp/test_common/car_sensor.cpp
@@ -2,7 +2,7 @@
// Created by fctom on 2020/2/13.
//
-#include <pthread.h>
+#include <mutex>
#include "car_sensor.h"
#include "../driver_test.h"
#include "../defs.h"
@@ -57,14 +57,14 @@
static int SensorNum = 0;
static car_sensor_t Sensor;
-static pthread_mutex_t sonser_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_mutex_t status_rw_mutex = PTHREAD_MUTEX_INITIALIZER;
+static std::mutex sonser_mutex;
+static std::mutex status_rw_mutex;
inline static int BX(int value);
static void WriteCarStatus(uint16_t id, int value);
-static void ConfirmTurnSigalLater(union sigval sig);
-static void flashBeamLightClose(union sigval sig);
+static void ConfirmTurnSigalLater(apptimer_var_t val);
+static void flashBeamLightClose(apptimer_var_t val);
static void SensorChanged(int id, int value);
@@ -82,8 +82,6 @@
left_turn_signal = right_turn_signal = false;
- pthread_mutex_init(&sonser_mutex, NULL);
- pthread_mutex_init(&status_rw_mutex, NULL);
}
void SetSensorCfg(int (*sensor)[3], int sensorNum)
@@ -124,10 +122,10 @@
{
uint16_t chg = 0;
- pthread_mutex_lock(&sonser_mutex);
+ sonser_mutex.lock();
chg = gpioStore^gpio;
gpioStore = gpio;
- pthread_mutex_unlock(&sonser_mutex);
+ sonser_mutex.unlock();
WriteCarStatus(OBD_SPEED, speed);
WriteCarStatus(ENGINE_RPM, rpm);
@@ -218,9 +216,9 @@
{
int value;
- pthread_mutex_lock(&status_rw_mutex);
+ lock_guard<std::mutex> lock(status_rw_mutex);
+
value = CarStatus[id];
- pthread_mutex_unlock(&status_rw_mutex);
return value;
}
@@ -228,10 +226,9 @@
static void WriteCarStatus(uint16_t id, int value)
{
int old_value;
- pthread_mutex_lock(&status_rw_mutex);
+ lock_guard<std::mutex> lock(status_rw_mutex);
old_value = CarStatus[id];
CarStatus[id] = value;
- pthread_mutex_unlock(&status_rw_mutex);
if (id != OBD_SPEED && id != ENGINE_RPM && old_value != value) {
uint8_t buffer[6];
@@ -247,10 +244,8 @@
}
}
-static void ConfirmTurnSigalLater(union sigval sig)
+static void ConfirmTurnSigalLater(apptimer_var_t val)
{
- AppTimer_delete(ConfirmTurnSigalLater);
-
DEBUG("纭杞悜鐏� 宸� %d 鍙� %d", left_turn_signal, right_turn_signal);
if (!left_turn_signal && !right_turn_signal) {
@@ -264,7 +259,7 @@
}
}
-static void flashBeamLightClose(union sigval sig)
+static void flashBeamLightClose(apptimer_var_t val)
{
WriteCarStatus(FLASH_BEAM_LAMP, OFF_LIGHT);
}
diff --git a/lib/src/main/cpp/test_items/area_exam.cpp b/lib/src/main/cpp/test_items/area_exam.cpp
index 1eba15d..75f9da1 100644
--- a/lib/src/main/cpp/test_items/area_exam.cpp
+++ b/lib/src/main/cpp/test_items/area_exam.cpp
@@ -15,7 +15,7 @@
#include "../utils/xconvert.h"
#include "../common/apptimer.h"
#include "../test_common/odo_graph.h"
-
+#include "../test_common/Geometry.h"
#define DEBUG(fmt, args...) LOGD("<area_exam> <%s>: " fmt, __func__, ##args)
static int CurrExamStatus = EXAM_AREA_NONE; // 1 娴嬭瘯瀹屾垚 0 娴嬭瘯涓� -1 娴嬭瘯閿欒閫�鍑�
diff --git a/lib/src/main/cpp/test_items/stop_and_start.cpp b/lib/src/main/cpp/test_items/stop_and_start.cpp
index 135f74b..7639775 100644
--- a/lib/src/main/cpp/test_items/stop_and_start.cpp
+++ b/lib/src/main/cpp/test_items/stop_and_start.cpp
@@ -77,6 +77,7 @@
int TestSAS(const Polygon *map, const car_model *car, const car_model *carPrev, double speed, int moveDirect, const struct RtkTime *rtkTime)
{
+ static double distanceToStopLine = 0, distanceToEdge = 0;
if (!testing)
return 0;
@@ -100,18 +101,6 @@
testing = false;
}
- // 璺濈妫�娴�
- {
- vector<double> dtox;
- vector<Line> line_set;
- Line distance_line;
-
- MakeLine(&distance_line, &map->point[0], &map->point[8]);
- line_set.push_back(distance_line);
- DistanceOfTire2X(dtox, car, line_set);
- MA_SendDistance(dtox[0], dtox[1]);
- }
-
if (prevMoveDirect != moveDirect) {
if (moveDirect == 0) {
stopTimepoint = TimeMakeComposite(rtkTime->hh, rtkTime->mm, rtkTime->ss, rtkTime->mss*10);
@@ -132,26 +121,26 @@
stopPoint = car->carXY[car->body[0]];
- double dis1 = DistanceOfHead2Stopline(map, car);
- double dis2 = DistanceOfTire2Edge(map, car);
+ distanceToStopLine = DistanceOfHead2Stopline(map, car);
+ distanceToEdge = DistanceOfTire2Edge(map, car);
- DEBUG("DIS1 = %f DIS2 = %f", dis1, dis2);
+ DEBUG("DIS1 = %f DIS2 = %f", distanceToStopLine, distanceToEdge);
- if (dis1 > examParam.ramp_stoppoint_red_distance) {
+ if (distanceToStopLine > examParam.ramp_stoppoint_red_distance) {
// 璺濈鍋滄绾垮墠鍚庤秴鍑�50鍘樼背
AddExamFault(20301, rtkTime);
DEBUG("璺濈鍋滄绾垮墠鍚庤秴鍑�50鍘樼背锛屼笉鍚堟牸");
- } else if (fabs(dis1) > EPSILON) {
+ } else if (fabs(distanceToStopLine) > EPSILON) {
// 鍓嶄繚闄╂病鏈変綅浜庡仠姝㈠甫鍐咃紝浣嗘病鏈夎秴鍑�50鍘樼背锛屾墸10鍒�
AddExamFault(20304, rtkTime);
DEBUG("鍓嶄繚闄╂病鏈変綅浜庡仠姝㈠甫鍐咃紝浣嗘病鏈夎秴鍑�50鍘樼背");
}
- if (dis2 > examParam.ramp_edge_red_distance) {
+ if (distanceToEdge > examParam.ramp_edge_red_distance) {
// 璺濈杈圭嚎瓒呭嚭50鍘樼背,涓嶅悎鏍�
AddExamFault(20302, rtkTime);
DEBUG("璺濈杈圭嚎瓒呭嚭50鍘樼背");
- } else if (dis2 > examParam.ramp_edge_yellow_distance) {
+ } else if (distanceToEdge > examParam.ramp_edge_yellow_distance) {
// 璺濈杈圭嚎瓒呭嚭30鍘樼背锛屾墸10鍒�
AddExamFault(20305, rtkTime);
DEBUG("璺濈杈圭嚎瓒呭嚭30鍘樼背");
@@ -161,6 +150,20 @@
if (stopCar && !handBreakActive && ReadCarStatus(HAND_BREAK) == BREAK_ACTIVE) {
handBreakActive = true;
}
+ }
+
+ if (!stopCar) {
+ // 璺濈妫�娴�
+ vector<double> dtox;
+ vector<Line> line_set;
+ Line distance_line;
+
+ MakeLine(&distance_line, &map->point[0], &map->point[8]);
+ line_set.push_back(distance_line);
+ DistanceOfTire2X(dtox, car, line_set);
+ MA_SendDistance(dtox[0], dtox[1]);
+ } else {
+ MA_SendDistance(distanceToStopLine, distanceToEdge);
}
// 鍒ゆ柇璧锋鍚庢粦鐘舵��
@@ -289,6 +292,7 @@
double l2 = DistanceOf(car->carXY[car->right_rear_tire[TIRE_OUTSIDE]], edge);
// return (l1+l2)/2.0;
+
return MAX(l1, l2); // 鍙栨渶杩滅殑
}
diff --git a/lib/src/main/cpp/test_items2/dummy_light.cpp b/lib/src/main/cpp/test_items2/dummy_light.cpp
index 57ec59c..411e37c 100644
--- a/lib/src/main/cpp/test_items2/dummy_light.cpp
+++ b/lib/src/main/cpp/test_items2/dummy_light.cpp
@@ -21,7 +21,7 @@
static bool testing;
-static void CheckSolution(union sigval sig);
+static void CheckSolution(apptimer_var_t val);
static void ExamDummyLight(void);
void StartDummyLightExam(struct dummy_light_exam *ptr, int num, const struct RtkTime* rtkTime)
@@ -101,10 +101,8 @@
}
// 妫�鏌ユ渶缁堢姸鎬�
-static void CheckSolution(union sigval sig)
+static void CheckSolution(apptimer_var_t val)
{
- AppTimer_delete(CheckSolution);
-
if (content[question].process.size() > 0) {
if (content[question].process.size() != process.size()) {
AddExamFault(content[question].wrongCode, &currRtkTime);
diff --git a/lib/src/main/cpp/test_items2/prepare.cpp b/lib/src/main/cpp/test_items2/prepare.cpp
index 0ed3d54..4cb5f34 100644
--- a/lib/src/main/cpp/test_items2/prepare.cpp
+++ b/lib/src/main/cpp/test_items2/prepare.cpp
@@ -16,8 +16,9 @@
static bool exec = false;
static void TtsBack(int seq);
-static void PrepareTimeout(union sigval sig);
-static void PrepareTimeout2(union sigval sig);
+static void PrepareTimeout(apptimer_var_t val);
+static void PrepareTimeout2(apptimer_var_t val);
+
void StartPrepare(void)
{
exec = true;
@@ -91,17 +92,14 @@
hint_cnt++;
}
-static void PrepareTimeout(union sigval sig)
+static void PrepareTimeout(apptimer_var_t val)
{
DEBUG("涓婅溅鍑嗗瓒呮椂");
- AppTimer_delete(PrepareTimeout);
exec = false;
PrepareOver(-2);
}
-static void PrepareTimeout2(union sigval sig)
+static void PrepareTimeout2(apptimer_var_t val)
{
- AppTimer_delete(PrepareTimeout2);
-
PlayTTS(examParam.prepare_tts, TtsBack);
}
diff --git a/lib/src/main/cpp/utils/num.cpp b/lib/src/main/cpp/utils/num.cpp
index 6627921..b477bd9 100644
--- a/lib/src/main/cpp/utils/num.cpp
+++ b/lib/src/main/cpp/utils/num.cpp
@@ -97,3 +97,12 @@
ss >> number;
return number;
}
+
+string intw(int n, int w)
+{
+ stringstream ss;
+
+ ss << setfill('0') << setw(w) << n;
+
+ return ss.str();
+}
\ No newline at end of file
diff --git a/lib/src/main/cpp/utils/num.h b/lib/src/main/cpp/utils/num.h
index 21299b1..ae8e7c2 100644
--- a/lib/src/main/cpp/utils/num.h
+++ b/lib/src/main/cpp/utils/num.h
@@ -6,10 +6,12 @@
#define RTKDRIVERTEST_NUM_H
#include <cstdint>
+#include <string>
long str2int(const uint8_t *s, uint16_t length);
bool str2float(double *f, const uint8_t *s, uint16_t length);
int BitCount(uint32_t n);
double round(double number, unsigned int bits);
+std::string intw(int n, int w);
#endif //RTKDRIVERTEST_NUM_H
--
Gitblit v1.8.0