#pragma once // event monitor // // created on 2022-11-29 // #include "referer.h" #include #include typedef std::shared_ptr THREAD_PTR; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // event definition ... enum scanner_event { SCANNER_EVENT_NONE = 0, // 1 - IPC SCANNER_EVENT_IPC_DATA_RECEIVED = 1, SCANNER_EVENT_IPC_DATA_SENT, // 2 - image-collector SCANNER_EVENT_COLLECTOR_WORKING = 100, // on_event(, nullptr, 0), the first message after start success // normal image, double feeding image, jammed image, stapled imge, size-check error image ... SCANNER_EVENT_COLLECTOR_IMG_BEGIN, // on_event(, LPPACKIMAGE/*data_size can be ZERO*/, (bool)local_display/*show mesaage to local-liquid-crystal screen*/), start a new image data transferring SCANNER_EVENT_COLLECOTR_GET_BUF, // on_event(, LPREQBUF, len) SCANNER_EVENT_COLLECTOR_IMG_DATA, // on_event(, (uint8_t*)data, bytes of data), image data transfer SCANNER_EVENT_COLLECTOR_IMG_END, // on_event(, LPPACKIMAGE, sizeof(PACKIMAGE)), an image data has been transmitted SCANNER_EVENT_COLLECTOR_PAPER_ON, // on_event(, (bool*)paper_on, (bool)local_display) SCANNER_EVENT_COLLECTOR_COVER_OPENNED, // on_event(, (bool*)openned, (bool)local_display) SCANNER_EVENT_COLLECTOR_SLEEPPING, // on_event(, (bool*)sleepping, (bool)local_display) SCANNER_EVENT_COLLECTOR_ERROR, // on_event(, (char*)err-msg, (bool)local_display), used when unknown fatal error occurs! SCANNER_EVENT_COLLECTOR_STOPPED, // on_event(, (char*)err-msg, (size_t)err-code), the last message after start success // 3 - image-process SCANNER_EVENT_IMAGE_PROC_FINAL_BUF = 200, // on_event(, (void**)buf, (size_t)len), get buffer for store the final image SCANNER_EVENT_IMAGE_PROC_OK, SCANNER_EVENT_IMAGE_PROC_ERR, // 4 - resource SCANNER_EVENT_RESOURCE_LOW_MEM = 300, SCANNER_EVENT_RESOURCE_LOW_DISK, SCANNER_EVENT_RESOURCE_HIGH_CPU, }; typedef struct _req_buf { size_t len; uint8_t* buf; }REQBUF, *LPREQBUF; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // object event_handler // // derived from 'event_handler' if your class will handle some events of drived by events // class event_handler : public refer { protected: event_handler(); virtual ~event_handler(); public: virtual int32_t on_event(int32_t ev, void* data, size_t data_len) = 0; virtual int32_t get_fd(void) = 0; enum { EVENT_READ = 0, EVENT_WRITE, }; }; class parent_holder : public refer { protected: parent_holder(); virtual ~parent_holder(); public: virtual int32_t stop(void) = 0; // stop work and release parent ptr }; // event_monitor to manage an event-driven model, this will trigger EVENT_READ/EVENT_WRITE events to 'handler' // class event_monitor : public refer { protected: std::string desc_; protected: event_monitor(const char* desc); virtual ~event_monitor(); public: virtual int32_t start(int32_t threads = 1) = 0; virtual int32_t stop(void) = 0; virtual int32_t add_fd(event_handler* handler) = 0; virtual int32_t remove_fd(event_handler* handler) = 0; enum { EV_TYPE_POLL = 1, EV_TYPE_EPOLL, }; static event_monitor* create(const char* desc, int32_t type = EV_TYPE_EPOLL); };