瀏覽代碼

add big screen

zhuyf 3 年之前
父節點
當前提交
d22f0e1bc8
共有 2 個文件被更改,包括 171 次插入0 次删除
  1. 87 0
      module_service/module_screen.cpp
  2. 84 0
      module_service/module_screen.h

+ 87 - 0
module_service/module_screen.cpp

@@ -0,0 +1,87 @@
+#include <string.h>
+#include "db/db_tool.h"
+#include "module_screen.h"
+#include "log.h"
+#include "common.h"
+#include <chrono>
+
+/*
+ * @brief   更新大屏内显示所需人员id,区域id,部门id,电池电量状态等数据
+ * @param   卡数据
+ * @return  无
+ * @note
+ * @warning
+ * @bug
+ *
+ * */
+void module_screen::do_write(const std::map<uint64_t, sys::_CARD_POS_> card_pos_list)
+{
+    std::string p_stat = "";
+    char item[200] = { 0 };
+    for(auto it : card_pos_list)
+    {
+        memset(item, 0, 200*sizeof(char));
+        // 电量状态0表示正常,1表示电量不足, 
+        snprintf(item, 200, "%d,%d,%d,%d,%d,%d;",it.second.ID, it.second.area_id, it.second.dept_id, (it.second.battery_stat), it.second.biz_stat, it.second.level_id);
+        p_stat += std::string(item);
+    }
+
+    if(p_stat == ""){
+        return;
+    }
+    log_info("[screen] stat info=%s", p_stat.c_str());
+    char sql[4096] = {0};
+    snprintf(sql, 4096, "update rt_screen_msg set person_stat='%s' where id=1;", p_stat.c_str());
+    log_info("[screen] sql=%s", sql);
+    db_tool::PushAsync(sql);
+}
+
+void module_screen::start()
+{
+    m_exited = false;
+    m_thread.reset(new std::thread(std::bind(&module_screen::run, this)));
+    m_thread->detach();
+}
+
+void module_screen::run()
+{
+    while(!m_exited){
+        do_wellhead();
+        std::this_thread::sleep_for(std::chrono::seconds(1));
+    }
+}
+
+/*
+ * @brief       更新井口人员数据
+ * @param       无
+ * @return      无
+ * @note        
+ * @warning     
+ * @bug         
+ *
+ * */
+void module_screen::do_wellhead()
+{
+    std::lock_guard<std::mutex> lg(m_mtx);
+
+    if(m_card_list.size() <= 0){
+        return;
+    }
+
+    std::string sid = "";
+    char buf[12] = {0};
+    for(auto it = m_card_list.begin(); it != m_card_list.end();){
+        if(time(NULL) - it->second.m_recv_time < 120){
+            snprintf(buf, 12, "%ld,%d;", it->first, it->second.m_battery);
+            sid += std::string(buf);
+            it++;
+        }else{
+            m_card_list.erase(it++);
+        }
+    }
+
+    char sql[4096] = {0};
+    snprintf(sql, 4096, "update rt_screen_msg set wellhead_stat='%s' where id=1;", sid.c_str());
+    log_info("[screen] sql=%s", sql);
+    db_tool::PushAsync(sql);
+}

+ 84 - 0
module_service/module_screen.h

@@ -0,0 +1,84 @@
+/*
+ * @file
+ *      module_screen.h
+ *
+ * @brief
+ *      大屏业务
+ * @version
+ *      V1.0
+ * @author
+ *      zhuyf
+ * @date
+ *      2021/05/18
+ * @note
+ *
+ * @warning
+ * @bug
+ * @copyright
+ * */
+#ifndef module_screen_hpp
+#define module_screen_hpp
+
+#include <map>
+#include <mutex>
+#include <thread>
+#include <memory>
+#include "module_singleton_base.h"
+#include "websocket/ws_common.h"
+
+struct mine_person{
+    uint32_t m_id;          // card id
+    int m_battery;          // value
+    uint64_t m_recv_time;   //
+
+    mine_person()
+        : m_id(0)
+        , m_battery(0)
+        , m_recv_time(0)
+    {}
+
+    mine_person(uint32_t id, int battery)
+        : m_id(id)
+        , m_battery(battery)
+        , m_recv_time(time(NULL))
+    {}
+};
+
+class module_screen: public singleton_base<module_screen>
+{
+    private:
+        friend class singleton_base<module_screen>;
+        module_screen(){}
+
+    public:
+        void do_write(const std::map<uint64_t, sys::_CARD_POS_> card_pos_list);
+        void do_wellhead();
+
+        void put(const mine_person& p)
+        {
+            std::lock_guard<std::mutex> lg(m_mtx);
+            auto it = m_card_list.find(p.m_id);
+            if(it == m_card_list.end()){
+                m_card_list.insert(std::make_pair(p.m_id, p));
+            }else{
+                m_card_list[p.m_id].m_recv_time = time(NULL);
+                m_card_list[p.m_id].m_battery = p.m_battery;
+            }
+        }
+
+        void start();
+        void run();
+        void stop()
+        {
+            m_exited = true;
+        }
+
+        private:
+        std::unique_ptr<std::thread> m_thread;
+        std::mutex m_mtx;
+        std::map<uint64_t, mine_person> m_card_list;
+
+        bool m_exited = false;
+};
+
+#endif