Browse Source

merge certify

lihz 7 years ago
parent
commit
fd5727dc2c
8 changed files with 1710 additions and 339 deletions
  1. 1546 316
      YAServerDlg.cpp
  2. 11 1
      YAServerDlg.h
  3. 13 1
      classdef.cpp
  4. 45 16
      classdef.h
  5. 9 1
      constdef.h
  6. 38 4
      locate_algorithm.cpp
  7. 1 0
      locate_algorithm.h
  8. 47 0
      tdoa/TDOAFunctor.h

File diff suppressed because it is too large
+ 1546 - 316
YAServerDlg.cpp


+ 11 - 1
YAServerDlg.h

@@ -211,7 +211,7 @@ public:
 
     std::shared_ptr<ReaderPathMap> mp_reader_path_list;	//当前地图的所有分站的覆盖范围
 	std::shared_ptr<TDOAReaderPathMap> mp_reader_path_list_tdoa;
-	std::shared_ptr<CardMap> mp_card_list_over_time_person;
+	std::shared_ptr<CardMap> mp_card_list_over_time_person;			
 	std::shared_ptr<CardMap> mp_card_list_forbidden_person;
 	std::shared_ptr<CardMap> mp_card_list_help;
 	std::shared_ptr<CardMap> mp_card_list_area_over_time_person;
@@ -219,6 +219,7 @@ public:
 	std::shared_ptr<CardMap> mp_card_list_over_time_vehicle;
 	std::shared_ptr<CardMap> mp_card_list_over_speed_vehicle;
 	std::shared_ptr<CardMap> mp_card_list_area_over_time_vehicle;
+	std::shared_ptr<CardMap> mp_card_list_over_count_person;
 
 	std::shared_ptr<AreaMap> mp_area_over_count_person;
 	std::shared_ptr<AreaMap> mp_area_over_time_person;
@@ -243,6 +244,14 @@ public:
 	INT64 m_event_list[MINE_EVENT_COUNT];
 private:
 	int init_smart_pointer_var();
+
+#ifdef CERTIFY_READER_RANGE_AREA
+private:
+	AreaMap mp_reader_range_area_list; // 所有区域
+private:
+	int init_reader_range_area();
+#endif // CERTIFY_READER_RANGE_AREA
+
 public:
 	void init_ui();
 	void init_param();
@@ -459,6 +468,7 @@ public:
 	void parse_json_data_clear_card(const char* sz);
 	void parse_json_data_deal_help(const char* sz);
 	int  parse_json_data_set_light_color(message::ptr const& data);
+	int  parse_json_data_request_counts_info(message::ptr const& data);
 
 	void deal_call_edit_map(int id, EDIT_TYPE_ID edit_type_id);
 	void deal_call_edit_area(int id, EDIT_TYPE_ID edit_type_id);

+ 13 - 1
classdef.cpp

@@ -139,6 +139,18 @@ Card::Card( string cardid, int cardtype, double z_offset, double offset_x /*= 12
 	have_long_fit_pos = false;
 	count_idle = 0;
 	count_change_direction = 0;
+
+	call_type = 0;
+	vt_deal_call_reader_id.resize(0);
+	recv_call_time = time(NULL);
+
+#ifdef CERTIFY_READER_RANGE_AREA
+	reader_area_id = 0;
+	cur_reader_area = 0;
+	old_reader_area = 0;
+
+	::GetLocalTime(&deal_reader_time);
+#endif
 }
 
 Card::Card( void )
@@ -2251,7 +2263,7 @@ Area::Area(void)
 	count_area_over_count_person = count_area_over_count_vehicle = 0;
 	time_over_count_person = time_over_count_vehicle = time(NULL); 
 
-	is_area_forbidden_person = is_area_forbidden_vehicle = 0;
+	is_area_forbidden_person = is_area_forbidden_vehicle = false;
 	count_area_forbidden_person = count_area_forbidden_vehicle = 0;
 	time_forbidden_person = time_forbidden_vehicle = time(NULL);
 

+ 45 - 16
classdef.h

@@ -25,7 +25,7 @@
 #define ADHOC_COUNT 10
 #define READER_TIMEOUT 20
 #define CARD_LOST_TIME_OUT 30
-#define READER_SEND_STATE_TIMEOUT 7200 // (2* 60 * 60)
+#define READER_SEND_STATE_TIMEOUT 10 // (2* 60 * 60)
 #define OVER_TIME (480 * 60)
 
 //#define CARD_TYPE_ADHOC 3
@@ -72,7 +72,7 @@ const double INVALID_COORDINATE = -1000.0;
 const double CHAMBER_WIDTH = 10.0;			//特指前端展现巷道的宽度,单位为像素
 const double VEHICLE_WIDTH = 10.0;
 const int MAX_READER_TDOA_PATH_NUMS = 10;	//主要是因为拐弯处可能存在多解的原因
-const int LIGHT_CTRL_DELAY = 1000;
+const int LIGHT_CTRL_DELAY = 2000;
 
 enum ALARM_FLAG{
 	//AF_CARD_OVER_COUNT = 1,
@@ -86,7 +86,8 @@ enum ALARM_FLAG{
 	AF_CARD_AREA_FORBIDDEN,
 	AF_AREA_OVER_COUNT,
 	AF_AREA_OVER_TIME,
-	AF_AREA_FORBIDDEN
+	AF_AREA_FORBIDDEN,
+	AF_CARD_OVER_COUNT
 };
 
 enum EDIT_TYPE_ID{
@@ -182,6 +183,18 @@ enum SECTION_STATE{
 	SECTION_STATE_CONGESTION = 2,	//拥堵
 };
 
+enum LIGHT_SHAPE{
+	RED_CIRCLE_SOLID = 1,	//红色实心圆
+	RED_CIRCLE = 2,			//红色空心圆
+	RED_CROSS = 3,			//红色叉形
+	GREEN_UP = 4,			//绿色上箭头
+	GREEN_DOWN = 5,			//绿色下箭头
+	GREEN_LEFT = 6,			//绿色左箭头
+	GREEN_RIGHT = 7,		//绿色右箭头
+	RED_SPARK = 8,			//红色闪烁
+	GREEN_SPARK = 9			//绿色闪烁
+};
+
 enum LIGHT_STREAM{
 	UP_STREAM = 1,		//上行
 	DOWN_STREAM = 2,	//下行
@@ -205,18 +218,6 @@ enum LIGHTS_SELECT_TYPE
 	LST_SOME_LIGHTS = 3 // 指定灯
 };
 
-enum LIGHT_SHAPE{
-	RED_CIRCLE_SOLID = 1,	//红色实心圆
-	RED_CIRCLE = 2,			//红色空心圆
-	RED_CROSS = 3,			//红色叉形
-	GREEN_UP = 4,			//绿色上箭头
-	GREEN_DOWN = 5,			//绿色下箭头
-	GREEN_LEFT = 6,			//绿色左箭头
-	GREEN_RIGHT = 7,		//绿色右箭头
-	RED_SPARK = 8,			//红色闪烁
-	GREEN_SPARK = 9			//绿色闪烁
-};
-
 enum AREA_PROPERTY{
 	MAIN_TUNNEL = 0, // 主巷道
 	BRANCH_TUNNEL = 1, // 分支巷道
@@ -319,6 +320,14 @@ enum DEVICE_TYPE{
 	DT_LED = 6 // 显示屏
 };
 
+enum CALL_STATE{
+	CALL_NONE = 0,			//无呼叫信息
+	CALL_SUCCESSED = 1,		//呼叫成功
+	CALL_ING = 2,			//呼叫中
+	CALL_FAILED = 3,		//呼叫失败
+	
+};
+
 struct SQLTHREAD_DATA//写数据库线程传递的参数
 {
 	char* pText;//数据库语句地址指针
@@ -448,7 +457,8 @@ struct _call_info_card
 	string str_card_id;
 	time_t start_time;
 	int time_out;
-	bool is_success;
+	//bool is_success;
+	int call_state;
 };
 //typedef map<std::string, _call_info_card*> CallInfoCardMap;
 typedef map<std::string, std::shared_ptr<_call_info_card>> CallInfoCardMap;
@@ -462,6 +472,7 @@ struct _call_info_reader
 	CallInfoCardMap mpCard;
 };
 typedef map<int, std::shared_ptr<_call_info_reader>> CallInfoReaderMap;
+
 struct _call_info_user
 {
 	std::string user_name;
@@ -1007,6 +1018,7 @@ public:
 	double landmark_dis;
 	int directory;
 	int reader_id; // 当前分站
+
 	Reader* p_reader;
 	std::shared_ptr<ReaderPathMap> pReaderPathMap;
 	std::shared_ptr<TDOAReaderPathMap> pTdoaReaderPathMap;
@@ -1205,6 +1217,10 @@ public: // 
 	public:
 		//测试函数
 		int OutputCmdLog(int n);
+	//呼叫信息
+	int call_type;
+	std::vector<int> vt_deal_call_reader_id;
+	time_t recv_call_time;	//卡接收到呼叫的时间戳
 };
 
 class Dept
@@ -1466,6 +1482,19 @@ enum EVENT_TYPE{ // 
 	ET_CARD_LOST = 27, // 标识卡信号丢失
 };
 
+enum REQUEST_COUNTS_TYPE{
+	REQUEST_ALL = 0,
+	REQUEST_ALL_OVER_TIME_PERSON,
+	REQUEST_AREA_OVER_TIME_PERSON,
+	REQUEST_SPECIAL_ERROR_PERSON,
+	REQUEST_ALL_OVER_TIME_VEHICLE,
+	REQUEST_AREA_OVER_TIME_VEHICLE,
+	REQUEST_ALL_OVER_PERSON,
+	REQUEST_AREA_OVER_PERSON,
+	REQUEST_ALL_OVER_VEHICLE,
+	REQUEST_AREA_OVER_VEHICLE
+};
+
 enum OBJECT_TYPE // 对象类型
 {
 	OT_MINE = 1, // 矿井

+ 9 - 1
constdef.h

@@ -23,7 +23,6 @@
 #define JSON_CMD_VALUE_SET_LIMIT_VALUE "set_limit_value"
 #define JSON_CMD_VALUE_CALL_CARD "call_card"
 #define JSON_CMD_VALUE_CLEAR_CARD "clear_card"
-#define JSON_CMD_VALUE_CALL_CARD_LIST "callcardlist"
 #define JSON_CMD_VALUE_DEAL_HELP "helpme_done"   //deal_help
 #define JSON_CMD_VALUE_EDIT_MAP "edit_map"
 #define JSON_CMD_VALUE_EDIT_AREA "edit_area"
@@ -40,6 +39,12 @@
 
 #define JSON_CMD_VALUE_CALL_CARD_START "call_card_start"
 #define JSON_CMD_VALUE_CALL_CARD_CANCEL "call_card_cancel"
+//呼叫命令
+#define JSON_CMD_VALUE_CALL_CARD_REQUEST "call_card_req"
+#define JSON_CMD_VALUE_CALL_CARD_RESPONSE "call_card_resp"
+#define JSON_CMD_VALUE_CALL_CARD_CANCEL_REQUEST "call_card_cancel_req"
+#define JSON_CMD_VALUE_CALL_CARD_CANCEL_RESPONSE "call_card_cancel_resp"
+#define JSON_CMD_VALUE_CALL_CARD_LIST "callcardlist"
 
 #define JSON_CMD_VALUE_META_DATA_CHANGED "meta_data_changed"
 #define JSON_CMD_VALUE_LIGHTS_CTRL_REQUEST "lights_ctrl_req"
@@ -221,6 +226,9 @@
 #define JSON_KEY_REQ_COUNTS_TYPE "count_type"
 #define JSON_KEY_REQ_COUNTS_TIME "req_time"
 
+// #define JSON_CMD_VALUE_REQUEST_COUNTS_INFO "count_detail_req"		//web端请求统计总数详细列表
+// #define JSON_KEY_RESPONSE_COUNTS_DETAIL "count_detail_resp"
+
 #define JSON_KEY_EVENT_EVENT_ID "event_id"
 #define JSON_KEY_EVENT_STATUS "status"
 #define JSON_KEY_EVENT_TYPE_ID "type_id"

+ 38 - 4
locate_algorithm.cpp

@@ -594,14 +594,12 @@ std::shared_ptr<POS> LocateAlgorithm::TdoaLocate2d(std::shared_ptr<ReceiveDataMa
 	std::vector<_coordinate> vtc;	//保存xi,1  yi,1
 	std::vector<_point> vtp;	//保存三角形的顶点坐标
 	std::vector<int> vts;
-
 	vtk.resize(0);
 	vtd.resize(0);
 	vtc.resize(0);
 	vts.resize(0);
 
 	_coordinate tc;
-
 	int i = 0;
 	unsigned long long time_stamp = 0;	//保存第一次的插值时间戳
 	for (ReceiveDataMap::iterator it = pRdm->begin();it != pRdm->end()&&i<3;++it)
@@ -631,7 +629,6 @@ std::shared_ptr<POS> LocateAlgorithm::TdoaLocate2d(std::shared_ptr<ReceiveDataMa
 				vts.push_back(-1);
 			}
 		}
-
 		vtd.push_back(d);
 
 		_coordinate dtc;
@@ -703,7 +700,6 @@ std::shared_ptr<POS> LocateAlgorithm::TdoaLocate2d(std::shared_ptr<ReceiveDataMa
 			//2.解到点1和点3的距离差的方向性和之前的参数相同
 			d1 = sqrt(pow(vtp[1].x - pos[i].x,2) + pow(vtp[1].y - pos[i].y,2)) - sqrt(pow(vtp[0].x - pos[i].x,2) + pow(vtp[0].y - pos[i].y,2));
 			d2 = sqrt(pow(vtp[2].x - pos[i].x,2) + pow(vtp[2].y - pos[i].y,2)) - sqrt(pow(vtp[0].x - pos[i].x,2) + pow(vtp[0].y - pos[i].y,2));
-
 			if ((d1<0&&vts[0]==-1)||(d1>0&&vts[0] == 1))
 			{
 				condition[0] = true;
@@ -1557,6 +1553,11 @@ std::shared_ptr<POS> LocateAlgorithm::Pos(std::shared_ptr<POS> pos,std::shared_p
 		continue;
 	}
 
+	if (res[nResIdx].x == INVALID_COORDINATE && res[nResIdx].y == INVALID_COORDINATE)
+	{
+		return nullptr;
+	}
+
 	p->posx = res[nResIdx].x;
 	p->posy = res[nResIdx].y;
 	p->posz = res[nResIdx].z;
@@ -2300,6 +2301,39 @@ int LocateAlgorithm::CalcTdoaPosition(std::shared_ptr<ReceiveDataMap> pRdm,std::
 	return 0;
 }
 
+double LocateAlgorithm::GetTriangleArea(_point p0,_point p1,_point p2)
+{
+	_point ab,bc;
+
+	ab.x = p1.x - p0.x;
+	ab.y = p1.y - p0.y;
+
+	bc.x = p2.x - p1.x;
+	bc.y = p2.y - p1.y;
+
+	return abs(ab.x*bc.y - ab.y*bc.x)/2.0;
+}
+
+bool LocateAlgorithm::IsInTriangle(std::vector<_point> vtp,_point p)
+{
+	double sabc = 0,sadb = 0,sbdc = 0,sadc = 0;
+	sabc = GetTriangleArea(vtp[0],vtp[1],vtp[2]);
+	sadb = GetTriangleArea(vtp[0],p,vtp[1]);
+	sbdc = GetTriangleArea(vtp[1],p,vtp[2]);
+	sadc = GetTriangleArea(vtp[0],p,vtp[2]);
+
+	double sum = 0.0;
+	sum = sadb + sbdc + sadc;
+	if ((sabc - sum) > -1E-5 && (sabc - sum) < 1E-5)
+	{
+		return true;
+	} 
+	else
+	{
+		return false;
+	}
+}
+
 bool LocateAlgorithm::CheckPosInValid(POS* pos,ReceiveDataMap* pRdm,double dScale)
 {
 	if(dScale <= 0.0){

+ 1 - 0
locate_algorithm.h

@@ -4,6 +4,7 @@
 #include <stdio.h>
 #include <stdlib.h>
 #include "classdef.h"
+#include "tdoa/TDOAFunctor.h"
 
 #define M_PI       3.14159265358979323846 // ½Ç¶Èת»¡¶È ½Ç¶È * pi / 180
 #define M_PI_2     1.57079632679489661923

+ 47 - 0
tdoa/TDOAFunctor.h

@@ -0,0 +1,47 @@
+#pragma once
+#include <Eigen/Dense>
+#include <unsupported/Eigen/NonLinearOptimization>
+#include <unsupported/Eigen/NumericalDiff>
+
+namespace TdoaAlgo{
+    template<typename _Scalar, int NX = Eigen::Dynamic, int NY = Eigen::Dynamic>
+    class Functor
+    {
+    private:
+        int m_inputs, m_values;
+    public:
+        typedef _Scalar Scalar;
+        enum {
+            InputsAtCompileTime = NX,
+            ValuesAtCompileTime = NY
+        };
+        typedef Eigen::Matrix<Scalar,InputsAtCompileTime,1> InputType;
+        typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,1> ValueType;
+        typedef Eigen::Matrix<Scalar,ValuesAtCompileTime,InputsAtCompileTime> JacobianType;
+
+        Functor() : m_inputs(InputsAtCompileTime), m_values(ValuesAtCompileTime) {}
+        Functor(int inputs, int values) : m_inputs(inputs), m_values(values) {}
+
+        int inputs() const { return m_inputs; }
+        int values() const { return m_values; }
+
+    };
+
+    class TDOAFunctor : public Functor<double>
+    {
+    private:
+        Eigen::MatrixXd _data, _pos;
+    public:
+        TDOAFunctor(const Eigen::MatrixXd &data,const Eigen::MatrixXd &pos): Functor<double>(3,3),_data(data),_pos(pos) {}
+        int operator()(const Eigen::VectorXd &x, Eigen::VectorXd &fvec) const
+        {
+            for (int i = 0; i < values(); i++)
+            {
+                fvec(i) = sqrt(pow(_data(i,0) - x(0),2) + pow(_data(i,1) - x(1),2) + pow(_data(i,2) - x(2),2)) 
+                        - sqrt(pow(_pos(0) - x(0),2) + pow(_pos(1) - x(1),2) + pow(_pos(2) - x(2),2)) 
+                        - _data(i,3);
+            }
+            return 0;
+        }
+    };
+}