1
0
Ver Fonte

添加新协议解析

lixioayao há 5 anos atrás
pai
commit
7285afb20e
4 ficheiros alterados com 53 adições e 2 exclusões
  1. 1 0
      card_base.h
  2. 40 0
      card_person.cpp
  3. 8 0
      card_person.h
  4. 4 2
      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;

+ 4 - 2
message.cpp

@@ -4,7 +4,7 @@
 #include "log.h"
 #include "common_tool.h"
 #include "card.h"
-
+//找到一个办法进行兼容
 void message_locinfo::zero_this()
 {
 	m_site_time=
@@ -57,7 +57,7 @@ void message_locinfo::load(zistream&is,bool tdoa)
 	m_card_id &= 0xFFFF; //卡号不会大于65535,分站上传数据的bug
 
 	m_card_type=b;
-	m_batty_status&=0x03;
+	//m_batty_status&=0x03;
 
 	is>>b;
 	if(m_card_type==1)
@@ -72,6 +72,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