Browse Source

adhoc and algo

researchman 8 years ago
parent
commit
3698d45f1e
8 changed files with 237 additions and 99 deletions
  1. 2 0
      YAServer.cpp
  2. 1 0
      YAServer.h
  3. 1 1
      YAServer.vcxproj
  4. 216 94
      YAServerDlg.cpp
  5. 14 4
      classdef.cpp
  6. 1 0
      classdef.h
  7. 1 0
      def.h
  8. 1 0
      log_def.h

+ 2 - 0
YAServer.cpp

@@ -252,12 +252,14 @@ void CYAServerApp::load_sys_conf()
 		send_json_device = 10000;
 		ws_connect_interval = 2000;
 		time_send_call = 5000;
+		time_send_help = 5000;
 		send_json_postion = atoi(ini.read(CONF_SECT_SERVER_SETTING, CONF_SEND_JSON_POSION).c_str());
 		send_json_counting = atoi(ini.read(CONF_SECT_SERVER_SETTING, CONF_SEND_JSON_COUNTING).c_str());
 		send_json_alarm = atoi(ini.read(CONF_SECT_SERVER_SETTING, CONF_SEND_JSON_ALARM).c_str());
 		send_json_device = atoi(ini.read(CONF_SECT_SERVER_SETTING, CONF_SEND_JSON_DEVICE).c_str());
 		ws_connect_interval = atoi(ini.read(CONF_SECT_SERVER_SETTING, CONF_SEND_WS_CONNECT_INTERVAL).c_str());
 		time_send_call = atoi(ini.read(CONF_SECT_SERVER_SETTING, CONF_SEND_CALLINFO_INTERVAL).c_str());
+		time_send_help = atoi(ini.read(CONF_SECT_SERVER_SETTING, CONF_SEND_HELPINFO_INTERVAL).c_str());
 	}
 }
 

+ 1 - 0
YAServer.h

@@ -67,6 +67,7 @@ public:
 	int send_json_alarm;
 	int send_json_device; 
 	int time_send_call;
+	int time_send_help;
 	int ws_connect_interval;
 
 	//分站发送间隔,以毫秒为单位,100ms 

+ 1 - 1
YAServer.vcxproj

@@ -45,7 +45,7 @@
     <LinkIncremental>true</LinkIncremental>
     <OutDir>$(SolutionDir)..\..\output\$(Configuration)\bin\</OutDir>
     <IntDir>$(SolutionDir)..\IntDir\$(PlatformName)\$(Configuration)\$(ProjectName)\</IntDir>
-    <IncludePath>$(BOOST)\;..\common\;..\thirdparty\include\socket.io-client-cpp\src\;..\thirdparty\include\rapidjson\include\;..\thirdparty\include\websocketpp\;..\thirdparty\include\mysql\;..\thirdparty\include\iocp\common\Src\;$(IncludePath)</IncludePath>
+    <IncludePath>..\thirdparty\include\socket.io-client-cpp\src\;$(BOOST)\;..\common\;..\thirdparty\include\rapidjson\include\;..\thirdparty\include\websocketpp\;..\thirdparty\include\mysql\;..\thirdparty\include\iocp\common\Src\;$(IncludePath)</IncludePath>
     <LibraryPath>$(BOOSTLIB);..\thirdparty\lib\mysql\;$(LibraryPath)</LibraryPath>
   </PropertyGroup>
   <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">

+ 216 - 94
YAServerDlg.cpp

@@ -179,6 +179,7 @@ ULONGLONG time_send_json_postion;
 ULONGLONG time_sync_reader_time;
 ULONGLONG time_clear_call_time;
 ULONGLONG time_send_call;
+ULONGLONG time_send_help;
 ULONGLONG time_ws_connect;
 bool g_exit=false;
 long giSqlCount=0;
@@ -290,18 +291,18 @@ UINT _thread_timer(LPVOID lparam)
 			time_send_json_postion = cur_time;
 
 			DWORD dw = ::GetTickCount();
-			dlg->package_data();
-			//TRACE(_T("package_data: %d\r\n"), ::GetTickCount() - dw);		
+			dlg->package_data();	
 		}
 		//send help 
-		if(dlg->get_help_card_nums()>0){
+		if(cur_time - time_send_help > theApp.send_json_alarm){
+			time_send_help = cur_time;
 			dlg->send_json_data(JSON_CMD_VALUE_PUSH,dlg->get_json_help());
 		}
 		// send_call_data
 		if(cur_time - time_send_call > theApp.send_json_alarm){
-			time_send_call = cur_time;
-			dlg->clear_call_info();
+			time_send_call = cur_time;	
 			dlg->send_call_info();
+			//dlg->clear_call_info();
 		}
 
 		if(!dlg->is_websocket_login &&cur_time - time_ws_connect > theApp.ws_connect_interval){
@@ -319,7 +320,6 @@ UINT _thread_timer(LPVOID lparam)
 UINT _thread_monitor(LPVOID lparam)
 {
 	CYAServerDlg* dlg = reinterpret_cast<CYAServerDlg*>(lparam);
-	//TRACE(_T("time memcpy 10\n"));
 	time_t time_end = time(NULL);
 	while (!g_exit){
 		time_t time_current = time(NULL);
@@ -431,7 +431,7 @@ BOOL CYAServerDlg::OnInitDialog()
 	OnBnStart();
 
 	time_send_json_counting = time_send_json_device_state=time_send_json_alarm=time_send_json_postion=::GetTickCount();
-	time_sync_reader_time=time_clear_call_time=time_send_call=::GetTickCount();
+	time_sync_reader_time=time_clear_call_time=time_send_call=time_send_help=::GetTickCount();
 	m_thread_timer = ::AfxBeginThread(_thread_timer, this, THREAD_PRIORITY_HIGHEST);
 
 	UpdateData(FALSE);
@@ -2969,9 +2969,9 @@ std::string CYAServerDlg::get_json_position()
 	for(; it_map != mp_map_list.end(); ++it_map){
 		CardMap::iterator it = mp_card_list_all.begin();
 		for(; it != mp_card_list_all.end(); ++it){
-			if(it->second->pos_state != DT_DOWN){
+			/*if(it->second->pos_state != DT_DOWN){
 				continue;
-			}
+			}*/
 			if(it->second->issent) {
 				continue;
 			}
@@ -3782,6 +3782,7 @@ void CYAServerDlg::OnFailed()
 {
 	is_websocket_login = false;
 	is_websocket_ok = false;
+	_io->close();
 }
 
 void CYAServerDlg::ws_open()
@@ -4558,7 +4559,7 @@ void CYAServerDlg::parse_json_data_call_card(message::ptr const& data /*const ch
 
 	map<string,message::ptr> data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map();
 
-	call_id = data_map[JSON_KEY_CALL_CARD_CALL_ID]->get_string().c_str();
+	call_id = data_map[JSON_KEY_CALL_CARD_CALL_ID]->get_string();
 	call_time_out = data_map[JSON_KEY_CALL_CARD_CALL_TIME_OUT]->get_int();
 	call_type_id = data_map[JSON_KEY_CALL_CARD_CALL_TYPE]->get_int();
 	user_name = data_map[JSON_KEY_CALL_CARD_USER_NAME]->get_string();
@@ -4577,67 +4578,148 @@ void CYAServerDlg::parse_json_data_call_card(message::ptr const& data /*const ch
 	BYTE buf[LENGTH_SEND_BUF];
 	_call_info_reader* call_reader;
 	_call_info_card* call_card;
+	
+	//呼叫发起有两种,
+	//一种通过分站发起呼叫即为对此分站下的所有自组网卡全员呼叫
+	//一种是对单卡发起的呼叫
 	vector<message::ptr>::const_iterator it_reader = reader_vec.begin();
-	for(; it_reader != reader_vec.end(); ++it_reader){
-		reader_id = (*it_reader)->get_map()[JSON_KEY_CALL_CARD_STATION_ID]->get_int();
-
-		CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id);
-		if(it_call_reader != mp_call_info.end()){
-			call_reader = it_call_reader->second;
-			if(call_reader->call_type > call_type_id){
+	if(reader_vec.size() > 0){	
+		for(; it_reader != reader_vec.end(); ++it_reader){
+			string s_reader_id = "";
+			s_reader_id = (*it_reader)->get_map()[JSON_KEY_CALL_CARD_STATION_ID]->get_string();		
+			reader_id = atoi(s_reader_id.c_str());
+
+			CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id);
+			if(it_call_reader != mp_call_info.end()){
+				call_reader = it_call_reader->second;
+				if(call_reader->call_type > call_type_id){
+					call_reader->call_type = call_type_id;
+				}
+			}else{
+				call_reader = new _call_info_reader;
 				call_reader->call_type = call_type_id;
+				mp_call_info.insert(make_pair(reader_id, call_reader));
 			}
-		}else{
-			call_reader = new _call_info_reader;
-			call_reader->call_type = call_type_id;
-			mp_call_info.insert(make_pair(reader_id, call_reader));
-		}
 
-		vector<message::ptr>::const_iterator it_card = card_vec.begin();
-
-		if(0 == (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_int()){
-			call_reader->cards_count = 0;
-			call_reader->is_call_all = true;
-		}else{
-			call_reader->cards_count = card_vec.size();
-			call_reader->is_call_all = false;
+			vector<message::ptr>::const_iterator it_card = card_vec.begin();	
+			if(card_vec.size() == 0 || "" == (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string()){
+				call_reader->cards_count = 0;
+				call_reader->is_call_all = true;
+				call_reader->is_start_call = true;
+			}else{
+				call_reader->cards_count = card_vec.size();
+				call_reader->is_call_all = false;
+				call_reader->is_start_call = true;
 
-			BYTE card_type = 0;
-			for(; it_card != card_vec.end(); ++it_card){
-				map<string,message::ptr> card_map = (*it_card)->get_map();
-				if( 0 == card_map[JSON_KEY_CALL_CARD_CARD_ID]->get_int()){
-					call_reader->cards_count = 0;
-					call_reader->is_call_all = true;
-				}else{
-					int card_id = card_map[JSON_KEY_CALL_CARD_CARD_ID]->get_int();
-					card_type = card_map[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_int();
-					string str_card_id = CFunctions::getstrwithzero(card_type, 3) + CFunctions::getstrwithzero(card_id, 10);
-					CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(str_card_id);
-					if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表
-						call_card = it_call_card->second;
-						if(call_card->call_type < call_type_id){ // 原呼叫优先级低
+				BYTE card_type = 0;
+				for(; it_card != card_vec.end(); ++it_card){
+					if( "" == (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string()){
+						call_reader->cards_count = 0;
+						call_reader->is_call_all = true;
+					}else{
+						string s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string();
+						string s_card_type = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string();
+						//string str_card_id = CFunctions::getstrwithzero(card_type, 3) + CFunctions::getstrwithzero(card_id, 10);
+						CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id);
+
+						int card_id = atoi(s_card_id.c_str());
+						int card_type = atoi(s_card_type.c_str());
+						if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表
+							call_card = it_call_card->second;
+							if(call_card->call_type < call_type_id){ // 原呼叫优先级低
+								call_card->card_type = card_type;
+								call_card->call_type = call_type_id;
+								call_card->start_time = time(NULL);
+								call_card->time_out = call_time_out;
+							}else {
+								call_card->start_time = time(NULL);
+								call_card->time_out = call_time_out;
+							}
+						}else{ // 未在呼叫列表
+							call_card = new _call_info_card;
+							//call_card->card_id = card_id;
 							call_card->card_type = card_type;
-							call_card->call_type = call_type_id;
-							call_card->start_time = time(NULL);
-							call_card->time_out = call_time_out;
-						}else {
 							call_card->start_time = time(NULL);
 							call_card->time_out = call_time_out;
+							call_card->call_type = call_type_id;
+							call_reader->mpCard.insert(make_pair(s_card_id, call_card));
 						}
-					}else{ // 未在呼叫列表
-						call_card = new _call_info_card;
-						call_card->card_id = card_id;
-						call_card->card_type = card_type;
-						call_card->start_time = time(NULL);
-						call_card->time_out = call_time_out;
-						call_card->call_type = call_type_id;
-						call_reader->mpCard.insert(make_pair(str_card_id, call_card));
 					}
 				}
 			}
 		}
 	}
 
+	//单卡发送呼叫
+	it_reader = reader_vec.begin();
+	if(it_reader == reader_vec.end() && card_vec.size() > 0 ){	
+		int nCounts = 0;
+		int card_id = 0;
+		BYTE card_type = 0;	
+		string s_card_id = "";
+		string s_card_type = "";
+
+		vector<message::ptr>::const_iterator it_card = card_vec.begin();
+
+		for(; it_card != card_vec.end(); ++it_card){
+			card_type = 0;	
+			s_card_id = "";
+			s_card_type = "";
+			call_type_id = 0;
+
+			nCounts++;
+
+			s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string();		
+			s_card_type =(*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string();
+
+			string new_card_id = s_card_id.substr(3,s_card_id.length());
+			card_id = atoi(new_card_id.c_str());
+			card_type = CT_ADHOC;
+					
+			reader_id = mp_card_list_down_adhoc.find(s_card_id)->second->reader_id;
+			CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id);
+			
+			if(it_call_reader != mp_call_info.end()){
+				call_reader = it_call_reader->second;	
+				call_reader->is_start_call = true;
+				if(call_reader->call_type > call_type_id){
+					call_reader->call_type = call_type_id;
+				}
+			}else{
+				call_reader = new _call_info_reader;
+				call_reader->call_type = call_type_id;
+				call_reader->is_call_all = false;
+				call_reader->cards_count = 1;
+				call_reader->is_start_call = true;
+				mp_call_info.insert(make_pair(reader_id, call_reader));
+			}
+			
+
+			CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id);
+			if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表
+				call_card = it_call_card->second;
+				if(call_card->call_type < call_type_id){ // 原呼叫优先级低
+					call_card->card_type = card_type;
+					call_card->card_id = 1;
+					call_card->call_type = call_type_id;
+					call_card->start_time = time(NULL);
+					call_card->time_out = call_time_out;
+				}else {
+					call_card->start_time = time(NULL);
+					call_card->time_out = call_time_out;
+				}
+			}else{ // 未在呼叫列表
+				call_card = new _call_info_card;
+				call_card->card_id = card_id;
+				call_card->card_type = card_type;
+				call_card->start_time = time(NULL);
+				call_card->time_out = call_time_out;
+				call_card->call_type = call_type_id;
+				call_reader->mpCard.insert(make_pair(s_card_id, call_card));
+			}
+		}
+	}
+
 	strlog.Format(_T("%s%s"), _T(LOG_CALL_CARD), _T(LOG_SUCCESS));
 	show_log(strlog);
 }
@@ -5249,6 +5331,16 @@ void CYAServerDlg::send_call_info()
 	BYTE buf[LENGTH_SEND_BUF];
 	SocketMap::iterator it_sock;
 	CallInfoReaderMap::iterator it_call_reader = mp_call_info.begin();
+
+	if(it_call_reader == mp_call_info.end()){
+		LeaveCriticalSection(&m_csCallInfo);
+		return;
+	}
+	if(!it_call_reader->second->is_start_call){
+		LeaveCriticalSection(&m_csCallInfo);
+		return;
+	}
+
 	for(; it_call_reader != mp_call_info.end(); ++it_call_reader){
 		it_sock = mp_socket_list.begin();
 		for(it_sock;it_sock!=mp_socket_list.end();++it_sock){
@@ -5260,29 +5352,35 @@ void CYAServerDlg::send_call_info()
 		if(it_sock != mp_socket_list.end()){
 			memset(buf, 0, LENGTH_SEND_BUF);
 			int npos = 0, card_count = 0;
-
+			//卡数
+			card_count = it_call_reader->second->cards_count;
 			memcpy(&buf[npos], &card_count, sizeof(BYTE));
 			npos += sizeof(BYTE);
+			//呼叫类型
 			memcpy(&buf[npos], &it_call_reader->second->call_type, sizeof(BYTE));
 			npos += sizeof(BYTE);
-
+	
 			if(!it_call_reader->second->is_call_all){ // 定员呼叫,加入卡列表
+				//循环添加卡信息
 				CallInfoCardMap::iterator it_call_card = it_call_reader->second->mpCard.begin();
 				for(; it_call_card != it_call_reader->second->mpCard.end(); ++it_call_card){
+					//呼叫类型
 					memcpy(&buf[npos], &it_call_card->second->call_type, sizeof(BYTE));
 					npos += sizeof(BYTE);
+					//卡类型
 					memcpy(&buf[npos], &it_call_card->second->card_type, sizeof(BYTE));
 					npos += sizeof(BYTE);
+					//卡ID长度
 					BYTE id_len = (BYTE)get_card_id_len(it_call_card->second->card_type);
 					memcpy(&buf[npos], &id_len, sizeof(BYTE));
 					npos += sizeof(BYTE);
+					//卡ID
 					if(id_len > 1){ // 标准卡id为4个字节,自组网卡为1个字节
 						CFunctions::memcpyDWord(buf,  it_call_card->second->card_id, npos);
 					}else{
 						memcpy(&buf[npos], &it_call_card->second->card_id, id_len);
 					}
 					npos += id_len;
-					card_count++;
 				}
 				memcpy(&buf[0], &card_count, sizeof(BYTE));
 			}
@@ -5304,6 +5402,7 @@ void CYAServerDlg::clear_call_info()
 			for(; it_call_card != it_call_reader->second->mpCard.end();){
 				if(difftime(current_time, it_call_card->second->start_time) > it_call_card->second->time_out * 60   ){
 					it_call_reader->second->mpCard.erase(it_call_card++);
+					it_call_reader->second->is_start_call = false;
 				}
 			}
 		}
@@ -7371,6 +7470,7 @@ void CYAServerDlg::OnEnUpdateEditReaderid()
 void CYAServerDlg::parse_json_data_call_card_cancel(message::ptr const& data )
 {
 	EnterCriticalSection(&m_csCallInfo);
+	
 	CString strlog;
 	string call_id, user_name, call_time;
 	string cardid, readerid;
@@ -7378,11 +7478,10 @@ void CYAServerDlg::parse_json_data_call_card_cancel(message::ptr const& data )
 
 	map<string,message::ptr> data_map = data->get_map()[JSON_ROOT_KEY_DATA]->get_map();
 
-	call_id = data_map[JSON_KEY_CALL_CARD_CALL_ID]->get_string().c_str();
-	call_time_out = data_map[JSON_KEY_CALL_CARD_CALL_TIME_OUT]->get_int();
+	call_id = data_map[JSON_KEY_CALL_CARD_CALL_ID]->get_string();
 	user_name = data_map[JSON_KEY_CALL_CARD_USER_NAME]->get_string();
 	call_time = data_map[JSON_KEY_CALL_CARD_CALL_TIME]->get_string();
-
+	
 	vector<message::ptr> reader_vec = data_map[JSON_KEY_CALL_CARD_STATIONS]->get_vector();
 	vector<message::ptr> card_vec = data_map[JSON_KEY_CALL_CARD_CARDS]->get_vector();
 
@@ -7396,49 +7495,72 @@ void CYAServerDlg::parse_json_data_call_card_cancel(message::ptr const& data )
 	BYTE buf[LENGTH_SEND_BUF];
 	_call_info_reader* call_reader;
 	_call_info_card* call_card;
+	//取消呼叫有两种:
+	//从分站取消呼叫,即取消全员呼叫
+	//对指定卡取消呼叫
 	vector<message::ptr>::const_iterator it_reader = reader_vec.begin();
-	for(; it_reader != reader_vec.end(); ++it_reader){
-		reader_id = (*it_reader)->get_map()[JSON_KEY_CALL_CARD_STATION_ID]->get_int();
-
-		CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id);
-		if(it_call_reader != mp_call_info.end()){
-			call_reader = it_call_reader->second;
-
-			vector<message::ptr>::const_iterator it_card = card_vec.begin();
-			if(0 == (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_int()){
-				if(  call_reader->cards_count){
-					CallInfoCardMap::iterator it_reader_card = call_reader->mpCard.begin();
-					for(; it_reader_card != call_reader->mpCard.end();){
-						call_reader->mpCard.erase(++it_reader_card);
-					}
-				}
-				call_reader->mpCard.clear();
-				mp_call_info.erase(it_call_reader);
-			}else{
-				call_reader->cards_count = card_vec.size();
+	if(reader_vec.size() > 0){
+		for(; it_reader != reader_vec.end(); ++it_reader){
+			string s_reader_id = (*it_reader)->get_map()[JSON_KEY_CALL_CARD_STATION_ID]->get_string();
+			reader_id = atoi(s_reader_id.c_str());
+			CallInfoReaderMap::iterator it_call_reader = mp_call_info.find(reader_id);
+			if(it_call_reader != mp_call_info.end()){
+				call_reader = it_call_reader->second;
+				call_reader->is_start_call = false;
 				call_reader->is_call_all = false;
 
-				BYTE card_type = 0;
-				for(; it_card != card_vec.end(); ++it_card){
-					map<string,message::ptr> card_map = (*it_card)->get_map();
-
-					int card_id = card_map[JSON_KEY_CALL_CARD_CARD_ID]->get_int();
-					card_type = card_map[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_int();
-					string str_card_id = CFunctions::getstrwithzero(card_type, 3) + CFunctions::getstrwithzero(card_id, 10);
-					CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(str_card_id);
-					if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表
-						 call_reader->mpCard.erase(it_call_card);
+				vector<message::ptr>::const_iterator it_card = card_vec.begin();
+				if(card_vec.size() == 0 || "" == (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string()){
+					if(call_reader->cards_count){
+						CallInfoCardMap::iterator it_reader_card = call_reader->mpCard.begin();
+						for(; it_reader_card != call_reader->mpCard.end();){
+							call_reader->mpCard.erase(++it_reader_card);
+						}
 					}
-				}
-				if(call_reader->mpCard.size() == 0){
 					call_reader->mpCard.clear();
 					mp_call_info.erase(it_call_reader);
+					call_reader->cards_count = 0;
+				}else{
+					BYTE card_type = 0;
+					for(; it_card != card_vec.end(); ++it_card){
+						string s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string();
+						string s_card_type = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string();
+						
+						CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id);
+						if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表
+							call_reader->mpCard.erase(it_call_card);
+						}
+					}
+					if(call_reader->mpCard.size() == 0){
+						call_reader->mpCard.clear();
+						mp_call_info.erase(it_call_reader);
+					}
 				}
+				call_reader->cards_count = 0;
+			}
+		}
+	}
+
+	it_reader = reader_vec.begin();
+	if(it_reader == reader_vec.end() && card_vec.size() > 0){
+		vector<message::ptr>::const_iterator it_card = card_vec.begin();
+		BYTE card_type = 0;
+		for(; it_card != card_vec.end(); ++it_card){
+			string s_card_id = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_ID]->get_string();
+			string s_card_type = (*it_card)->get_map()[JSON_KEY_CALL_CARD_CARD_TYPE_ID]->get_string();
+
+			int reader_id = mp_card_list_down_adhoc.find(s_card_id)->second->reader_id;
+
+			call_reader = mp_call_info.find(reader_id)->second;
+			call_reader->is_start_call = false;
+			CallInfoCardMap::iterator it_call_card = call_reader->mpCard.find(s_card_id);
+			if(it_call_card != call_reader->mpCard.end()){ // 已在呼叫列表
+				call_reader->mpCard.erase(it_call_card);
 			}
 		}
 	}
 
 	LeaveCriticalSection(&m_csCallInfo);
-	strlog.Format(_T("%s%s"), _T(LOG_CALL_CARD), _T(LOG_SUCCESS));
+	strlog.Format(_T("%s%s"), _T(LOG_CANCEL_CALL_CARD), _T(LOG_SUCCESS));
 	show_log(strlog);
 }

+ 14 - 4
classdef.cpp

@@ -731,7 +731,7 @@ void Card::get_coordinate( int cnt )
 						}
 						break;
 					case CT_VEHICLE:
-						if(av > 10){
+						if(av > 5){
 							//保留上次结果
 							this->x = this->last_locate.x;
 							this->y = this->last_locate.y;
@@ -777,6 +777,8 @@ void Card::get_coordinate( int cnt )
 		}
 
 		if(m_nFilterType == FILTER_KALMAN){
+			double kalman_detal_t = (maxSycnTimes - this->last_locate.tt)*interval_time;
+
 			//通过卡尔曼滤波处理
 			if(p->posx == INVALID_COORDINATE && p->posy == INVALID_COORDINATE){
 				this->m_pKalmanFilter->m_bFlag = false;	
@@ -792,10 +794,11 @@ void Card::get_coordinate( int cnt )
 				if(this->m_pKalmanFilter->m_nCounts >= 3){
 					//只有三次以上才允许使用kalman滤波以下的函数
 					//this->m_pKalmanFilter->Predict(deltaT);
-					this->m_pKalmanFilter->Predict(deltaT);
+					this->m_pKalmanFilter->Predict(kalman_detal_t);
 					this->x = this->m_pKalmanFilter->m_pCar->x(0,0);
 					this->y = this->m_pKalmanFilter->m_pCar->x(2,0);
 					this->z = -4;
+					sdNew.update = true;
 				}		
 			}else{
 				this->m_pKalmanFilter->m_bFlag = true;
@@ -818,7 +821,9 @@ void Card::get_coordinate( int cnt )
 				}
 				if(this->m_pKalmanFilter->m_nCounts >= 3){
 					//只有三次以上才允许使用kalman滤波以下的函数
-					this->m_pKalmanFilter->Predict_Correct(deltaT);
+					//this->m_pKalmanFilter->Predict_Correct(deltaT);
+					this->m_pKalmanFilter->Predict_Correct(kalman_detal_t);
+					sdNew.update = true;
 					
 					if(deltaT!=0){
 						/*this->m_pKalmanFilter->m_pCar->x(1,0) = (this->m_pKalmanFilter->m_pCar->x(0,0) - this->last_locate.x)/deltaT;
@@ -872,6 +877,9 @@ void Card::get_coordinate( int cnt )
 			this->v = sqrt(pow(this->m_pKalmanFilter->m_pCar->x(1,0),2) + pow(this->m_pKalmanFilter->m_pCar->x(3,0),2))*this->map_scale;
 			this->v*=3.6;	//转为km/h
 
+			cvx = this->m_pKalmanFilter->m_pCar->x(1,0);
+			cvy = this->m_pKalmanFilter->m_pCar->x(3,0);
+
 			nSign = 1;
 			if(this->m_pKalmanFilter->m_pCar->x(1,0) == 0){
 				if(this->m_pKalmanFilter->m_pCar->x(3,0)>0){
@@ -891,9 +899,11 @@ void Card::get_coordinate( int cnt )
 			this->origin_locate.v = cv;
 
 			if(sdNew.update){
+				sdNew.sync_num = maxSycnTimes;
 				sdNew.x = this->x;
 				sdNew.y = this->y;
-
+				sdNew.vx = cvx;
+				sdNew.vy = cvy;
 				m_syncNumList.push_back(sdNew);
 			}
 		}else{

+ 1 - 0
classdef.h

@@ -304,6 +304,7 @@ typedef map<std::string, _call_info_card*> CallInfoCardMap;
 struct _call_info_reader
 {
 	bool is_call_all;
+	bool is_start_call;		//true,żŞĘźşô˝Đ;false,ČĄĎűşô˝Đ
 	BYTE call_type;
 	int cards_count;
 	CallInfoCardMap mpCard;

+ 1 - 0
def.h

@@ -37,6 +37,7 @@
 #define CONF_SEND_JSON_ALARM "interval_send_json_alarm"
 #define CONF_SEND_JSON_DEVICE "interval_send_json_device"
 #define CONF_SEND_CALLINFO_INTERVAL "send_call_interval"
+#define CONF_SEND_HELPINFO_INTERVAL "send_help_interval"
 #define CONF_SEND_WS_CONNECT_INTERVAL "ws_connect_inteval"
 #define CONF_SERVER_SAMPLING_INTERVAL "sampling_interval"
 #define CONF_SERVER_COORDINATE_ERROR "coor_error"

+ 1 - 0
log_def.h

@@ -45,6 +45,7 @@
 #define LOG_FAIL "失败"
 #define LOG_SET_LIMIT_VALUE "设置限值"
 #define LOG_CALL_CARD "呼叫"
+#define LOG_CANCEL_CALL_CARD "取消呼叫"
 #define LOG_CLEAR_CARD "清除盲区卡"
 #define LOG_DEAL_HELP "处理呼救信息"
 #define LOG_EDIT_MAP "编辑地图"