按业务命令对USB操作加锁

This commit is contained in:
gb 2023-05-24 10:11:56 +08:00
parent 1430cbb8be
commit df805cc81c
2 changed files with 241 additions and 161 deletions

View File

@ -156,8 +156,10 @@ void hg_scanner_200::thread_handle_usb_read(void)
std::string msg;
int count = usb.u32_Count;
msg.resize(count);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(&msg[0], &count);
}
if (ret == SCANNER_ERR_OK)
notify_ui_working_status(msg.c_str(), SANE_EVENT_STATUS, status_);
else
@ -173,7 +175,10 @@ void hg_scanner_200::thread_handle_usb_read(void)
std::string msg;
int count = usb.u32_Count;
msg.resize(count);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(&msg[0], &count);
}
if (ret == SCANNER_ERR_OK)
{
status_ = ret = SCANNER_ERR_DEVICE_AUTO_FAIL_INFO;
@ -321,8 +326,6 @@ int hg_scanner_200::stop(void)
}
int hg_scanner_200::writeusb(USBCB &usb)
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = SCANNER_ERR_OK;
int len = sizeof(usb);
@ -336,8 +339,6 @@ int hg_scanner_200::writeusb(USBCB &usb)
}
int hg_scanner_200::readusb(USBCB &usb)
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = SCANNER_ERR_OK;
int len = sizeof(USBCB);
@ -351,6 +352,8 @@ int hg_scanner_200::readusb(USBCB &usb)
}
int hg_scanner_200::pop_image()
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = SCANNER_ERR_OK;
USBCB usbcb = { setting3288dsp::POP_IMAGE, 0, 0 };
@ -360,6 +363,8 @@ int hg_scanner_200::pop_image()
}
int hg_scanner_200::get_scanner_status(USBCB &usb)
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = SCANNER_ERR_OK;
usb = { setting3288dsp::GET_DSP_STATUS, 0, 0 };
@ -393,6 +398,9 @@ int hg_scanner_200::get_img_data(unsigned int bytes, SANE_Image_Statu statu)
USBCB usb{ setting3288dsp::GET_IMAGE, 0, total };
imagedata->set_image_statu(statu);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(usb);
if (ret != SCANNER_ERR_OK)
{
@ -425,6 +433,7 @@ int hg_scanner_200::get_img_data(unsigned int bytes, SANE_Image_Statu statu)
index += block;
total -= block;
}
}
if (ret == SCANNER_ERR_OK)
{
ret = save_usb_data(imagedata);
@ -453,9 +462,13 @@ int hg_scanner_200::writedown_device_configuration(bool type,setting_hardware::H
d->params_dsp.color = 1;
}
{
std::lock_guard<std::mutex> lock(io_lock_);
USBCB usbcb = { setting3288dsp::CONFIGURED_DATA, d->value, 0 };
len = sizeof(USBCB);
ret = io_->write_bulk(&usbcb,&len);
ret = io_->write_bulk(&usbcb, &len);
}
VLOG_MINI_1(LOG_LEVEL_WARNING, "writedown_device_configuration is .(%s)\n", hg_scanner_err_name(ret));
@ -710,12 +723,14 @@ std::string hg_scanner_200::get_firmware_version()
len = 8; //协议定义长度为8 300 400 =10
USBCB cmd = { setting3288dsp::GET_FW_VERSION, len, 0 };
ret = writeusb(cmd);
if(ret == SCANNER_ERR_OK)
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(cmd);
if (ret == SCANNER_ERR_OK)
{
ret = io_->read_bulk(buf, &len);
}
}
return buf;
}
@ -726,12 +741,14 @@ std::string hg_scanner_200::get_serial_num()
len = 12; //协议定义长度为8 300 400 =10
USBCB cmd = { setting3288dsp::GET_SERIAL, len, 0 };
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(cmd);
if (ret == SCANNER_ERR_OK)
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(buf, &len);
}
}
return buf;
}
@ -758,12 +775,14 @@ int hg_scanner_200::set_serial_num(string str)
}
int hg_scanner_200::set_vid_pid(int data)
{
std::lock_guard<std::mutex> lock(io_lock_);
USBCB usbcb = { setting3288dsp::SET_USB_INFOR_VIDPID,0,0 };
int len = sizeof(usbcb);
return io_->write_bulk(&usbcb, &len);
}
int hg_scanner_200::get_vid_pid(int& data)
{
std::lock_guard<std::mutex> lock(io_lock_);
USBCB usbcb = { setting3288dsp::GET_USB_INFOR_VIDPID,0,0 };
int ret = SCANNER_ERR_OK,
len = sizeof(usbcb);
@ -809,13 +828,16 @@ int hg_scanner_200::get_sleep_time(int& data )
len = 0;
USBCB usbcb = { setting3288dsp::GET_SLEEP_TIME, 0, 0 };
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(usbcb);
if (ret != SCANNER_ERR_OK)
{
return ret;
}
len = sizeof(usbcb);
ret = io_->read_bulk(&usbcb,&len);
ret = io_->read_bulk(&usbcb, &len);
}
printf("usbcb.u32_Data = %d\r\n",usbcb.u32_Data);
if (ret == SCANNER_ERR_OK)
{
@ -825,6 +847,7 @@ int hg_scanner_200::get_sleep_time(int& data )
}
int hg_scanner_200::set_sleep_time(int data)
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = SCANNER_ERR_OK;
USBCB usbcb = { setting3288dsp::SET_SLEEP_TIME,data, 0 };
@ -839,15 +862,17 @@ int hg_scanner_200::get_scanner_paperon(SANE_Bool& type)
len = 0;
USBCB usbcb = { setting3288dsp::GET_PAPERFEEDER_STATUS, 0, 0 };
{
std::lock_guard<std::mutex> lock(io_lock_);
len = sizeof(USBCB);
ret = writeusb(usbcb);
if (ret == SCANNER_ERR_OK)
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(&usbcb, &len);
type = usbcb.u32_Data == 0 ? false : true;
}
}
//if (usbcb.u32_Data == 0)
// ret = SCANNER_ERR_DEVICE_NO_PAPER;
//else
@ -862,13 +887,13 @@ int hg_scanner_200::get_scan_is_sleep(SANE_Bool& type)
USBCB usbcb = { setting3288dsp::ACTIVE_SCANNER, 0, 0 };
len = sizeof(USBCB);
ret = writeusb(usbcb);
if (ret == SCANNER_ERR_OK)
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(&usbcb,&len);
ret = writeusb(usbcb);
if (ret == SCANNER_ERR_OK)
{
ret = io_->read_bulk(&usbcb, &len);
}
}
if (ret == SCANNER_ERR_OK)
{
@ -970,12 +995,15 @@ int hg_scanner_200::get_history_scan_count(int& num)
len = 0;
USBCB usbcb = { setting3288dsp::GET_SCANN_NUM,0, 0 };
len = sizeof(usbcb);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->write_bulk(&usbcb, &len);
if (ret != SCANNER_ERR_OK)
{
return ret;
}
ret = io_->read_bulk(&usbcb, &len);
}
if (ret != SCANNER_ERR_OK)
{
return ret;
@ -989,12 +1017,15 @@ int hg_scanner_200::get_roller_num(int& val)
len = 0;
USBCB usbcb = { setting3288dsp::GET_ROLLER_NUM,0, 0 };
len = sizeof(usbcb);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->write_bulk(&usbcb, &len);
if (ret != SCANNER_ERR_OK)
{
return ret;
}
ret = io_->read_bulk(&usbcb, &len);
}
if (ret != SCANNER_ERR_OK)
{
return ret;

View File

@ -160,7 +160,10 @@ void hg_scanner_300::thread_handle_usb_read(void)
int count = usb.u32_Count;
msg.resize(count);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(&msg[0], &count);
}
if (ret == SCANNER_ERR_OK)
notify_ui_working_status(msg.c_str(), SANE_EVENT_STATUS, status_);
else
@ -268,30 +271,28 @@ void hg_scanner_300::thread_handle_usb_read(void)
}
int hg_scanner_300::discard_all_images(void)
{
int block = 1024 * 512, len = block;
uint8_t* buf = new uint8_t[block];
if(buf)
{
int block = 1024 * 512;
std::lock_guard<std::mutex> lock(io_lock_);
int cnt = 0, ret = SCANNER_ERR_OK;
io_->set_timeout(1000);
string str;
while ((ret = io_->read_bulk(buf, &len)) == SCANNER_ERR_OK)
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = io_->read_bulk(&str[0], &block);
}
while (ret == SCANNER_ERR_OK)
{
cnt++;
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(&str[0], &block);
}
this_thread::sleep_for(chrono::milliseconds(1000));
if (cnt > 10)
len = block;
this_thread::sleep_for(chrono::milliseconds(10));
if (cnt++ > 10)
{
break;
}
}
delete[] buf;
}
if (is_read_int)
{
//initdevice();
@ -367,7 +368,10 @@ int hg_scanner_300::start(void)
}
printf_devconfig();
USBCB usb = { setting3288dsp::START_COMMAND, img_conf_.scannum, 0};
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(usb);
}
if(ret == SCANNER_ERR_OK)
{
@ -385,7 +389,10 @@ int hg_scanner_300::stop(void)
int ret = SCANNER_ERR_OK;
USBCB usbcb = { setting3288dsp::STOP, 0, 0};
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(usbcb);
}
if (status_ == SCANNER_ERR_DEVICE_BUSY)
{
@ -403,8 +410,6 @@ int hg_scanner_300::stop(void)
}
int hg_scanner_300::writeusb(USBCB &usb)
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = SCANNER_ERR_OK;
int len = sizeof(usb);
@ -418,8 +423,6 @@ int hg_scanner_300::writeusb(USBCB &usb)
}
int hg_scanner_300::readusb(USBCB &usb)
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = SCANNER_ERR_OK;
int len = sizeof(USBCB);
@ -436,12 +439,16 @@ int hg_scanner_300::pop_image()
int ret = SCANNER_ERR_OK;
USBCB usbcb = { setting3288dsp::POP_IMAGE, 0, 0};
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(usbcb);
}
return ret;
}
int hg_scanner_300::get_scanner_status(USBCB &usb)
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = SCANNER_ERR_OK;
usb = { setting3288dsp::GET_DSP_STATUS, 0, 0};
@ -471,6 +478,8 @@ int hg_scanner_300::get_img_data(std::shared_ptr<tiny_buffer> &imagedata)
block = total;
USBCB usb{ setting3288dsp::GET_IMAGE, 0, total};
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(usb);
if (ret != SCANNER_ERR_OK)
{
@ -512,6 +521,7 @@ int hg_scanner_300::get_img_data(std::shared_ptr<tiny_buffer> &imagedata)
total -= block;
}
}
}
if (ret == SCANNER_ERR_OK)
{
ret = save_usb_data(imagedata);
@ -577,7 +587,10 @@ int hg_scanner_300::writedown_device_configuration(bool type,setting_hardware::H
USBCB usbcb = { setting3288dsp::CONFIGURED_DATA, d->value, 0};
len = sizeof(USBCB);
ret = io_->write_bulk(&usbcb,&len);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->write_bulk(&usbcb, &len);
}
if (type)
{
printf_devconfig(d);
@ -821,9 +834,12 @@ std::string hg_scanner_300::get_firmware_version()
len = 10; //协议定义长度为10 100 200 =8
USBCB cmd = { setting3288dsp::GET_FW_VERSION,len,0,};
ret = writeusb(cmd);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(cmd);
if(ret == SCANNER_ERR_OK)
ret = io_->read_bulk(buf, &len);
}
string fw = buf;
VLOG_MINI_1(LOG_LEVEL_WARNING, "get_firmware_version:%s\n", !fw.empty() ? fw.c_str() : "not find devs firmware_version");
@ -837,10 +853,12 @@ std::string hg_scanner_300::get_firmware_version()
SerialNum.resize(len);
USBCB cmd = { setting3288dsp::GET_SERIAL,len,0,};
ret = writeusb(cmd);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->read_bulk(&SerialNum[0],&len);
ret = writeusb(cmd);
if(ret == SCANNER_ERR_OK)
ret = io_->read_bulk(&SerialNum[0], &len);
}
VLOG_MINI_1(LOG_LEVEL_WARNING, "get_serial_num:%s\n", !SerialNum.empty() ? SerialNum.c_str() : "not find devs get_serial_num");
return SerialNum;
@ -861,6 +879,7 @@ int hg_scanner_300::set_leaflet_scan(void)
int hg_scanner_300::set_clear_roller_num(void)
{
std::lock_guard<std::mutex> lock(io_lock_);
USBCB usbcb = { setting3288dsp::CLR_ROLLER_NUM,0,4 };
return writeusb(usbcb);
}
@ -870,6 +889,7 @@ int hg_scanner_300::set_clear_history_num(void)
{
return SCANNER_ERR_DEVICE_NOT_SUPPORT;
}
std::lock_guard<std::mutex> lock(io_lock_);
USBCB usbcb = { setting3288dsp::CLR_SCAN_NUM,0,4 };
return writeusb(usbcb);
}
@ -883,6 +903,8 @@ int hg_scanner_300::get_sleep_time(int &data)
len = 0;
USBCB usbcb = { setting3288dsp::GET_SLEEP_TIME, 0, 0 };
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(usbcb);
if (ret != SCANNER_ERR_OK)
{
@ -890,6 +912,7 @@ int hg_scanner_300::get_sleep_time(int &data)
}
len = sizeof(usbcb);
ret = io_->read_bulk(&usbcb, &len);
}
if (ret == SCANNER_ERR_OK)
{
data = (SANE_Power)usbcb.u32_Data;
@ -899,6 +922,7 @@ int hg_scanner_300::get_sleep_time(int &data)
}
int hg_scanner_300::set_sleep_time(int data)
{
std::lock_guard<std::mutex> lock(io_lock_);
int ret = SCANNER_ERR_OK;
USBCB usbcb = { setting3288dsp::SET_SLEEP_TIME,data, 0};
ret = writeusb(usbcb);
@ -912,14 +936,16 @@ int hg_scanner_300::get_scanner_paperon(SANE_Bool& type)
USBCB usbcb = { setting3288dsp::GET_PAPERFEEDER_STATUS, 0, 0};
len = sizeof(USBCB);
ret = writeusb(usbcb);
if (ret == SCANNER_ERR_OK)
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(usbcb);
if (ret == SCANNER_ERR_OK)
{
ret = io_->read_bulk(&usbcb, &len);
type = usbcb.u32_Data == 0 ? false : true;
}
}
//if (usbcb.u32_Data == 0)
// ret = SCANNER_ERR_DEVICE_NO_PAPER;
//else
@ -935,14 +961,15 @@ int hg_scanner_300::get_scan_is_sleep(SANE_Bool& type)
USBCB usbcb = { setting3288dsp::ACTIVE_SCANNER, 0, 0 };
len = sizeof(USBCB);
ret = writeusb(usbcb);
if (ret == SCANNER_ERR_OK)
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(usbcb);
if (ret == SCANNER_ERR_OK)
{
ret = io_->read_bulk(&usbcb, &len);
}
}
if (ret == SCANNER_ERR_OK)
{
if (usbcb.u32_Data == 0x10)
@ -1164,7 +1191,10 @@ int hg_scanner_300::set_devs_distortion_check_val(float data)
float f = *(float*)&(val);
VLOG_MINI_3(LOG_LEVEL_WARNING, "set_devs_distortion_check_val dpi is:%d,config dpi = %d,distortion_check_val(%f)\n", resolution_, protocol_dpi,f);
io_->set_timeout(5000);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->write_bulk(&usbcb, &len);
}
return ret;
}
int hg_scanner_300::get_devs_distortion_check_val(float& data)
@ -1176,6 +1206,9 @@ int hg_scanner_300::get_devs_distortion_check_val(float& data)
int protocol_dpi = resolution_ == 200 ? 1 : (resolution_ == 300 ? 2 : 3);
USBCB usbcb = { setting3288dsp::GET_JUST_COF_V ,0,protocol_dpi };
len = sizeof(usbcb);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->write_bulk(&usbcb, &len);
if (ret != SCANNER_ERR_OK)
{
@ -1184,6 +1217,7 @@ int hg_scanner_300::get_devs_distortion_check_val(float& data)
io_->set_timeout(3000);
ret = io_->read_bulk(&usbcb, &len);
}
if (ret != SCANNER_ERR_OK)
{
return ret;
@ -1203,7 +1237,12 @@ int hg_scanner_300::set_auto_flat(int data)
}
USBCB usbcb = { setting3288dsp::START_FLAT,data,0 };
int len = sizeof(usbcb);
int ret = writeusb(usbcb);
int ret = SCANNER_ERR_OK;
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = writeusb(usbcb);
}
if (ret == SCANNER_ERR_OK && wait_usb_.is_waiting())
{
@ -1268,12 +1307,14 @@ int hg_scanner_300::set_serial_num(string str)
}
int hg_scanner_300::set_vid_pid(int data)
{
std::lock_guard<std::mutex> lock(io_lock_);
USBCB usbcb = { setting3288dsp::SET_USB_INFOR_VIDPID,data,0 };
int len = sizeof(usbcb);
return io_->write_bulk(&usbcb, &len);
}
int hg_scanner_300::get_vid_pid(int& data)
{
std::lock_guard<std::mutex> lock(io_lock_);
USBCB usbcb = { setting3288dsp::GET_USB_INFOR_VIDPID,0,0 };
int ret = SCANNER_ERR_OK,
len = sizeof(usbcb);
@ -1295,12 +1336,16 @@ int hg_scanner_300::get_history_scan_count(int& num)
len = 0;
USBCB usbcb = { setting3288dsp::GET_SCANN_NUM,0, 0 };
len = sizeof(usbcb);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->write_bulk(&usbcb, &len);
if (ret != SCANNER_ERR_OK)
{
return ret;
}
ret = io_->read_bulk(&usbcb, &len);
}
if (ret != SCANNER_ERR_OK)
{
return ret;
@ -1314,12 +1359,16 @@ int hg_scanner_300::get_roller_num(int& val)
len = 0;
USBCB usbcb = { setting3288dsp::GET_ROLLER_NUM,0, 0 };
len = sizeof(usbcb);
{
std::lock_guard<std::mutex> lock(io_lock_);
ret = io_->write_bulk(&usbcb, &len);
if (ret != SCANNER_ERR_OK)
{
return ret;
}
ret = io_->read_bulk(&usbcb, &len);
}
if (ret != SCANNER_ERR_OK)
{
return ret;