code_scanner/scanner/main/scanner.cpp

283 lines
5.1 KiB
C++
Raw Normal View History

2022-12-28 02:40:59 +00:00
#include "scanner.h"
2022-12-05 08:03:17 +00:00
#include "../../common/log_util.h"
#include "../../common/ipc_wrapper.h"
2022-12-28 02:40:59 +00:00
#include "../img_collector/img_collector.h"
#include "../img_process/img_process.h"
#include "../res_monitor/res_monitor.h"
2022-12-05 08:03:17 +00:00
2022-12-28 02:40:59 +00:00
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// scanner
scanner::scanner(const char* ipc_id) : img_proc_(nullptr), img_src_(nullptr), res_(nullptr), ipc_(nullptr)
, exit_(nullptr), run_(true), status_(SCANNER_STATUS_READY), ipc_id_(ipc_id)
, partial_msg_("")
2022-12-05 08:03:17 +00:00
{
2022-12-28 02:40:59 +00:00
exit_ = new linux_event("exit-scanner");
}
scanner::~scanner()
{
uninit();
exit_->release();
}
int32_t scanner::init(void)
{
run_ = true;
img_proc_ = new img_processor(dynamic_cast<paremeter_get*>(this), dynamic_cast<event_handler*>(this));
img_src_ = image_collector::create_image_collector(dynamic_cast<event_handler*>(this));
res_ = new res_mon(dynamic_cast<event_handler*>(this));
ipc_ = ipc_wrapper::create_ipc(dynamic_cast<event_handler*>(this), ipc_wrapper::IPC_SHARED_MEM, ipc_id_.c_str());
return ipc_->is_ok() ? 0 : ENOTCONN;
}
int32_t scanner::uninit(void)
{
run_ = false;
if (ipc_)
{
ipc_->stop();
ipc_->release();
}
if (res_)
{
res_->stop();
res_->release();
}
if (img_src_)
{
img_src_->stop();
img_src_->release();
}
if (img_proc_)
{
img_proc_->stop();
img_proc_->release();
}
img_proc_ = nullptr;
img_src_ = nullptr;
res_ = nullptr;
ipc_ = nullptr;
return 0;
}
int32_t scanner::add_ref(void)
{
return event_handler::add_ref();
}
int32_t scanner::release(void)
{
return event_handler::release();
}
int32_t scanner::from_thunk_data(std::string& pack)
{
LPPACK_BASE pk = (LPPACK_BASE)&pack[0];
if (pk->thunk)
{
std::string d("");
LPTHUNKD pthk = (LPTHUNKD)pk->payload;
while (pthk->bytes)
{
d += std::string(pthk->data, pthk->bytes);
pthk = (LPTHUNKD)((char*)pthk + sizeof(THUNKD) + pthk->bytes);
}
pack.erase(sizeof(PACK_BASE));
pack += d;
}
return pack.length();
}
int32_t scanner::dispatch_ipc_message(LPPACK_BASE pack)
{
if (pack->cmd == PACK_CMD_ATTR_HISTORY_COUNT_GET)
{
}
else if (pack->cmd == PACK_CMD_ATTR_ROLLER_COUNT_GET)
{
}
else if (pack->cmd == PACK_CMD_ATTR_ROLLER_COUNT_SET)
{
}
else if (pack->cmd == PACK_CMD_SETTING_GET)
{
}
else if (pack->cmd == PACK_CMD_SETTING_GET_CUR)
{
}
else if (pack->cmd == PACK_CMD_SETTING_SET)
{
}
else if (pack->cmd == PACK_CMD_SETTING_RESTORE)
{
}
else if (pack->cmd == PACK_CMD_STATUS_RESTORE)
{
}
else if (pack->cmd == PACK_CMD_SCAN_START)
{
}
else if (pack->cmd == PACK_CMD_SCAN_STOP)
{
}
else if (pack->cmd == PACK_CMD_SCAN_IMG_SIZE_GET)
{
2022-12-05 08:03:17 +00:00
2022-12-28 02:40:59 +00:00
}
else if (pack->cmd == PACK_CMD_SCAN_IMG_READ)
{
2022-12-05 08:03:17 +00:00
2022-12-28 02:40:59 +00:00
}
else if (pack->cmd == PACK_CMD_SCAN_IMG_POP)
{
2022-12-05 08:03:17 +00:00
2022-12-28 02:40:59 +00:00
}
return 0;
2022-12-05 08:03:17 +00:00
}
2022-12-28 02:40:59 +00:00
int32_t scanner::ipc_message_handler(void)
{
while (run_)
{
std::string msg("");
if (!msg_que_.take(msg, true))
continue;
from_thunk_data(msg);
dispatch_ipc_message((LPPACK_BASE)&msg[0]);
}
2022-12-05 08:03:17 +00:00
2022-12-28 02:40:59 +00:00
return 0;
}
int32_t scanner::on_ipc(void* data, size_t data_len, bool in)
2022-12-05 08:03:17 +00:00
{
2022-12-28 02:40:59 +00:00
int32_t ret = 0;
if (in)
{
partial_msg_ += std::string((char*)data, data_len);
if (partial_msg_.length() >= sizeof(PACK_BASE))
{
LPPACK_BASE pack = (LPPACK_BASE)&partial_msg_[0];
size_t len = sizeof(PACK_BASE) + pack->total_bytes;
if (pack->thunk)
{
LPTHUNKD pthk = (LPTHUNKD)pack->payload;
len = partial_msg_.length() - sizeof(PACK_BASE);
while (len >= sizeof(THUNKD))
{
if (pthk->bytes == 0)
{
pthk++;
len = (char*)pthk - (char*)pack;
std::string msg(&partial_msg_[0], len);
partial_msg_.erase(0, len);
msg_que_.save(msg, true);
break;
}
if (len < pthk->bytes + sizeof(THUNKD))
break;
len -= pthk->bytes + sizeof(THUNKD);
pthk = (LPTHUNKD)(pthk->data + pthk->bytes);
}
}
else
{
if (partial_msg_.length() >= len)
{
msg_que_.save(partial_msg_.substr(0, len), true);
partial_msg_.erase(0, len);
}
}
}
}
else
{
// several parts sent ...
}
return ret;
}
int32_t scanner::on_event(int32_t ev, void* data, size_t data_len)
2022-12-05 08:03:17 +00:00
{
2022-12-28 02:40:59 +00:00
// image-process, image-collector, resource-mgr, ipc_wrapper
int32_t ret = 0;
if (!run_)
return ESHUTDOWN;
switch (ev)
{
case SCANNER_EVENT_COLLECTOR_WORKING:
status_ = SCANNER_STATUS_WORKING;
break;
case SCANNER_EVENT_IPC_DATA_RECEIVED:
on_ipc(data, data_len, true);
break;
case SCANNER_EVENT_IPC_DATA_SENT:
on_ipc(data, data_len, false);
break;
case SCANNER_EVENT_COLLECTOR_COVER_OPENNED:
status_ = SCANNER_STATUS_COVER_OPENNED;
break;
case SCANNER_EVENT_COLLECTOR_PAPER_ON:
break;
case SCANNER_EVENT_COLLECOTR_GET_BUF:
break;
default:
ret = EINVAL;
break;
}
return ret;
}
int32_t scanner::get_fd(void)
{
return -1;
}
parameter* scanner::get_parameter(img_proc_param ipp)
{
return nullptr;
}
int32_t scanner::run(void)
{
int32_t ret = init();
if (ret == 0)
exit_->wait();
uninit();
return ret;
}
int32_t scanner::stop(void)
{
run_ = false;
exit_->trigger();
return 0;
2022-12-05 08:03:17 +00:00
}