/*
 * @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