2022-12-05 08:03:17 +00:00
# pragma once
// event monitor
//
// created on 2022-11-29
//
# include "referer.h"
# include <thread>
# include <memory>
typedef std : : shared_ptr < std : : thread > THREAD_PTR ;
2022-12-28 02:40:59 +00:00
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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 ;
2022-12-05 08:03:17 +00:00
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 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 :
2022-12-28 02:40:59 +00:00
virtual int32_t on_event ( int32_t ev , void * data , size_t data_len ) = 0 ;
virtual int32_t get_fd ( void ) = 0 ;
2022-12-05 08:03:17 +00:00
enum
{
2022-12-28 02:40:59 +00:00
EVENT_READ = 0 ,
EVENT_WRITE ,
2022-12-05 08:03:17 +00:00
} ;
} ;
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 ) ;
} ;