|
@@ -56,6 +56,7 @@
|
|
|
//int aa = 0;
|
|
|
|
|
|
DWORD g_tickcount;
|
|
|
+DWORD g_diffTickCount = 0;
|
|
|
|
|
|
class CAboutDlg : public CDialogEx
|
|
|
{
|
|
@@ -547,6 +548,8 @@ HCURSOR CYAServerDlg::OnQueryDragIcon()
|
|
|
|
|
|
void CYAServerDlg::OnBnStart()
|
|
|
{
|
|
|
+ Test();
|
|
|
+
|
|
|
if(!is_websocket_login){
|
|
|
ws_login();
|
|
|
}
|
|
@@ -1103,6 +1106,7 @@ int CYAServerDlg::init_dev_adhoc( int reader_id /*= 0*/ )
|
|
|
}
|
|
|
|
|
|
/*
|
|
|
+ * 函数名:init_all_readers_coverage
|
|
|
* 从数据库的dat_reader_path表中读取指定map_id和reader_id的地图范围集,
|
|
|
* 将此分站的地图范围集保存在分站类中的readerCoverage中;
|
|
|
* 如果指定了相同的地图范围集的reader_id,则直接将指定的reader_id的地图范围集赋值给此reader_id的地图范围集
|
|
@@ -1110,10 +1114,10 @@ int CYAServerDlg::init_dev_adhoc( int reader_id /*= 0*/ )
|
|
|
*
|
|
|
*
|
|
|
* @param
|
|
|
- * reader 分站类对象
|
|
|
+ * reader_id 分站id号
|
|
|
*
|
|
|
* @return
|
|
|
- * -1,表示在分站map中未找到此分站信息;0,表示正常执行
|
|
|
+ * -1,表示在分站map中未找到此分站信息或者未正常执行;0,表示正常执行
|
|
|
*
|
|
|
*/
|
|
|
int CYAServerDlg::init_all_readers_coverage(int reader_id)
|
|
@@ -1121,6 +1125,7 @@ int CYAServerDlg::init_all_readers_coverage(int reader_id)
|
|
|
CMysqlConn* pConn = NULL;
|
|
|
CDBConnGuard pDbGuard(pConn);
|
|
|
|
|
|
+ //如果无可用数据库连接,不执行后续操作
|
|
|
if(pConn == NULL){
|
|
|
return -1;
|
|
|
}
|
|
@@ -1136,7 +1141,9 @@ int CYAServerDlg::init_all_readers_coverage(int reader_id)
|
|
|
MYSQL_ROW pRow;
|
|
|
int err = 0;
|
|
|
int nRow = 0;
|
|
|
+ //查询数据库
|
|
|
pRes = pConn->Execute(sql,err);
|
|
|
+
|
|
|
//从数据库获得信息赋给分站对象的地图集
|
|
|
while(pRow = mysql_fetch_row(pRes)){
|
|
|
int nReaderId = atoi(pRow[1]);
|
|
@@ -1144,6 +1151,8 @@ int CYAServerDlg::init_all_readers_coverage(int reader_id)
|
|
|
|
|
|
int nSameConfigReader = atoi(pRow[0]);
|
|
|
int nIdx = atoi(pRow[2]);
|
|
|
+ //判断地图集信息是否可利用其它分站的覆盖范围,如果可用,则使用其它分站的覆盖范围
|
|
|
+ //-1表示不可用,否则表示可复用分站id号为nSameConfigReader的地图集覆盖范围
|
|
|
if(nSameConfigReader == -1){
|
|
|
_point p;
|
|
|
p.x = atof(pRow[3]);
|
|
@@ -1160,11 +1169,12 @@ int CYAServerDlg::init_all_readers_coverage(int reader_id)
|
|
|
}
|
|
|
mysql_free_result(pRes);
|
|
|
|
|
|
+ //输出操作数据库的日志信息
|
|
|
CString strlog;
|
|
|
strlog.Format(_T("%s%d%s"), _T(LOG_INIT_VEHICLE), nRow, _T(LOG_RECORD_COUNT));
|
|
|
show_log(strlog);
|
|
|
|
|
|
- //根据获得地图集将其赋给station
|
|
|
+ //根据获得地图集将其赋给mp_reader_path_list
|
|
|
ReaderMap::iterator it = mp_reader_list.begin();
|
|
|
for(it;it!=mp_reader_list.end();it++){
|
|
|
if(it->second->bIsInitCoverage){
|
|
@@ -1193,7 +1203,8 @@ int CYAServerDlg::init_all_readers_coverage(int reader_id)
|
|
|
pReaderPath->pz[j - 1] = it->second->readerCoveragePath.find(j)->second.z*dMapScale;
|
|
|
}
|
|
|
|
|
|
- //初始化
|
|
|
+ //以下对应与全局变量的数组形式的另一种实现
|
|
|
+ //初始化
|
|
|
/*station[nReaderId].nRealCalcPoints = 0;
|
|
|
for(int i=0;i<2;i++){
|
|
|
station[nReaderId].x[i] = 0;
|
|
@@ -1225,6 +1236,135 @@ int CYAServerDlg::init_all_readers_coverage(int reader_id)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * 函数名:init_tdoa_all_readers_coverage
|
|
|
+ * 实现初始化TDOA方式的地图集描述,并存储冗余数据
|
|
|
+ * 冗余数据的主要作用在于:例如存在分站<B1,B2>之间的地图集描述,那么也存在<B2,B1>的对应关系
|
|
|
+ *
|
|
|
+ * param
|
|
|
+ * reader_id ------ 分站id号
|
|
|
+ *
|
|
|
+ * return
|
|
|
+ * 如果执行失败返回-1
|
|
|
+ * 正确执行,返回0
|
|
|
+ *
|
|
|
+*/
|
|
|
+int CYAServerDlg::init_tdoa_all_readers_coverage(int reader_id)
|
|
|
+{
|
|
|
+ CMysqlConn* pConn = NULL;
|
|
|
+ CDBConnGuard pDbGuard(pConn);
|
|
|
+
|
|
|
+ //无可用数据库连接
|
|
|
+ if(pConn == NULL){
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ char sql[LENGTH_SQL] = {0};
|
|
|
+ if(reader_id == 0){
|
|
|
+ sprintf_s(sql, "select p.start_reader_id,p.end_reader_id,p.idx,p.x,p.y,p.z,p.is_bezier from dat_reader_path_tdoa p ,dat_reader r where p.start_reader_id = r.reader_id;");
|
|
|
+ }else{
|
|
|
+ sprintf_s(sql, "select start_reader_id,end_reader_id,idx,x,y,z,is_bezier from dat_reader_path_tdoa where reader_id = %d; ", reader_id);
|
|
|
+ }
|
|
|
+
|
|
|
+ MYSQL_RES* pRes = NULL;
|
|
|
+ MYSQL_ROW pRow;
|
|
|
+ int err = 0;
|
|
|
+ int nRow = 0;
|
|
|
+
|
|
|
+ //查询数据库
|
|
|
+ pRes = pConn->Execute(sql,err);
|
|
|
+
|
|
|
+ double mapScale = 0.0;
|
|
|
+ while(pRow = mysql_fetch_row(pRes)){
|
|
|
+ int start_reader_id = atoi(pRow[0]);
|
|
|
+ int end_reader_id = atoi(pRow[1]);
|
|
|
+ int ndx = atoi(pRow[2]);
|
|
|
+
|
|
|
+ //后缀_r都为冗余信息
|
|
|
+ ReaderPath* prp = NULL;
|
|
|
+ ReaderPath* prp_r = NULL;
|
|
|
+
|
|
|
+ TDOAReaderPathMap::iterator it = mp_reader_path_list_tdoa.find(start_reader_id);
|
|
|
+
|
|
|
+ if(it == mp_reader_path_list_tdoa.end()){
|
|
|
+ ReaderPathMap* prpm = new ReaderPathMap();
|
|
|
+ ReaderPath* prp1 = new ReaderPath();
|
|
|
+ prpm->insert(make_pair(end_reader_id,prp1));
|
|
|
+ mp_reader_path_list_tdoa.insert(make_pair(start_reader_id,*prpm));
|
|
|
+
|
|
|
+ //冗余数据
|
|
|
+ ReaderPathMap* prpm_r = new ReaderPathMap();
|
|
|
+ ReaderPath* prp1_r = new ReaderPath();
|
|
|
+ prpm_r->insert(make_pair(start_reader_id,prp1_r));
|
|
|
+ mp_reader_path_list_tdoa.insert(make_pair(end_reader_id,*prpm_r));
|
|
|
+ }else{
|
|
|
+ ReaderPathMap::iterator it2;
|
|
|
+ it2 = it->second.find(end_reader_id);
|
|
|
+ if(it2 == it->second.end()){
|
|
|
+ ReaderPath* prp1 = new ReaderPath();
|
|
|
+ it->second.insert(make_pair(end_reader_id,prp1));
|
|
|
+
|
|
|
+ //冗余数据
|
|
|
+ ReaderPathMap* prpm_r = new ReaderPathMap();
|
|
|
+ ReaderPath* prp1_r = new ReaderPath();
|
|
|
+ prpm_r->insert(make_pair(start_reader_id,prp1_r));
|
|
|
+ mp_reader_path_list_tdoa.insert(make_pair(end_reader_id,*prpm_r));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ ReaderPathMap::iterator it_rpm = mp_reader_path_list_tdoa.find(start_reader_id)->second.find(end_reader_id);
|
|
|
+ if(it_rpm!=mp_reader_path_list_tdoa.find(start_reader_id)->second.end()){
|
|
|
+ prp = it_rpm->second;
|
|
|
+ }else{
|
|
|
+ prp = new ReaderPath();
|
|
|
+ }
|
|
|
+
|
|
|
+ //冗余信息
|
|
|
+ ReaderPathMap::iterator it_rpm_r = mp_reader_path_list_tdoa.find(end_reader_id)->second.find(start_reader_id);
|
|
|
+ if(it_rpm_r!=mp_reader_path_list_tdoa.find(end_reader_id)->second.end()){
|
|
|
+ prp_r = it_rpm_r->second;
|
|
|
+ }else{
|
|
|
+ prp_r = new ReaderPath();
|
|
|
+ }
|
|
|
+
|
|
|
+ //获得地图比例
|
|
|
+ int map_id = mp_reader_list.find(start_reader_id)->second->map_id;
|
|
|
+ MapInfoMap::iterator mit = mp_map_list.find(map_id);
|
|
|
+ if(mit == mp_map_list.end()){
|
|
|
+ //没有相关地图信息,要输出错误日志
|
|
|
+ AfxMessageBox(_T("分站所在地图不存在!"));
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ mapScale = mp_map_list.find(map_id)->second->map_scale;
|
|
|
+
|
|
|
+ //获得分站坐标,其中索引0表示起始分站坐标,索引1表示结束分站坐标
|
|
|
+ prp->x[0] = mp_reader_list.find(start_reader_id)->second->reader_x*mapScale;
|
|
|
+ prp->y[0] = mp_reader_list.find(start_reader_id)->second->reader_y*mapScale;
|
|
|
+ prp->x[1] = mp_reader_list.find(end_reader_id)->second->reader_x*mapScale;
|
|
|
+ prp->y[1] = mp_reader_list.find(end_reader_id)->second->reader_y*mapScale;
|
|
|
+ prp->px[ndx-1] = atof(pRow[3])*mapScale;
|
|
|
+ prp->py[ndx-1] = atof(pRow[4])*mapScale;
|
|
|
+ prp->nRealCalcPoints++;
|
|
|
+
|
|
|
+ //冗余信息
|
|
|
+ prp_r->x[0] = mp_reader_list.find(end_reader_id)->second->reader_x*mapScale;
|
|
|
+ prp_r->y[0] = mp_reader_list.find(end_reader_id)->second->reader_y*mapScale;
|
|
|
+ prp_r->x[1] = mp_reader_list.find(start_reader_id)->second->reader_x*mapScale;
|
|
|
+ prp_r->y[1] = mp_reader_list.find(start_reader_id)->second->reader_y*mapScale;
|
|
|
+ prp_r->px[ndx-1] = atof(pRow[3])*mapScale;
|
|
|
+ prp_r->py[ndx-1] = atof(pRow[4])*mapScale;
|
|
|
+ prp_r->nRealCalcPoints++;
|
|
|
+ }
|
|
|
+ mysql_free_result(pRes);
|
|
|
+
|
|
|
+ //输出操作结果信息
|
|
|
+ CString strlog;
|
|
|
+ strlog.Format(_T("%s%d%s"), _T(LOG_INIT_VEHICLE), nRow, _T(LOG_RECORD_COUNT));
|
|
|
+ show_log(strlog);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
//int CYAServerDlg::init_adhoc( string adhoc_id /*= ""*/ )
|
|
|
//{
|
|
|
// CMysqlConn* pConn = NULL;
|
|
@@ -1655,7 +1795,11 @@ void CYAServerDlg::parse_data_locate_card(BYTE* DataBuffer, int& nCurPos, int re
|
|
|
}
|
|
|
// 设置当前分站, 进入分站时间、进入区域时间,当前区域,当前地图
|
|
|
card->set_reader(it->second);
|
|
|
+#ifdef ALGORITHM_TYPE_TOF
|
|
|
card->set_reader_path(&mp_reader_path_list);
|
|
|
+#elif defined ALGORITHM_TYPE_TDOA
|
|
|
+ card->set_reader_path(&mp_reader_path_list_tdoa);
|
|
|
+#endif
|
|
|
card->reader_tickcount = it->second->tick_count;
|
|
|
card->is_hist = false;
|
|
|
|
|
@@ -2316,6 +2460,7 @@ std::string CYAServerDlg::get_json_postion()
|
|
|
if(! pos_maps.isNull()){
|
|
|
root[JSON_ROOT_KEY_CMD] = JSON_CMD_VALUE_POS_MAP;
|
|
|
root[JSON_ROOT_KEY_DATA] = pos_maps;
|
|
|
+ root[JSON_ROOT_KEY_DIFF_TICK_COUNT] = (int)g_diffTickCount;
|
|
|
ret = root.toFastString();
|
|
|
}
|
|
|
return ret;
|
|
@@ -2485,8 +2630,10 @@ void CYAServerDlg::send_json_data(string cmd, string data, bool is_login /* = fa
|
|
|
//strlog.Format(_T("%s: %s"), _T(LOG_SEND_JSON_DATA), CFunctions::c2wc(cmd.c_str()));
|
|
|
//show_log(strlog);
|
|
|
dw = GetTickCount();
|
|
|
+ g_diffTickCount = dw - g_tickcount;
|
|
|
TRACE(_T("%d\r\n"), dw - g_tickcount );
|
|
|
g_tickcount = dw;
|
|
|
+
|
|
|
}
|
|
|
|
|
|
// 处理分站状态
|
|
@@ -2942,6 +3089,15 @@ void CYAServerDlg::package_data()
|
|
|
if(strJson == "") return ;
|
|
|
send_json_data(JSON_CMD_VALUE_PUSH, strJson);
|
|
|
dw_last_send_time = GetTickCount();
|
|
|
+ //ifstream
|
|
|
+
|
|
|
+ //json字符串输出到文件中
|
|
|
+ /*ofstream ofs;
|
|
|
+ ofs.open("result.js",ios::app);
|
|
|
+ Json::StyledWriter writer;
|
|
|
+ string res = writer.write(strJson);
|
|
|
+ ofs << res;
|
|
|
+ ofs.close();*/
|
|
|
}
|
|
|
|
|
|
void CYAServerDlg::package_data_test()
|
|
@@ -4605,6 +4761,7 @@ void CYAServerDlg::init_base_data()
|
|
|
init_reader();
|
|
|
init_antenna();
|
|
|
init_all_readers_coverage();
|
|
|
+ init_tdoa_all_readers_coverage();
|
|
|
init_dev_adhoc();
|
|
|
}
|
|
|
|
|
@@ -5365,3 +5522,105 @@ void CYAServerDlg::parse_data_locate_reader_his( BYTE * DataBuffer, int& nCurPos
|
|
|
parse_data_locate_card_his(DataBuffer, nCurPos, dwReaderID, wTickCount, strTime);
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+void CYAServerDlg::Test()
|
|
|
+{
|
|
|
+ ReaderPath* prp = new ReaderPath();
|
|
|
+ /*prp->x[0] = -1;
|
|
|
+ prp->x[1] = 1;
|
|
|
+ prp->y[0] = 0;
|
|
|
+ prp->y[1] = 0;
|
|
|
+
|
|
|
+ prp->px[0] = -1;
|
|
|
+ prp->px[1] = 1;
|
|
|
+ prp->py[0] = 0;
|
|
|
+ prp->py[1] = 0;
|
|
|
+
|
|
|
+ //double dist = 0.5;
|
|
|
+ double dist = -0.5;*/
|
|
|
+
|
|
|
+ //2
|
|
|
+ /*prp->x[0] = 10;
|
|
|
+ prp->x[1] = 10;
|
|
|
+ prp->y[0] = 2;
|
|
|
+ prp->y[1] = 13.7;
|
|
|
+
|
|
|
+ prp->px[0] = 10;
|
|
|
+ prp->px[1] = 10;
|
|
|
+ prp->py[0] = 2;
|
|
|
+ prp->py[1] = 13.7;*/
|
|
|
+
|
|
|
+ //3
|
|
|
+ prp->x[0] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->x[0];
|
|
|
+ prp->x[1] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->x[1];
|
|
|
+ prp->y[0] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->y[0];
|
|
|
+ prp->y[1] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->y[1];
|
|
|
+
|
|
|
+ prp->px[0] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->px[0];
|
|
|
+ prp->px[1] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->px[1];
|
|
|
+ prp->py[0] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->py[0];
|
|
|
+ prp->py[1] = mp_reader_path_list_tdoa.find(27)->second.find(28)->second->py[1];
|
|
|
+
|
|
|
+ //double dist = 0.5;
|
|
|
+ double dist = -0.5;
|
|
|
+
|
|
|
+ RESULT* r = NULL;
|
|
|
+ r = LocateAlgorithm::GetPos(prp,dist,0);
|
|
|
+
|
|
|
+ //因为双曲线与分站之间第i条线段或者第j条线段分别有两焦点
|
|
|
+ //或者分站之间就一条直线,有两焦点
|
|
|
+ double xcross[2] = {0};
|
|
|
+ double ycross[2] = {0};
|
|
|
+
|
|
|
+ for(int j = 0; j < 2;j++){
|
|
|
+ xcross[j] = r->x[j];
|
|
|
+ ycross[j] = r->y[j];
|
|
|
+ }
|
|
|
+
|
|
|
+ double deltad[2] = {0};
|
|
|
+ for(int j = 0; j < 2;j ++){
|
|
|
+ double d[2] = {0};
|
|
|
+ double dx1 = r->x[j] - prp->x[0];
|
|
|
+ double dy1 = r->y[j] - prp->y[0];
|
|
|
+ d[0] = sqrt(pow(dx1,2) + pow(dy1,2));
|
|
|
+
|
|
|
+ double dx2 = r->x[j] - prp->x[1];
|
|
|
+ double dy2 = r->y[j] - prp->y[1];
|
|
|
+ d[1] = sqrt(pow(dx2,2) + pow(dy2,2));
|
|
|
+
|
|
|
+ deltad[j] = d[0] - d[1];
|
|
|
+ }
|
|
|
+
|
|
|
+ //解的索引
|
|
|
+ int idx = 0;
|
|
|
+ if(dist > 0){
|
|
|
+ for(int j = 0;j < 2;j++){
|
|
|
+ if(deltad[j] > 0){
|
|
|
+ idx = j;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ for(int j = 0;j < 2;j++){
|
|
|
+ if(deltad[j] < 0){
|
|
|
+ idx = j;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ bool bs = false;
|
|
|
+
|
|
|
+ _coordinate res;
|
|
|
+ if(!bs){
|
|
|
+ res.x = xcross[idx];
|
|
|
+ res.y = ycross[idx];
|
|
|
+ }else{
|
|
|
+ //例如当分站为B1B3,B2B3的情况下
|
|
|
+ double tempx = xcross[idx];
|
|
|
+ double tempy = ycross[idx];
|
|
|
+
|
|
|
+ res.x = (tempx + res.x)/2.0;
|
|
|
+ res.y = (tempy + res.y)/2.0;
|
|
|
+ }
|
|
|
+}
|