From 74bb2be0e23e9f2290ff8ecfb6506acf8a070339 Mon Sep 17 00:00:00 2001 From: yy1717 <fctom1215@outlook.com> Date: 星期四, 09 一月 2020 16:46:59 +0800 Subject: [PATCH] 实现rtk平台基础配置 --- lib/src/main/cpp/master/comm_if.h | 1 lib/src/main/cpp/driver_test.cpp | 89 ++++++++++++++ lib/src/main/cpp/master/comm_if.cpp | 211 +++++++++++++++++++++++++++++++++++ lib/src/main/cpp/driver_test.h | 8 + lib/src/main/cpp/rtk_platform/platform.cpp | 5 5 files changed, 311 insertions(+), 3 deletions(-) diff --git a/lib/src/main/cpp/driver_test.cpp b/lib/src/main/cpp/driver_test.cpp index 2f3d191..55464ad 100644 --- a/lib/src/main/cpp/driver_test.cpp +++ b/lib/src/main/cpp/driver_test.cpp @@ -24,6 +24,7 @@ #include "test_items/turn_a90.h" #include "test_items/driving_curve.h" #include "test_items/stop_and_start.h" +#include "master/comm_if.h" #define DEBUG(fmt, args...) LOGD("<driver_test> <%s>: " fmt, __func__, ##args) @@ -36,6 +37,7 @@ #define RTK_FLOAT 4 #define CAR_MODEL_POINT_NUM 32 +#define MAP_LIST_SIZE 32 enum { TEST_NONE, @@ -58,6 +60,16 @@ static Polygon theParkEdgeMap; // 渚т綅鍋滆溅鍦板浘 static Polygon theTurn90Map; static Polygon theSSMap; + +static struct map_list { + int id; + int type; + Polygon map; + Polygon map2; +} MapList[MAP_LIST_SIZE]; + +static int MapNum = 0; + #define CAR_COORD_STORE_SIZE 10 @@ -101,12 +113,16 @@ static car_model_cache_t carModelCache[CAR_MODEL_CACHE_SIZE]; static int carModelCacheIn, carModelCacheNum; +static void ReadDriverExamPrimerTimeout(union sigval sig); static void UpdateCarBodyCoord(double azimuth, PointF coord); static void UpdateCarBodyCoord(double azimuth, PointF coord, car_model_cache_t *carModel, int &carModelIn, int &carModelNum); static bool FrontTireEnterArea(const Polygon *car, const Polygon *map); void DriverTestInit(void) { + memset(&MapList, 0, sizeof(MapList)); + MapNum = 0; + carModelDescFile = (carModelDesc_t *)malloc(sizeof(carModelDesc_t)); carModelDescFile->body_num = 6; @@ -243,6 +259,79 @@ ErrorList.clear(); TextSpeak("寮�濮嬫祴璇�"); + + AppTimer_add(ReadDriverExamPrimerTimeout, D_SEC(2)); + ReadDriverExamPrimer(); +} + +static void ReadDriverExamPrimerTimeout(union sigval sig) +{ + AppTimer_delete(ReadDriverExamPrimerTimeout); + ReadDriverExamPrimer(); +} + +void ReadDriverExamPrimer(void) +{ +// MA_ReadMap(); +// MA_ReadCar(); +// MA_ReadSensor(); +} + +void ClearMap(void) +{ + for (int i = 0; i < MapNum; ++i) { + if (MapList[i].map.point != NULL) + free(MapList[i].map.point); + if (MapList[i].map2.point != NULL) + free(MapList[i].map2.point); + } + memset(&MapList, 0, sizeof(MapList)); + MapNum = 0; +} + +void AddMap(int id, int type, const double (*map)[2], int pointNum, const double (*map2)[2], int pointNum2) +{ + DEBUG("AddMap id %d type %d pointNum %d point2Num %d", id, type, pointNum, pointNum2); + + AppTimer_delete(ReadDriverExamPrimerTimeout); + + if (map == NULL || pointNum == 0) + return; + + MapList[MapNum].id = id; + MapList[MapNum].type = type; + + MapList[MapNum].map.num = pointNum; + if (pointNum > 0) { + MapList[MapNum].map.point = (PointF *)malloc(sizeof(PointF) * pointNum); + for (int i = 0; i < pointNum; ++i) { + MapList[MapNum].map.point[i].X = map[i][0]; + MapList[MapNum].map.point[i].Y = map[i][0]; + } + } + + MapList[MapNum].map2.num = pointNum2; + if (pointNum2 > 0 && map2 != NULL) { + MapList[MapNum].map2.point = (PointF *)malloc(sizeof(PointF) * pointNum2); + for (int i = 0; i < pointNum2; ++i) { + MapList[MapNum].map2.point[i].X = map2[i][0]; + MapList[MapNum].map2.point[i].Y = map2[i][0]; + } + } + + MapNum++; +} + +void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire, + int *right_front_tire, int *left_rear_tire, int *right_rear_tire, + double (*point)[2], int pointNum) +{ + DEBUG("SetCarMeasurePoint pointNum %d", pointNum); +} + +void SetSensorCfg(int (*sensor)[2], int sensorNum) +{ + DEBUG("SetSensorCfg sensorNum %d", sensorNum); } void UpdateRTKInfo(struct rtk_info *s) diff --git a/lib/src/main/cpp/driver_test.h b/lib/src/main/cpp/driver_test.h index 6979f04..896814b 100644 --- a/lib/src/main/cpp/driver_test.h +++ b/lib/src/main/cpp/driver_test.h @@ -45,6 +45,14 @@ } car_model_cache_t; void DriverTestInit(void); +void ReadDriverExamPrimer(void); +void ClearMap(void); +void AddMap(int id, int type, const double (*map)[2], int pointNum, const double (*map2)[2], int pointNum2); +void SetCarMeasurePoint(double *basePoint, int *axial, int *left_front_tire, + int *right_front_tire, int *left_rear_tire, int *right_rear_tire, + double (*point)[2], int pointNum); +void SetSensorCfg(int (*sensor)[2], int sensorNum); + void UpdateRTKInfo(struct rtk_info *s); void UpdateCarCoord(void); car_model_cache_t *GetCarModelCache(int node); diff --git a/lib/src/main/cpp/master/comm_if.cpp b/lib/src/main/cpp/master/comm_if.cpp index 836fc49..5301d23 100644 --- a/lib/src/main/cpp/master/comm_if.cpp +++ b/lib/src/main/cpp/master/comm_if.cpp @@ -10,6 +10,7 @@ #include "../rapidjson/stringbuffer.h" #include "../rtk_platform/platform.h" #include "../utils/xconvert.h" +#include "../driver_test.h" #include <string> #include <iostream> @@ -26,6 +27,13 @@ #define ID_MS_MAP 0x8006 #define ID_SM_READ_CAR 0x0007 #define ID_MS_CAR 0x8007 +#define ID_SM_READ_SENSOR_CFG 0x0008 +#define ID_MS_SENSOR_CFG 0x8008 +#define ID_MS_START_EXAM 0x8009 +#define ID_SM_EXAM_STATUS 0x0009 +#define ID_SM_GPS_BRIEF 0x000A +#define ID_SM_RTK_BRIEF 0x000B +#define ID_SM_EXAM_BRIEF 0x000B void MA_NdkStart(void) { @@ -102,6 +110,11 @@ SendMsgToMainProc(ID_SM_READ_CAR, NULL); } +void MA_ReadSensor(void) +{ + SendMsgToMainProc(ID_SM_READ_SENSOR_CFG, NULL); +} + void MA_MainProcMsgEntry(int cmd, const char *value) { switch (cmd) { @@ -160,5 +173,203 @@ ConfigPlatform(&cfg); break; } + case ID_MS_MAP: { + Document doc; + doc.Parse(value); + if (!doc.HasParseError()) { + ClearMap(); + + const Value &a = doc.GetArray(); + + if (a.IsArray()) { + for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) { + // a Map + int id, type, pointNum = 0, point2Num = 0; + double (*map)[2] = NULL, (*map2)[2] = NULL; + + if (itr->IsObject()) { + if (itr->HasMember("id")) { + const Value &s = (*itr)["id"]; + id = s.GetInt(); + } + if (itr->HasMember("item")) { + const Value &s = (*itr)["item"]; + type = s.GetInt(); + } + if (itr->HasMember("point")) { + const Value &s = (*itr)["point"]; + int map_index = 0; + + for (Value::ConstValueIterator itr2 = s.Begin(); + itr2 != s.End(); ++itr2, ++map_index) { + // 鏇茬嚎椹鹃┒鏈�2缁� + const Value &s2 = (*itr2)["x-y"]; + + if (map_index == 0) { + int i = 0, j = 0; + pointNum = s2.Size()/2; + map = new double[pointNum][2]; + for (Value::ConstValueIterator itr3 = s2.Begin(); + itr3 != s2.End(); ++itr3) { + map[i][j] = (*itr3).GetDouble(); + if (++j == 2) { + j = 0; + i++; + } + } + } else if (map_index == 1) { + int i = 0, j = 0; + point2Num = s2.Size()/2; + map2 = new double[s2.Size()][2]; + for (Value::ConstValueIterator itr3 = s2.Begin(); + itr3 != s2.End(); ++itr3) { + map2[i][j] = (*itr3).GetDouble(); + if (++j == 2) { + j = 0; + i++; + } + } + } + } + } + + AddMap(id, type, map, pointNum, map2, point2Num); + if (map) delete []map; + if (map2) delete []map2; + } + } + } + } + break; + } + case ID_MS_CAR: { + Document doc; + + doc.Parse(value); + + if (!doc.HasParseError()) { + double basePoint[2]; + int axial[2], left_front_tire[2], right_front_tire[2], left_rear_tire[2], right_rear_tire[2]; + int pointNum = 0; + double (*point)[2] = NULL; + + if (doc.HasMember("main_ant")) { + const Value& s = doc["main_ant"]; + if (s.IsArray()) { + int i = 0; + for(Value::ConstValueIterator itr = s.Begin(); itr != s.End(); ++itr) { + if (i < 2) basePoint[i++] = itr->GetDouble(); + } + } + } + + if (doc.HasMember("axial")) { + const Value& s = doc["axial"]; + if (s.IsArray()) { + int i = 0; + for(Value::ConstValueIterator itr = s.Begin(); itr != s.End(); ++itr) { + if (i < 2) axial[i++] = itr->GetInt(); + } + } + } + + if (doc.HasMember("left_front_tire")) { + const Value& s = doc["left_front_tire"]; + if (s.IsArray()) { + int i = 0; + for(Value::ConstValueIterator itr = s.Begin(); itr != s.End(); ++itr) { + if (i < 2) left_front_tire[i++] = itr->GetInt(); + } + } + } + + if (doc.HasMember("right_front_tire")) { + const Value& s = doc["right_front_tire"]; + if (s.IsArray()) { + int i = 0; + for(Value::ConstValueIterator itr = s.Begin(); itr != s.End(); ++itr) { + if (i < 2) right_front_tire[i++] = itr->GetInt(); + } + } + } + + if (doc.HasMember("left_rear_tire")) { + const Value& s = doc["left_rear_tire"]; + if (s.IsArray()) { + int i = 0; + for(Value::ConstValueIterator itr = s.Begin(); itr != s.End(); ++itr) { + if (i < 2) left_rear_tire[i++] = itr->GetInt(); + } + } + } + + if (doc.HasMember("right_rear_tire")) { + const Value& s = doc["right_rear_tire"]; + if (s.IsArray()) { + int i = 0; + for(Value::ConstValueIterator itr = s.Begin(); itr != s.End(); ++itr) { + if (i < 2) right_rear_tire[i++] = itr->GetInt(); + } + } + } + + if (doc.HasMember("point")) { + const Value& s = doc["point"]; + if (s.IsArray()) { + int i = 0, j = 0; + pointNum = s.Size()/2; + point = new double[pointNum][2]; + + for(Value::ConstValueIterator itr = s.Begin(); itr != s.End(); ++itr) { + point[i][j] = itr->GetDouble(); + if (++j == 2) { + j = 0; + i++; + } + } + } + } + + SetCarMeasurePoint(basePoint, axial, left_front_tire, right_front_tire, + left_rear_tire, right_rear_tire, point, pointNum); + + if (point != NULL) delete []point; + } + break; + } + case ID_MS_SENSOR_CFG: { + Document doc; + doc.Parse(value); + if (!doc.HasParseError()) { + const Value &a = doc.GetArray(); + + if (a.IsArray() && a.Size() > 0) { + int n = a.Size(); + int i = 0; + int (*sensor)[2] = new int[n][2]; + + for (Value::ConstValueIterator itr = a.Begin(); itr != a.End(); ++itr) { + // a gpio mapping + if (itr->HasMember("gpio_num")) { + const Value &s = (*itr)["gpio_num"]; + sensor[i][0] = s.GetInt(); + } + if (itr->HasMember("func_id")) { + const Value &s = (*itr)["func_id"]; + sensor[i][1] = s.GetInt(); + } + ++i; + } + SetSensorCfg(sensor, n); + delete []sensor; + } + } + break; + } + case ID_MS_START_EXAM: { + + break; + } + default:break; } } diff --git a/lib/src/main/cpp/master/comm_if.h b/lib/src/main/cpp/master/comm_if.h index 8286f14..48633c7 100644 --- a/lib/src/main/cpp/master/comm_if.h +++ b/lib/src/main/cpp/master/comm_if.h @@ -16,5 +16,6 @@ void MA_RtkPlatformLogin(int login); void MA_ReadMap(void); void MA_ReadCar(void); +void MA_ReadSensor(void); #endif //MYAPPLICATION2_COMM_IF_H diff --git a/lib/src/main/cpp/rtk_platform/platform.cpp b/lib/src/main/cpp/rtk_platform/platform.cpp index cd9540d..f3d5bb9 100644 --- a/lib/src/main/cpp/rtk_platform/platform.cpp +++ b/lib/src/main/cpp/rtk_platform/platform.cpp @@ -19,6 +19,7 @@ #include "../master/comm_if.h" #include "../utils/xconvert.h" #include "../utils/num.h" +#include "../driver_test.h" #define PARSE_BUFF_SIZE 4096 @@ -109,9 +110,6 @@ AppTimer_add(ReqRtkPlatformConfigTimeout, D_SEC(2)); MA_ReqRtkPlatformConfig(); - - MA_ReadMap(); - MA_ReadCar(); } static void ReqRtkPlatformConfigTimeout(union sigval sig) @@ -125,6 +123,7 @@ void ConfigPlatform(const rtk_platform_cfg_t *p) { DEBUG("ConfigPlatform"); + AppTimer_delete(ReqRtkPlatformConfigTimeout); strcpy(exceptSocket.domain_name, p->domain_name); -- Gitblit v1.8.0