Selaa lähdekoodia

add cali time and save card battery power

zhuyf 3 vuotta sitten
vanhempi
commit
4689585eea
11 muutettua tiedostoa jossa 130 lisäystä ja 82 poistoa
  1. 10 8
      Makefile.am
  2. 3 3
      area.cpp
  3. 6 2
      card.cpp
  4. 8 0
      card_person.cpp
  5. 0 1
      db/db_api/CDBCommon.h
  6. 1 1
      message.cpp
  7. 1 1
      module_service/module_screen.cpp
  8. 89 60
      net-service.cpp
  9. 4 2
      net-service.h
  10. 4 3
      protocol.h
  11. 4 1
      worker.cpp

+ 10 - 8
Makefile.am

@@ -1,7 +1,7 @@
 
 SUBDIRS=db websocket
 
-bin_PROGRAMS=yals 
+bin_PROGRAMS=3xls 
 noinst_PROGRAMS=client async test 
 
 SRC_MONKEYCAR= monkey_car/monkeycar_area.cpp monkey_car/monkeycar_bus.cpp monkey_car/monkeycar_person.cpp
@@ -12,9 +12,11 @@ SRC_MODULE_SERVICE= module_service/area_business_car_attendance.cpp module_servi
 					module_service/area_business_person_attendance.cpp module_service/area_business_person_dwell_checker.cpp \
 					module_service/area_business_post_area.cpp module_service/area_business_speed_checker.cpp \
 					module_service/area_business_work_rate.cpp \
-					module_service/module_meta_date_changed.cpp module_service/module_web.cpp \
+					module_service/module_meta_data_changed.cpp module_service/module_web.cpp \
 					module_service/module_call.cpp module_service/module_call_help.cpp module_service/module_mgr.cpp \
-					module_service/module_other_alarm.cpp 
+					module_service/module_other_alarm.cpp \
+					module_service/module_traffic_light.cpp module_service/module_traffic_light_manager.cpp \
+					module_service/module_traffic_light_rule.cpp module_service/module_screen.cpp
 
 SRC_SYNCTIME_MODULE= sync_time/sync_helper.cpp sync_time/sync_manager.cpp
 
@@ -22,7 +24,7 @@ SRC_MAIN= ant.cpp area.cpp base64.cpp bindmorecard.cpp mine_business.cpp card_ar
     	  card.cpp  cardMgr.cpp card_path.cpp card_person.cpp crc.cpp geo_hash.cpp \
 		  landmark.cpp line_fit.cpp  message.cpp message_file.cpp mine.cpp \
 		  net-service.cpp point.cpp  special_area.cpp tdoa_sync.cpp visit.cpp \
-		  web-client.cpp worker.cpp event.cpp znet.cpp ya_setting.cpp area_business.cpp\
+		  web-client.cpp worker.cpp event.cpp znet.cpp sys_setting.cpp area_business.cpp\
 		  forbid_staff_down_mine.cpp bulletin_broad_show.cpp area_persons_thre_time.cpp \
 		  service_position.cpp
 
@@ -32,11 +34,11 @@ AM_CPPFLAGS=-Wall -pthread -m64 -g -std=c++11 -I${prefix}/include -I/usr/local/i
 
 AM_LDFLAGS=-Wall -pthread -m64 -g -std=c++11  -L${prefix}/lib  -L/usr/local/lib
 
-yals_SOURCES=${AM_SOURCES} main.cpp
-yals_CPPFLAGS=${AM_CPPFLAGS}
-yals_LDFLAGS=${AM_LDFLAGS}  -lev -lzlog -lrt -lboost_chrono -lboost_system -lboost_thread -lmysqlclient -lthree_rates
+3xls_SOURCES=${AM_SOURCES} main.cpp
+3xls_CPPFLAGS=${AM_CPPFLAGS}
+3xls_LDFLAGS=${AM_LDFLAGS}  -lev -lzlog -lrt -lboost_chrono -lboost_system -lboost_thread -lmysqlclient -lthree_rates
 
-yals_LDADD=db/libyadb.a websocket/libwebsocket.a ${prefix}/lib/libpoint_algorithm.a
+3xls_LDADD=db/libyadb.a websocket/libwebsocket.a ${prefix}/lib/libpoint_algorithm.a
 
 async_SOURCES=async.cpp
 async_CPPFLAGS=${AM_CPPFLAGS}

+ 3 - 3
area.cpp

@@ -784,10 +784,10 @@ void area_tool::on_point(const std::shared_ptr<card_location_base>& c,const poin
 		 {
 			 char sql[1024] = {0};
 			 std::string _time=tool_time::to_str_ex(c->time_());
-			 snprintf(sql, 1024, "REPLACE INTO rt_location (card_id, site_id,cur_time, x, y, z, state, area_info) VALUES (%s, %d,'%s',%lf, %lf, %lf, 0, '%s');",
-			 tool_other::type_id_to_str(c->m_type, c->m_id).c_str(), m_site->id(),_time.c_str(), pt.x, pt.y, pt.z, strAreaInfo.c_str());
+			 snprintf(sql, 1024, "REPLACE INTO rt_location (card_id, site_id,cur_time, x, y, z, state, power_status, area_info) VALUES (%s, %d,'%s',%lf, %lf, %lf, 0, '%d', '%s');",
+			 tool_other::type_id_to_str(c->m_type, c->m_id).c_str(), m_site->id(),_time.c_str(), pt.x, pt.y, pt.z, c->m_battery_value, strAreaInfo.c_str());
 			 db_tool::PushAsync(sql);
-			 log_info("insert rt_location: card=%d site_id=%d,point=%.2f-%.2f,area_info=%s", c->m_id, m_site->id(), pt.x, pt.y, strAreaInfo.c_str());
+			 log_info("insert rt_location: card=%d site_id=%d,point=%.2f-%.2f, power_status=%d, area_info=%s", c->m_id, m_site->id(), pt.x, pt.y, c->m_battery_value, strAreaInfo.c_str());
 		 }
     }
 }

+ 6 - 2
card.cpp

@@ -250,7 +250,7 @@ void card_list::load_his_card_postion_staff()
 {
     std::string init_limit_hour = config.get("service.init_limit_hour","48");
 
-    std::string sql = "select l.card_id,l.site_id, l.cur_time, l.x, l.y, l.z, l.area_info, l.state, \
+    std::string sql = "select l.card_id,l.site_id, l.cur_time, l.x, l.y, l.z, l.area_info, l.state, l.power_status,\
             att.start_time, att.end_time \
             from rt_location l, rt_att_staff att, dat_card c, dat_staff_extend s \
             where l.card_id = c.card_id and l.card_id = att.card_id and l.card_id=s.card_id\
@@ -305,6 +305,9 @@ void card_list::load_his_card_postion_staff()
             int state  = 0;
             DBRes.GetField( "state",state, Error );
 
+			int power_status = 0;
+			DBRes.GetField("power_status", power_status, Error);
+
             double speed = 0;
             DBRes.GetField( "speed",speed, Error );
 
@@ -316,11 +319,12 @@ void card_list::load_his_card_postion_staff()
             
             card_ptr->set(x,y,z);
             card_ptr->m_time = tool_time::to_time(cur_time)*1000;
+			card_ptr->m_battery_value = power_status;
 
             auto mine_tool_ptr = card_ptr->get_mine_tool();
             mine_tool_ptr->m_attendance_start_time = tool_time::to_time_ex(start_time);
             mine_tool_ptr->m_is_attendance = true;
-            log_info("[person_att] person加载考勤,考勤开始时间:%s,[%s]cur_time:%s 卡id=%s 考勤状态:%d, areainfo=%s",start_time.c_str(),tool_time::to_str(mine_tool_ptr->m_attendance_start_time).c_str(),cur_time.c_str(), card_id.c_str(), (mine_tool_ptr->m_is_attendance?1:0),strAreaInfo.c_str());
+            log_info("[person_att] person加载考勤,考勤开始时间:%s,[%s]cur_time:%s 卡id=%s 考勤状态:%d, power_status: %d, areainfo=%s",start_time.c_str(),tool_time::to_str(mine_tool_ptr->m_attendance_start_time).c_str(),cur_time.c_str(), card_id.c_str(), (mine_tool_ptr->m_is_attendance?1:0), power_status, strAreaInfo.c_str());
 
             //分站设置
             auto area_tool=card_ptr->get_area_tool();

+ 8 - 0
card_person.cpp

@@ -329,6 +329,14 @@ void person::get_card(bool f)
 #define POWER_MASK      0X10
 void person::handle_message(uint16_t ct,uint8_t &value)
 {
+	char nsql[128]={0};
+    const char*sql="insert into his_card_batlog (card_id,time,percent) values (%d,'%s',%d);";
+    snprintf(nsql, 128, sql, m_id, tool_time::now_to_str().c_str(), value*10);
+    sDBConnPool.PushAsync(nsql);
+    logn_info(2,"%s",nsql);
+	return;
+
+
     //判断是新卡还是老卡
     if(m_card_generation==0){
         uint8_t remainder=ct%5;

+ 0 - 1
db/db_api/CDBCommon.h

@@ -6,7 +6,6 @@
 V 1.0.0
 
 * @author
-王益俊
 
 * @date
 创建时间:  2018-04-19\n

+ 1 - 1
message.cpp

@@ -343,7 +343,7 @@ void message_pdoa_locinfo::load(zistream& is)
     m_card_type = b&0x0F;
     //m_batty_status = (b>>4)&0xFF;
 
-    // 1字节
+    // 电量,1字节
     is>>b;
     m_batty_status = b;
 

+ 1 - 1
module_service/module_screen.cpp

@@ -52,7 +52,7 @@ void module_screen::run()
 }
 
 /*
- * @brief       更新井口人员数据
+ * @brief       更新井口人员数据,并更新电量低人员:小于等于30%
  * @param       无
  * @return      无
  * @note        

+ 89 - 60
net-service.cpp

@@ -57,14 +57,14 @@ static bool check_message_time(const std::shared_ptr<client> &clt, const std::sh
 
 	time_t site_time=mktime(p_site_tm);
 	double diff=difftime(site_time, site_ptr->last_site_time());
-	if(diff<-3) //允许2秒的时间抖动
+	if(diff<-6) //允许2秒的时间抖动  3
 	{
 		logn_error(1,"分站时间回退,数据将被丢弃:net=%s,site=%d,diff=%d",clt->name().c_str(),site_ptr->m_id,(int)diff);
 		result=false;
 	}
 
 	diff=difftime(site_time, time(nullptr));
-	if(fabs(diff)>3) 
+	if(fabs(diff)>6) //3
 	{
 		logn_error(1,"分站时间与服务器时间相差太大:%s,site=%d,diff=%d",clt->name().c_str(),site_ptr->m_id,(int)diff);
 		result=false;
@@ -212,11 +212,9 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
                     if(!site_ptr){
                         logn_error(1,"在全局分站列表中找不到分站:%d", site_id);
                         break;
-                    }else{
-                        //logn_info(3, "[pdoa] site_id:%d, x:%.4f, y:%.4f", site_ptr->m_id, site_ptr->x, site_ptr->y);
-                    }
+                    }                    
                     
-                    if(clt->type() != 2){
+					if(clt->type() != 2){
 					    site_ptr->set_client(clt);
 					    //site_ptr->on_power_status((power&1)==0);
                     }
@@ -250,39 +248,18 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
                     }
                 }
                 break;
-			case 0x783A://tof 分站时间同步
+			case CHAR_NET_CALI_TIME://tof 分站时间同步
 				{
-					//  从第一个字节开始,分别表示毫秒(2字节)、秒、分、时、天、月、年
-					unsigned char buf[20]={0,13,0x78,0x3b};
-
-					struct timeval tv;
-					gettimeofday(&tv,0);
-
-					struct tm buff={0};
-					const struct tm*t=localtime_r(&tv.tv_sec,&buff);
-
-					int p=4;
-					buf[p++]=(tv.tv_usec/1000)&0xFF;
-					buf[p++]=((tv.tv_usec/1000)>>8)&0xFF;
-
-					buf[p++]=t->tm_sec;
-					buf[p++]=t->tm_min;
-					buf[p++]=t->tm_hour;
-					buf[p++]=t->tm_mday;
-					buf[p++]=t->tm_wday;
-					buf[p++]=t->tm_mon+1;
-					buf[p++]=t->tm_year-100;
-
-					uint16_t ccrc=do_crc(buf+2,11);
-
-					buf[p++]=ccrc>>8;
-					buf[p++]=ccrc&0xff;
-
-					std::vector<char> tmp((char*)buf,(char*)buf+15);
-					clt->send(std::move(tmp));
-
-					logn_info(1,"分站时间同步:ip=%s,time=%d-%02d-%02d %02d:%02d:%02d.%03d",
-									clt->name().c_str(),buf[12]+2000,buf[11],buf[9],buf[8],buf[7],buf[6],buf[5]*256+buf[4]);
+					// 网络设备校时
+					net_cali_time(clt);
+				}
+				break;
+			case CHAR_CAN_CALI_TIME:
+				{
+					// can设备校时
+					uint32_t rid=0;
+					is>>rid;
+					can_cali_time(clt, rid);
 				}
 				break;
 			case CHAR_LOCATEDATA_TDOA_EXTEND:       // 0x863b
@@ -328,8 +305,9 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
                 break;
 
             case CHAR_READER_HEART:
-                {
-                    uint32_t id = 0;
+                { 
+					//通信基站心跳    
+					uint32_t id = 0;
                     uint16_t site_ct = 0;
                     uint16_t reserve = 0;
                     is>>id>>site_ct>>reserve;
@@ -339,6 +317,8 @@ void net_service::on_message(const std::shared_ptr<client> &clt,const char*data,
                         logn_error(1,"在全局分站列表中找不到分站:%d", id);
                         break;
                     }
+
+					site_ptr->m_device_type_id = 0x08;
                 }
                 break;
             case 0x793B: //虚拟推送的心跳测试
@@ -494,7 +474,9 @@ int32_t net_service::parse_data_anchor_opt(const std::shared_ptr<client>& clt, z
         return -1;
     }*/
 
-    //check_message_time(clt, site_ptr, &site_tm, site_ct, power);
+    if(!check_message_time(clt, site_ptr, &site_tm, site_ct, power)){
+		return -1;
+	}
 
     site_ptr->m_device_type_id = (power>>3)&0x07;
 
@@ -503,36 +485,83 @@ int32_t net_service::parse_data_anchor_opt(const std::shared_ptr<client>& clt, z
         site_ptr->on_power_status((power&1)==0);
     }
 
-    logn_info(1,"分站数据:site_id: %d, site_ct: %d, time: %s, power: %d", site_id, site_ct, tool_time::to_str_ex(&site_tm).c_str(), power);
+	uint64_t tt = site_time_stamp;
+    tt *= 1000;
+    logn_info(1,"分站数据:site_id: %d, site_ct: %d, time_t: %llu, time: %s, power: %d", site_id, site_ct, tt, tool_time::to_str_ex(tt).c_str(), power);
 
     return site_id;
 }
 
+void net_service::net_cali_time(const std::shared_ptr<client>& clt)
+{
+	// 从第一个字节开始,分别表示毫秒(2字节)、秒、分、时、天、月、年
+	unsigned char buf[20]={0,13,0x78,0x3b};
 
+	struct timeval tv;
+	gettimeofday(&tv,0);
+
+	struct tm buff={0};
+	const struct tm*t=localtime_r(&tv.tv_sec,&buff);
+
+	int p=4;
+	buf[p++]=(tv.tv_usec/1000)&0xFF;
+	buf[p++]=((tv.tv_usec/1000)>>8)&0xFF;
+
+	buf[p++]=t->tm_sec+1;	// 由于硬件扫描方式会慢1秒,给补偿1秒
+	buf[p++]=t->tm_min;
+	buf[p++]=t->tm_hour;
+	buf[p++]=t->tm_mday;
+	buf[p++]=t->tm_wday;
+	buf[p++]=t->tm_mon+1;
+	buf[p++]=t->tm_year%100;
+
+	uint16_t ccrc=do_crc(buf+2,11);
+
+	buf[p++]=ccrc>>8;
+	buf[p++]=ccrc&0xff;
+
+	std::vector<char> tmp((char*)buf,(char*)buf+15);
+	clt->send(std::move(tmp));
+
+	logn_info(1,"分站时间同步:ip=%s,time=%d-%02d-%02d %02d:%02d:%02d.%03d",
+			clt->name().c_str(),buf[12]+2000,buf[11],buf[9],buf[8],buf[7],buf[6],buf[5]*256+buf[4]);
 
-void net_service::parse_data_card()
-{
 }
 
-/*float net_service::get_pdoa(float poa[], const double& offset)
+void net_service::can_cali_time(const std::shared_ptr<client>& clt, const int& reader_id)
 {
-    if(poa == nullptr){
-        return -10.0;
-    }
+	unsigned char buf[30]={0,17,0x78,0x4b};
 
-    float poa1 = poa[0];
-    float poa2 = poa[1];
+	struct timeval tv;
+	gettimeofday(&tv,0);
 
-    float pdoa = poa2 - poa1 - offset;
-    while(pdoa >= TPI){
-        pdoa -= TPI;
-    }
+	struct tm buff = {0};
+	const struct tm *t = localtime_r(&tv.tv_sec,&buff);
 
-    while(pdoa < 0){
-        pdoa += TPI;
-    }
+	int p=4;
+	for(int i = sizeof(uint32_t) - 1; i >= 0; --i)
+	{
+		buf[p++] = ((reader_id>>(i*8))&0xFF);
+	}
+	buf[p++]=(tv.tv_usec/1000)&0xFF;
+	buf[p++]=((tv.tv_usec/1000)>>8)&0xFF;
 
-    pdoa -= PI;
+	buf[p++]=t->tm_sec;
+	buf[p++]=t->tm_min;
+	buf[p++]=t->tm_hour;
+	buf[p++]=t->tm_mday;
+	buf[p++]=t->tm_wday;
+	buf[p++]=t->tm_mon+1;
+	buf[p++]=t->tm_year%100;
 
-    return pdoa;
-}*/
+	uint16_t ccrc=do_crc(buf+2,15);
+
+	buf[p++]=ccrc>>8;
+	buf[p++]=ccrc&0xff;
+
+	std::vector<char> tmp((char*)buf,(char*)buf+19);
+	clt->send(std::move(tmp));
+
+	logn_info(1,"分站时间同步:site_id=%d, ip=%s, p=%d, time=%d-%02d-%02d %02d:%02d:%02d.%03d",
+			reader_id, clt->name().c_str(), p, buf[16]+2000, buf[15], buf[13], buf[12], buf[11], buf[10], buf[9]*256+buf[8]);
+}

+ 4 - 2
net-service.h

@@ -33,8 +33,10 @@ struct net_service:service_callback
 
     int32_t parse_data_anchor(const std::shared_ptr<client>& clt, zistream& s);
     int32_t parse_data_anchor_opt(const std::shared_ptr<client>& clt, zistream& s);
-    void parse_data_card();
-    //float get_pdoa(float poa[], const double& offset);
+	// 网络校时
+	void net_cali_time(const std::shared_ptr<client>& clt);
+	// can校时
+	void can_cali_time(const std::shared_ptr<client>& clt, const int& reader_id);
 };
 
 #endif

+ 4 - 3
protocol.h

@@ -30,11 +30,12 @@
 #define CHAR_LIGHT_HEART                    0x5a1a  // 红绿灯心跳指令
 #define CHAR_LIGHT_SETUP                    0x77a4  // 设置红绿灯参数信息
 
-// 5.other
+// 5.system
 #define CHAR_CTRL_READER_CMD                0x804c	// 向分站发送控制指令,控制分站向上位机发送数据
 #define CHAR_VIRTUAL_DATA_PUSH_CMD          0x699a	// 虚拟数据推送
-#define CHAR_SYNC_TIME                      0x783a  // 分站校时
-#define CHAR_READER_HEART                          0x793a  // 无线通信基站心跳
+#define CHAR_NET_CALI_TIME                  0x783b  // 网络设备校时,网络设备请求校时,上位机下发校时命令字
+#define CHAR_CAN_CALI_TIME					0x784b	// CAN设备校时,CAN设备请求校时,上位机下发校时命令
+#define CHAR_READER_HEART                   0x793a  // 无线通信基站心跳
 // 6.third party
 #define THIRD_PARTY_CHAR_LIGHT_REQ_STATE    0x95a0  // 第三方红绿灯请求状态指令,由红绿灯->采集
 #define THIRD_PARTY_CHAR_LIGHT_HEART        0x95a1  // 第三方红绿灯心跳指令,由红绿灯->采集

+ 4 - 1
worker.cpp

@@ -226,7 +226,10 @@ struct worker_thread: loop_thread ,visitor<std::shared_ptr<card_location_base>>
 				//site_message::on_sync(this,t.m_param1);
 				t.destroy();
 			break;
-
+			case CHAR_NET_CALI_TIME:
+			case CHAR_CAN_CALI_TIME:
+				log_info("site_cali_time: 0x%04X", t.m_cmd_code);
+			break;
 			case 0x804c://ctrl site message
 				log_info("ctrl site message%04X",t.m_cmd_code);
 				t.destroy();