校正数据文件中UTF8字符转WEB-UTF格式;增加清理纸道功能;添加异常类

This commit is contained in:
gb 2024-02-23 15:59:31 +08:00
parent 19e006a132
commit ef6c6a0186
12 changed files with 235 additions and 14 deletions

View File

@ -276,12 +276,23 @@ namespace correct
return std::move(old);
}
int save_correct_data(CORDATA& data, std::vector<int>& fixed_dpi, int init_dpi, bool init_clr)
{
correct::CONDDATA def;
int err = 0;
std::string root(CIS_CORRECT_DATA_PATH), cont("");
std::string root(CIS_CORRECT_DATA_PATH), cont(""),
clr(""), gray("");
gb_json *init = new gb_json();
uint8_t *utf8 = (uint8_t*)WORDS_COLOR_COLOR;
err = utils::utf8_2_web(utf8, clr);
if(err)
clr = WORDS_COLOR_COLOR;
utf8 = (uint8_t*)WORDS_COLOR_GRAY;
err = utils::utf8_2_web(utf8, gray);
if(err)
gray = WORDS_COLOR_GRAY;
for(auto& item: data.data)
{
@ -293,9 +304,9 @@ namespace correct
key += "==";
if(item.clr)
key += WORDS_COLOR_COLOR;
key += clr;
else
key += WORDS_COLOR_GRAY;
key += gray;
key += "&&";
if(fixed_dpi.size())
{
@ -446,11 +457,11 @@ namespace cis
child->get_value("default", def);
if(def)
{
printf("Before: %s\n", child->to_string().c_str());
utils::to_log(LOG_LEVEL_ALL, "Correction-data of '%s' Before: %s\n", v, child->to_string().c_str());
def->attach_text(&data[0]);
def->key() = "default";
def->release();
printf("After: %s\n", child->to_string().c_str());
utils::to_log(LOG_LEVEL_ALL, "Correction-data of '%s' After: %s\n", v, child->to_string().c_str());
}
}
child->release();
@ -474,9 +485,11 @@ namespace cis
child->get_value("default", def);
if(def)
{
utils::to_log(LOG_LEVEL_ALL, "Correction-data of '%s' Before: %s\n", fn.c_str(), child->to_string().c_str());
def->attach_text(&data[0]);
def->key() = "default";
def->release();
utils::to_log(LOG_LEVEL_ALL, "Correction-data of '%s' After: %s\n", fn.c_str(), child->to_string().c_str());
}
}
child->release();

View File

@ -1045,3 +1045,18 @@ bool scanner_hw::is_scanning(void)
{
return scanning_;
}
void scanner_hw::clean_paper_passway(void)
{
if(!motor_.get())
{
auto cb = [this](int ev, unsigned int data) -> void
{
mb_events_.save(std::make_pair(ev, data), true);
};
mb_events_.clear();
motor_.reset(new MotorBoard(cb));
}
motor_->clean_paper_road();
}

View File

@ -127,4 +127,5 @@ public:
int trans_motorboard_err_2_hg_error(int mberr, bool to_ui = false, std::function<void(int)> bef_ui = std::function<void(int)>());
int hg_err_2_image_status(int hgerr);
bool is_scanning(void);
void clean_paper_passway(void);
};

View File

@ -150,7 +150,7 @@ void imgproc_mgr::process(RAWIMG* img)
send_image(*src, false);
if(v->is_enable())
{
v->process(*src, *dst);
process(v, src, dst);
src->clear();
swp = src;
src = dst;
@ -165,7 +165,7 @@ void imgproc_mgr::process(RAWIMG* img)
{
if(v->is_enable())
{
v->process(*src, *dst);
process(v, src, dst);
src->clear();
swp = src;
src = dst;
@ -196,6 +196,25 @@ void imgproc_mgr::process(RAWIMG* img)
ptr->release();
}
}
void imgproc_mgr::process(image_processor* prc, std::vector<PROCIMGINFO>* in, std::vector<PROCIMGINFO>* out)
{
try
{
prc->process(*in, *out);
}
catch(const exception_ex& e)
{
std::string msg(std::string("image process '") + prc->from() + "': " + e.what());
throw(exception_ex(msg.c_str()));
}
catch(const std::exception& e)
{
std::string msg(std::string("image process '") + prc->from() + "': " + e.what());
throw(exception_ex(msg.c_str()));
}
}
void imgproc_mgr::send_image(LPPACKIMAGE head, uint8_t* data, size_t size, void* info, size_t info_l)
{
auto ovr = [&](uint64_t total, uint64_t cur_size, uint32_t err, void* user_data) -> int

View File

@ -51,6 +51,7 @@ class imgproc_mgr : public sane_opt_provider
uint32_t add_busy_worker(int inc = 1);
void thread_worker(void);
void process(RAWIMG* img);
void process(image_processor* prc, std::vector<PROCIMGINFO>* in, std::vector<PROCIMGINFO>* out);
void send_image(LPPACKIMAGE head, uint8_t* data, size_t size, void* info = nullptr, size_t info_l = 0);
void send_image(std::vector<PROCIMGINFO>& imgs, bool clear_after_send);

View File

@ -303,6 +303,10 @@ void async_scanner::init(void)
bool auto_scan = false;
cis_->set_value(SANE_OPT_NAME(WAIT_TO_SCAN), &auto_scan);
}
else if(devui::UI_CMD_CLEAN_PASSWAY == pack->msg)
{
cis_->clean_paper_passway();
}
};
devui::init_ui(uicb, false);

View File

@ -23,6 +23,8 @@ namespace devui
UI_CMD_COUNT_PAPER = 0x10,
UI_CMD_STOP_SCAN,
UI_CMD_CLEAN_PASSWAY = 0x30,
UI_STATUS_SCANNING = 0x1000, // begin scanning. data: (LPSCANSTREAM)
UI_STATUS_PAPER_CNT, // ONE paper has pass through. data: (uint32_t*)milliseconds for paper pass through
UI_STATUS_MESSAGE, // status message, hold screen. data: LPSTATMSG

View File

@ -218,6 +218,7 @@ class log_cls
FILE* file_;
int level_;
int type_;
int max_file_size_ = MAX_LOG_FILE_SIZE;
std::mutex lock_;
static log_cls* inst_;
@ -256,15 +257,16 @@ class log_cls
static void log_file(const char* info, void* param, void* param2)
{
FILE** file = (FILE**)param;
log_cls *cls = (log_cls*)param2;
if (*file == nullptr)
*file = create_log_file(((std::string*)param2)->c_str(), false);
*file = create_log_file(cls->path_file_.c_str(), false);
if (*file)
{
fwrite(info, 1, strlen(info), *file);
fflush(*file);
if (ftell(*file) >= MAX_LOG_FILE_SIZE)
if (ftell(*file) >= cls->max_file_size_)
{
fclose(*file);
remove(((std::string*)param2)->c_str());
@ -344,6 +346,10 @@ public:
{
level_ = level;
}
void set_max_file_size(int size)
{
max_file_size_ = size;
}
int level(void)
{
return level_;
@ -357,7 +363,7 @@ public:
{
std::lock_guard<std::mutex> lock(lock_);
log_(info, &file_, &path_file_);
log_(info, &file_, this);
}
std::string get_log_file_path(const char* dst = nullptr)
{
@ -661,6 +667,74 @@ namespace utils
return ret;
}
int utf8_2_16(uint8_t* &in, uint16_t& ch)
{
static uint8_t lead[] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };
int ret = 0;
if(*in < 0x80)
{
ch = *in++;
}
else if(*in < 0x0E0)
{
ch = *in++;
ch &= ~0x0C0;
if(*in < 0x80)
ret = EINVAL;
else
{
ch <<= 6;
ch |= *in++ & 0x3f;
}
}
else if(*in < 0x0F0)
{
ch = *in++;
ch &= ~0x0E0;
if(*in < 0x80)
ret = EINVAL;
else
{
ch <<= 6;
ch |= *in++ & 0x3f;
if(*in < 0x80)
ret = EINVAL;
else
{
ch <<= 6;
ch |= *in++ & 0x3f;
}
}
}
else
{
ret = EINVAL;
}
return ret;
}
int utf8_2_web(uint8_t* &in, std::string& web)
{
int ret = 0;
while(*in)
{
uint16_t v = 0;
char buf[40] = {0};
ret = utf8_2_16(in, v);
if(ret)
break;
if(v < 0x80)
buf[0] = v;
else
sprintf(buf, "\\u%04X", v);
web += buf;
}
return ret;
}
std::string get_command_result(const char* cmd, int len, int *err)
{
@ -1482,6 +1556,10 @@ namespace utils
return std::move(file);
}
void set_log_file_max_size(int size)
{
log_cls::instance()->set_max_file_size(size);
}
void uninit(void)
{
log_info(("=====================================--Exited--" + std::to_string(GetCurrentProcessId()) + "=====================================\n\n\n\n").c_str(), LOG_LEVEL_FATAL);
@ -1604,6 +1682,26 @@ namespace utils
return std::move(std::string((char*)&bfh, sizeof(bfh)));
}
int save_bitmap(const char* file, int w, int h, int bpp, int dpix, int dpiy, void* bits)
{
int err = 0;
FILE* dst = fopen(file, "wb");
if(dst)
{
std::string bih(bitmap_info_header(w, h, bpp, dpix, dpiy)),
bfh(bitmap_file_header((BITMAPINFOHEADER*)&bih[0]));
fwrite(bfh.c_str(), 1, bfh.length(), dst);
fwrite(bih.c_str(), 1, bih.length(), dst);
fwrite(bits, 1, ((BITMAPINFOHEADER*)&bih[0])->biSizeImage, dst);
fclose(dst);
}
else
err = errno;
return err;
}
#if OS_WIN
bool run_get_message(HWND hwnd, UINT filter_min, UINT filter_max, std::function<bool(MSG*, bool*)> msghandler)
@ -2407,6 +2505,10 @@ void safe_thread::thread_worker(std::function<void(void)> func, std::string name
utils::to_log(LOG_LEVEL_DEBUG, "--- safe_thread of '%s - %p' exited.\n", name.c_str(), GetCurrentThreadId());
return;
}
catch (exception_ex e)
{
utils::to_log(LOG_LEVEL_FATAL, "Exception in thread '%p - %s': %s\n", GetCurrentThreadId(), name.c_str(), e.what());
}
catch (std::exception e)
{
utils::to_log(LOG_LEVEL_FATAL, "Exception in thread '%p - %s': %s\n", GetCurrentThreadId(), name.c_str(), e.what());
@ -2658,3 +2760,24 @@ int safe_file::save(const void* data, uint16_t bytes)
return rename((path_ + tmp_appendix_).c_str(), path_.c_str());
}
////////////////////////////////////////////////////////////////////////////////////////////////
// exception_ex
exception_ex::exception_ex() : what_("exception_ex")
{}
exception_ex::exception_ex(const char* msg) : what_(msg ? msg : "")
{}
exception_ex::exception_ex(const exception_ex& r) : what_(r.what_)
{}
exception_ex::~exception_ex()
{}
const char* exception_ex::what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT
{
return what_.c_str();
}
void exception_ex::set_info(const char* info)
{
what_ = info ? info : "";
}

View File

@ -62,6 +62,18 @@ namespace utils
// ENODATA - need more data
int utf16_2_8(unsigned short* &in, char ch[8]);
// Function: transfere from utf8 to utf16
//
// Parameters: in - [in]: head of utf8 beginning
//
// [out]: beginning of the next character if success or no changes on failure
// ch - to receive the character
//
// Return: 0 - success
// EINVAL - invalid utf8 string
int utf8_2_16(uint8_t* &in, uint16_t& ch);
int utf8_2_web(uint8_t* &in, std::string& web); // convert 'E5 A5 BD' to '\u597D'
std::string get_command_result(const char* cmd, int len = -1, int *err = nullptr);
std::string get_local_data_path(void);
std::string temporary_path(void);
@ -101,6 +113,7 @@ namespace utils
// return logging file path if 'type' was LOG_TYPE_FILE
std::string init_log(log_type type, log_level level = LOG_LEVEL_ALL, const char* fn_appendix = nullptr/*appendix to default log-file-name*/);
void set_log_file_max_size(int size = SIZE_MB(10));
void uninit(void);
void log_info(const char* info, int level = LOG_LEVEL_ALL);
void log_mem_info(const char* desc, const void* data, size_t bytes, int level = LOG_LEVEL_ALL); // log as 0x12345678 00 01 02 ...
@ -116,6 +129,7 @@ namespace utils
// bitmap header ...
std::string bitmap_info_header(int pixel_w, int pixel_h, int bpp, int dpix, int dpiy = 0); // return BITMPINFOHEADER + pallete if need. dpiy same as dpix if was ZERO
std::string bitmap_file_header(BITMAPINFOHEADER *lpbi); // return BITMAPFILEHEADER
int save_bitmap(const char* file, int w, int h, int bpp, int dpix, int dpiy, void* bits);
#if OS_WIN
// Function: pump message recycle (GetMessageW)
@ -536,3 +550,20 @@ public:
std::string load(void);
int save(const void* data, uint16_t bytes);
};
#include <exception>
class exception_ex : public std::exception
{
std::string what_;
public:
exception_ex();
exception_ex(const char* msg);
exception_ex(const exception_ex& r);
~exception_ex();
public:
virtual const char*
what() const _GLIBCXX_TXN_SAFE_DYN _GLIBCXX_USE_NOEXCEPT override;
void set_info(const char* info);
};

View File

@ -753,6 +753,8 @@ void ui_mgr::init(void)
{
auto f = [this](dev_menu* m, int id) -> MENU_CMD_HANDLER_RET
{
devui::send_message(devui::UI_CMD_CLEAN_PASSWAY);
return false;
};
handler_[menu_command::MENU_CMD_ID_CLEAR_PASSWAY] = f;

View File

@ -24,6 +24,16 @@ namespace custom_font
void init_8x8(void)
{
static uint8_t zong[] = {8, 8
, 0x00, 0x60, 0x6E, 0x4B, 0x7A, 0x4B, 0x6E, 0x60
};
font_map8x8_["\346\200\273"] = zong;
static uint8_t maohao[] = {4, 8
, 0x00, 0x50, 0x50, 0x00
};
font_map8x8_["\357\274\232"] = maohao;
static uint8_t colon[] = {3, 8
, 0x00, 0x28, 0x00
};

View File

@ -60,8 +60,8 @@ add_packagedirs("sdk")
add_defines("BUILD_AS_DEVICE")
add_defines("VER_MAIN=2")
add_defines("VER_FAMILY=200")
add_defines("VER_DATE=20240222")
add_defines("VER_BUILD=19")
add_defines("VER_DATE=20240223")
add_defines("VER_BUILD=12")
target("conf")
set_kind("phony")