Browse Source

兼容新协议

lixioayao 5 years ago
parent
commit
f60f2fa5e7
4 changed files with 55 additions and 5 deletions
  1. 1 0
      card_base.h
  2. 40 0
      card_person.cpp
  3. 8 0
      card_person.h
  4. 6 5
      message.cpp

+ 1 - 0
card_base.h

@@ -101,6 +101,7 @@ struct card_location_base:card,std::enable_shared_from_this<card_location_base>
     virtual int get_workline(){return -1;}
 	virtual void get_card(bool f)=0;
 	virtual void site_hover(int sid){}
+    virtual void handle_message(uint16_t ct,uint8_t& value){}
 
     void make_his_location(uint64_t t,const point & pt,bool bclose = false);
     void on_message(zloop<task*> * loop,const message_locinfo&loc,bool is_history);

+ 40 - 0
card_person.cpp

@@ -242,3 +242,43 @@ void person::get_card(bool f)
 		return ;
 	mine_business::inst()->fetch_add(m_display);
 }
+#define CHARGE_MASK     0X03
+#define DISCHARGE_MASK  0X0C
+#define POWER_MASK      0X10
+void person::handle_message(uint16_t ct,uint8_t &value)
+{
+    if(m_card_generation==0){
+        uint8_t remainder=ct%5;
+        if(remainder==4){
+            uint8_t v=value>>4;
+            if(v>0)m_card_generation=2;
+            else m_card_generation=1;
+        }
+        return;
+    }
+    if(m_card_generation==1){
+        value=value&0x03;
+        return;
+    }
+    uint16_t cttmp = ct/5;
+    if(m_ctflag != cttmp){
+        if((m_index&CHARGE_MASK) == CHARGE_MASK) 
+            m_charge_value=(m_value[0]<<8)|m_value[1];
+        if((m_index&DISCHARGE_MASK) == DISCHARGE_MASK)
+            m_discharge_value=(m_value[2]<<8)|m_value[3];
+        if((m_index&POWER_MASK) == POWER_MASK)
+            m_power=m_value[4]>>4;
+        logn_info(1,"card_id:%d,充电时间:%u,放电时间:%u,电量%d%",m_id,m_charge_value,m_discharge_value,m_power*10);
+        m_index=0;m_ctflag=cttmp;memset(&m_value,0,sizeof(m_value));
+    }
+    uint8_t remainder=ct%5;
+    m_value[remainder]=value;
+    m_index|=(1<<remainder);
+    logn_info(1,"card_id:%d,ctflag:%u,index:%d,value:%d,,,,%d",m_id,m_ctflag,remainder,value,m_index);
+    if(remainder==4){
+        value>>=4;
+        if(value>=5)value=0;
+        else if(value >2 && value<5) value=1;
+        else value=2;
+    }
+}

+ 8 - 0
card_person.h

@@ -9,12 +9,19 @@ struct person:card_location_base, card_area
     int m_workLine=0;	
 	int m_worktype_id=0;
     int m_thour{-1};
+    uint16_t m_charge_value{0};
+    uint16_t m_discharge_value{0};
+    uint16_t m_ctflag{0};
+    uint8_t m_power{0};
+    uint8_t m_index{0};
+    uint8_t m_card_generation{0};
     time_t m_iris_recognition_timeval = 0;
     static int m_limit_detained_time;
     static int m_auto_up_mine_time;
     static int m_person_cards_flag;
     std::weak_ptr<monkey_person> m_monkeyPerson;
     std::string m_stafferName,m_deptName;
+    std::array<uint8_t,5> m_value;
     person(const std::string &type,uint32_t cardid,uint16_t needdisplay,int16_t t,int32_t deptid,int32_t level_id,uint32_t cid,int wl,const std::string &sname,const std::string &dname,int workrype_id);
     ~person();
 
@@ -32,6 +39,7 @@ struct person:card_location_base, card_area
     virtual std::shared_ptr<mine_tool> get_mine_tool();
     virtual void do_business(const std::shared_ptr<site>&site,const point &pt,double acc);
 	virtual void set_area_info(int mapid,double scale,int areaid,uint64_t t,int type);
+    virtual void handle_message(uint16_t ct,uint8_t &value);
     virtual std::shared_ptr<area_tool> get_area_tool()
     {
         return m_area_tool;

+ 6 - 5
message.cpp

@@ -4,7 +4,7 @@
 #include "log.h"
 #include "common_tool.h"
 #include "card.h"
-
+//找到一个办法进行兼容
 void message_locinfo::zero_this()
 {
 	m_site_time=
@@ -24,12 +24,10 @@ void message_locinfo::zero_this()
 
 task* message_locinfo::clone(message_locinfo* ml)
 {
-    log_info("clone: enter");
     task* t = task::alloc<message_locinfo>(); 
     message_locinfo& m = t->body<message_locinfo>(); 
     m.zero_this();
    
-    log_info("clone: begin copy");
     m.m_time_stamp = ml->m_time_stamp;
     m.m_site_time = ml->m_site_time;
     m.m_tof = ml->m_tof;
@@ -44,7 +42,6 @@ task* message_locinfo::clone(message_locinfo* ml)
     m.m_ant_id = ml->m_ant_id;
     m.m_sync_ct = ml->m_sync_ct;
     m.m_rssi = ml->m_rssi;
-    log_info("clone: end copy");
 	return std::move(t);
 }
 
@@ -56,7 +53,9 @@ void message_locinfo::load(zistream&is,bool tdoa)
 	//卡类型、卡号、CT、电池状态
 	is>>b>>m_card_id>>m_card_ct>>m_batty_status;
 	m_card_type=b;
-	m_batty_status&=0x3;
+	//m_batty_status&=0x3;
+
+
 
 	is>>b;
 	if(m_card_type==1)
@@ -71,6 +70,8 @@ void message_locinfo::load(zistream&is,bool tdoa)
 	//加速度
 	is>>b;
     const auto &c=card_list::instance()->get(tool_other::type_id_to_u64(m_card_type,m_card_id));
+    if(m_card_type==1 && c)
+        c->handle_message(m_card_ct,m_batty_status);
 	if(m_card_type == 1 ||(c && tool_other::is_coal_or_driving(m_card_type,c->get_vehicle_type_id())))
 		m_acc=b;
 	else