Improve the scanning and image saving process
This commit is contained in:
parent
1df41ab602
commit
4d65a65568
|
@ -1465,22 +1465,27 @@ public:
|
||||||
void dump_buf(uint8_t *data, int len)
|
void dump_buf(uint8_t *data, int len)
|
||||||
{
|
{
|
||||||
uint32_t addr = 0;
|
uint32_t addr = 0;
|
||||||
std::string asc("");
|
std::string cont(""), asc("");
|
||||||
|
char buf[20] = { 0 };
|
||||||
for(int i = 0; i < len; ++i)
|
for(int i = 0; i < len; ++i)
|
||||||
{
|
{
|
||||||
if((i % 16) == 0)
|
if((i % 16) == 0)
|
||||||
{
|
{
|
||||||
printf(" %s\n0x%08x ", asc.c_str(), addr);
|
if (cont.length())
|
||||||
|
log_cls::log(LOG_LEVEL_ALL, "%s %s\n", cont.c_str(), asc.c_str());
|
||||||
|
sprintf(buf, "0x%08x ", addr);
|
||||||
addr += 16;
|
addr += 16;
|
||||||
|
cont = buf;
|
||||||
asc = "";
|
asc = "";
|
||||||
}
|
}
|
||||||
else if((i % 8) == 0)
|
else if((i % 8) == 0)
|
||||||
{
|
{
|
||||||
printf(" ");
|
cont += " ";
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t v = data[i];
|
uint8_t v = data[i];
|
||||||
printf("%02X ", v);
|
sprintf(buf, "%02X ", v);
|
||||||
|
cont += buf;
|
||||||
if(v >= 0x20 && v < 0x7f)
|
if(v >= 0x20 && v < 0x7f)
|
||||||
asc.append(1, v);
|
asc.append(1, v);
|
||||||
else
|
else
|
||||||
|
@ -1495,10 +1500,8 @@ void dump_buf(uint8_t *data, int len)
|
||||||
pad.erase((16 - asc.length()) * 3);
|
pad.erase((16 - asc.length()) * 3);
|
||||||
else
|
else
|
||||||
pad = "";
|
pad = "";
|
||||||
printf("%s %s", pad.c_str(), asc.c_str());
|
log_cls::log(LOG_LEVEL_ALL, "%s%s %s\n", cont.c_str(), pad.c_str(), asc.c_str());
|
||||||
}
|
}
|
||||||
printf("\n");
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
dyn_mem_ptr UsbDevice::unhandled_ep0(struct usb_functionfs_event* pev)
|
dyn_mem_ptr UsbDevice::unhandled_ep0(struct usb_functionfs_event* pev)
|
||||||
|
@ -1659,6 +1662,14 @@ dyn_mem_ptr UsbDevice::handle_bulk_cmd(LPPACK_BASE pack, uint32_t* used, packet_
|
||||||
*required = dynamic_cast<packet_data_base_ptr>(reader);
|
*required = dynamic_cast<packet_data_base_ptr>(reader);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
default:
|
||||||
|
log_cls::log(LOG_LEVEL_ALL, "Unhandled Packet with command %d:\n", pack->cmd);
|
||||||
|
dump_buf((uint8_t*)pack, *used);
|
||||||
|
reply = dyn_mem::memory(base_head_size);
|
||||||
|
LPPACK_BASE p = (LPPACK_BASE)reply->ptr();
|
||||||
|
BASE_PACKET_REPLY(*p, pack->cmd + 1, pack->pack_id, EINVAL);
|
||||||
|
reply->set_len(base_head_size);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return reply;
|
return reply;
|
||||||
|
|
Binary file not shown.
|
@ -573,7 +573,7 @@ IMPLEMENT_DYNAMIC(CDlgScanner, CDialogEx)
|
||||||
CDlgScanner::CDlgScanner(CWnd* pParent /*=nullptr*/)
|
CDlgScanner::CDlgScanner(CWnd* pParent /*=nullptr*/)
|
||||||
: CDialogEx(IDD_SCANNER, pParent)
|
: CDialogEx(IDD_SCANNER, pParent)
|
||||||
, scanner_(NULL), auto_tx_file_(-1), auto_tx_(false)
|
, scanner_(NULL), auto_tx_file_(-1), auto_tx_(false)
|
||||||
, setting_ui_(NULL)
|
, setting_ui_(NULL), img_cnt_(0)
|
||||||
{
|
{
|
||||||
g_my_inst = GetModuleHandle(NULL);
|
g_my_inst = GetModuleHandle(NULL);
|
||||||
|
|
||||||
|
@ -627,6 +627,47 @@ void CDlgScanner::set_device(usb::LPUSBPNP pnp)
|
||||||
setting_ui_ = NULL;
|
setting_ui_ = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto progresser = [&](uint64_t total, uint64_t cur, uint32_t err) -> int
|
||||||
|
{
|
||||||
|
if (err)
|
||||||
|
::SetDlgItemTextW(m_hWnd, IDC_EDIT_COUNT, (L"Receive image " + std::to_wstring(img_cnt_) + L" error: " + std::to_wstring(err)).c_str());
|
||||||
|
else if (cur >= total)
|
||||||
|
SetDlgItemInt(IDC_EDIT_COUNT, img_cnt_);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
};
|
||||||
|
auto img_keeper = [&](LPPACKIMAGE img, uint64_t size) -> data_holder_ptr
|
||||||
|
{
|
||||||
|
if (img)
|
||||||
|
{
|
||||||
|
file_saver* saver = new file_saver();
|
||||||
|
std::string root(usb::u2a(img_root_.c_str()));
|
||||||
|
char name[40] = { 0 };
|
||||||
|
|
||||||
|
sprintf_s(name, _countof(name) - 1, "scan_%03x.jpg", ++img_cnt_);
|
||||||
|
if (saver->open((root + name).c_str(), size))
|
||||||
|
{
|
||||||
|
saver->release();
|
||||||
|
saver = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
saver->set_progress_notify(progresser);
|
||||||
|
|
||||||
|
return dynamic_cast<data_holder_ptr>(saver);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// scan stopped ...
|
||||||
|
::SetDlgItemTextW(m_hWnd, IDC_BUTTON_SCAN, L"Scan");
|
||||||
|
|
||||||
|
if (size)
|
||||||
|
::SetDlgItemTextW(m_hWnd, IDC_EDIT_COUNT, (std::to_wstring(img_cnt_) + L" (Error: " + std::to_wstring(size) + L")").c_str());
|
||||||
|
else
|
||||||
|
::SetDlgItemTextW(m_hWnd, IDC_EDIT_COUNT, (std::to_wstring(img_cnt_) + L" (Good)").c_str());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if (pnp)
|
if (pnp)
|
||||||
{
|
{
|
||||||
int err = 0;
|
int err = 0;
|
||||||
|
@ -638,6 +679,7 @@ void CDlgScanner::set_device(usb::LPUSBPNP pnp)
|
||||||
scanner_->release();
|
scanner_->release();
|
||||||
scanner_ = NULL;
|
scanner_ = NULL;
|
||||||
msg_box(m_hWnd, MB_OK, L"Error", L"Open %04X:%04X failed with error %d.", pnp->vid, pnp->pid, err);
|
msg_box(m_hWnd, MB_OK, L"Error", L"Open %04X:%04X failed with error %d.", pnp->vid, pnp->pid, err);
|
||||||
|
enable_buttons(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -651,9 +693,14 @@ void CDlgScanner::set_device(usb::LPUSBPNP pnp)
|
||||||
if (err)
|
if (err)
|
||||||
{
|
{
|
||||||
msg_box(m_hWnd, MB_OK, L"Unsupported Scanner", L"Failed to get protocol version with error %d.", err);
|
msg_box(m_hWnd, MB_OK, L"Unsupported Scanner", L"Failed to get protocol version with error %d.", err);
|
||||||
|
scanner_->release();
|
||||||
|
scanner_ = NULL;
|
||||||
|
enable_buttons(false);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
scanner_->set_image_receiver(img_keeper);
|
||||||
|
|
||||||
swprintf_s(buf, _countof(buf) - 1, L"%u.%u", h, l);
|
swprintf_s(buf, _countof(buf) - 1, L"%u.%u", h, l);
|
||||||
SetDlgItemTextW(IDC_EDIT_PROTOCOL_VER, buf);
|
SetDlgItemTextW(IDC_EDIT_PROTOCOL_VER, buf);
|
||||||
|
|
||||||
|
@ -870,6 +917,26 @@ BOOL CDlgScanner::OnInitDialog()
|
||||||
sane_api_.sane_init_api = &sane::sane_init_api;
|
sane_api_.sane_init_api = &sane::sane_init_api;
|
||||||
sane_api_.sane_exit_api = &sane::sane_exit_api;
|
sane_api_.sane_exit_api = &sane::sane_exit_api;
|
||||||
|
|
||||||
|
wchar_t path[MAX_PATH] = { 0 };
|
||||||
|
std::wstring root(L"");
|
||||||
|
|
||||||
|
GetModuleFileNameW(NULL, path, _countof(path) - 1);
|
||||||
|
wcsrchr(path, L'\\')[1] = 0;
|
||||||
|
root = path;
|
||||||
|
if (GetPrivateProfileStringW(L"config", L"img-path", L"", path, _countof(path) - 1, (root + L"config.txt").c_str()))
|
||||||
|
{
|
||||||
|
img_root_ = path;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
img_root_ = root + L"imgs";
|
||||||
|
}
|
||||||
|
STR_SIMPLIFY_PATH(img_root_);
|
||||||
|
file_util::force_create_folder(img_root_.c_str(), NULL, false);
|
||||||
|
if(img_root_[img_root_.length() - 1] != L'\\')
|
||||||
|
img_root_ += L"\\";
|
||||||
|
::SetDlgItemTextW(m_hWnd, IDC_EDIT_IMG_PATH, img_root_.c_str());
|
||||||
|
|
||||||
return FALSE; // 除非将焦点设置到控件,否则返回 TRUE
|
return FALSE; // 除非将焦点设置到控件,否则返回 TRUE
|
||||||
}
|
}
|
||||||
BOOL CDlgScanner::PreTranslateMessage(MSG* pMsg)
|
BOOL CDlgScanner::PreTranslateMessage(MSG* pMsg)
|
||||||
|
@ -944,10 +1011,61 @@ void CDlgScanner::OnBnClickedButtonResetBulk()
|
||||||
void CDlgScanner::OnBnClickedButtonBrowseSavingPath()
|
void CDlgScanner::OnBnClickedButtonBrowseSavingPath()
|
||||||
{
|
{
|
||||||
// TODO: 在此添加控件通知处理程序代码
|
// TODO: 在此添加控件通知处理程序代码
|
||||||
|
LPITEMIDLIST pidRoot = NULL;
|
||||||
|
BROWSEINFOW bi = { 0 };
|
||||||
|
wchar_t path[MAX_PATH] = { 0 };
|
||||||
|
|
||||||
|
SHGetSpecialFolderLocation(m_hWnd, CSIDL_DRIVES, &pidRoot);
|
||||||
|
bi.hwndOwner = m_hWnd;
|
||||||
|
bi.pidlRoot = pidRoot;
|
||||||
|
bi.lpszTitle = L"Select folder to save scanning images";
|
||||||
|
bi.pszDisplayName = path;
|
||||||
|
bi.ulFlags = BIF_RETURNONLYFSDIRS;
|
||||||
|
pidRoot = SHBrowseForFolderW(&bi);
|
||||||
|
if (pidRoot)
|
||||||
|
{
|
||||||
|
SHGetPathFromIDListW(pidRoot, path);
|
||||||
|
img_root_ = path;
|
||||||
|
img_root_ += L"\\";
|
||||||
|
STR_SIMPLIFY_PATH(img_root_);
|
||||||
|
::SetDlgItemTextW(m_hWnd, IDC_EDIT_IMG_PATH, img_root_.c_str());
|
||||||
|
|
||||||
|
std::wstring root(L"");
|
||||||
|
|
||||||
|
GetModuleFileNameW(NULL, path, _countof(path) - 1);
|
||||||
|
wcsrchr(path, L'\\')[1] = 0;
|
||||||
|
root = path;
|
||||||
|
WritePrivateProfileStringW(L"config", L"img-path", img_root_.c_str(), (root + L"config.txt").c_str());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void CDlgScanner::OnBnClickedButtonScan()
|
void CDlgScanner::OnBnClickedButtonScan()
|
||||||
{
|
{
|
||||||
// TODO: 在此添加控件通知处理程序代码
|
// TODO: 在此添加控件通知处理程序代码
|
||||||
|
wchar_t title[40] = { 0 };
|
||||||
|
|
||||||
|
::GetDlgItemTextW(m_hWnd, IDC_BUTTON_SCAN, title, _countof(title) - 1);
|
||||||
|
if (wcsicmp(title, L"Scan") == 0)
|
||||||
|
{
|
||||||
|
img_cnt_ = 0;
|
||||||
|
SetDlgItemInt(IDC_EDIT_COUNT, img_cnt_);
|
||||||
|
if (scanner_)
|
||||||
|
{
|
||||||
|
int err = scanner_->scan_start();
|
||||||
|
if (err)
|
||||||
|
msg_box(m_hWnd, MB_OK, L"Error", L"Failed in startin scanning with code %d", err);
|
||||||
|
else
|
||||||
|
::SetDlgItemTextW(m_hWnd, IDC_BUTTON_SCAN, L"Stop");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (scanner_)
|
||||||
|
{
|
||||||
|
int err = scanner_->scan_stop();
|
||||||
|
if (err)
|
||||||
|
msg_box(m_hWnd, MB_OK, L"Error", L"Failed to stop scanning with code %d", err);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
void CDlgScanner::OnBnClickedButtonBrowseFile()
|
void CDlgScanner::OnBnClickedButtonBrowseFile()
|
||||||
{
|
{
|
||||||
|
|
|
@ -57,6 +57,8 @@ class CDlgScanner : public CDialogEx
|
||||||
HANDLE auto_wait_;
|
HANDLE auto_wait_;
|
||||||
dlg_setting *setting_ui_;
|
dlg_setting *setting_ui_;
|
||||||
SANEAPI sane_api_;
|
SANEAPI sane_api_;
|
||||||
|
std::wstring img_root_;
|
||||||
|
uint32_t img_cnt_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
CDlgScanner(CWnd* pParent = nullptr); // 标准构造函数
|
CDlgScanner(CWnd* pParent = nullptr); // 标准构造函数
|
||||||
|
|
|
@ -133,7 +133,7 @@ int cmd_result::clean(void)
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// scanner_handler
|
// scanner_handler
|
||||||
scanner_handler::scanner_handler(void) : usb_(nullptr), status_(SCANNER_STATUS_NOT_OPEN)
|
scanner_handler::scanner_handler(void) : usb_(nullptr), status_(SCANNER_STATUS_NOT_OPEN), img_receiver_(std::function<data_holder_ptr(LPPACKIMAGE, uint64_t)>())
|
||||||
{
|
{
|
||||||
auto on_reply = [&](dyn_mem_ptr reply, uint32_t* used, packet_data_base_ptr* more) ->dyn_mem_ptr
|
auto on_reply = [&](dyn_mem_ptr reply, uint32_t* used, packet_data_base_ptr* more) ->dyn_mem_ptr
|
||||||
{
|
{
|
||||||
|
@ -186,6 +186,15 @@ scanner_handler::scanner_handler(void) : usb_(nullptr), status_(SCANNER_STATUS_N
|
||||||
*more = dynamic_cast<packet_data_base_ptr>(receiver);
|
*more = dynamic_cast<packet_data_base_ptr>(receiver);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (pack->cmd == PACK_CMD_SCAN_STOP_ROGER)
|
||||||
|
{
|
||||||
|
data_holder_ptr receiver = img_receiver_(NULL, pack->data);
|
||||||
|
if (receiver)
|
||||||
|
receiver->release();
|
||||||
|
|
||||||
|
*used = sizeof(PACK_BASE);
|
||||||
|
status_ = pack->data;
|
||||||
|
}
|
||||||
else if (pack->cmd == PACK_CMD_STATUS_ROGER)
|
else if (pack->cmd == PACK_CMD_STATUS_ROGER)
|
||||||
{
|
{
|
||||||
*used = sizeof(PACK_BASE);
|
*used = sizeof(PACK_BASE);
|
||||||
|
@ -543,10 +552,12 @@ int scanner_handler::status_get(void)
|
||||||
return status_;
|
return status_;
|
||||||
}
|
}
|
||||||
|
|
||||||
int scanner_handler::scan_start(std::function<data_holder_ptr(LPPACKIMAGE, uint64_t)> img)
|
void scanner_handler::set_image_receiver(std::function<data_holder_ptr(LPPACKIMAGE, uint64_t)> img)
|
||||||
{
|
{
|
||||||
img_receiver_ = img;
|
img_receiver_ = img;
|
||||||
|
}
|
||||||
|
int scanner_handler::scan_start(void)
|
||||||
|
{
|
||||||
auto call = [&](cmd_result* cmd) -> int
|
auto call = [&](cmd_result* cmd) -> int
|
||||||
{
|
{
|
||||||
return usb_->scan_start(cmd->get_id());
|
return usb_->scan_start(cmd->get_id());
|
||||||
|
|
|
@ -110,7 +110,8 @@ public:
|
||||||
int option_value_set(const char* name, uint32_t type, void* buf, uint32_t size/*buffer size of 'buf'*/, uint8_t* after);
|
int option_value_set(const char* name, uint32_t type, void* buf, uint32_t size/*buffer size of 'buf'*/, uint8_t* after);
|
||||||
int status_get(void);
|
int status_get(void);
|
||||||
|
|
||||||
int scan_start(std::function<data_holder_ptr(LPPACKIMAGE, uint64_t)> img);
|
void set_image_receiver(std::function<data_holder_ptr(LPPACKIMAGE/*NULL when scanning stopped*/, uint64_t/*size in image, error in stopped*/)> img);
|
||||||
|
int scan_start(void);
|
||||||
int scan_stop(void);
|
int scan_stop(void);
|
||||||
|
|
||||||
int file_transfer(const char* local_path, const char* remote_path, bool to_device
|
int file_transfer(const char* local_path, const char* remote_path, bool to_device
|
||||||
|
|
Loading…
Reference in New Issue