This commit is contained in:
modehua 2023-09-04 00:46:32 -07:00
commit c48acfbbdc
2 changed files with 99 additions and 34 deletions

119
main.cpp
View File

@ -34,7 +34,7 @@
using json = nlohmann::json;
using namespace std;
//shared_ptr<HGUsb> m_usb;
// shared_ptr<HGUsb> m_usb;
shared_ptr<UsbScanner> m_scanner;
ofstream updatePkg;
static unsigned int total_length = 0;
@ -265,7 +265,7 @@ int main(int argc, char *argv[])
stop_countdown();
break;
}
USBCB usbcb = {0};
m_scanner->read_bulk(&usbcb, sizeof(usbcb));
if (usbcb.Command == 0)
@ -280,17 +280,17 @@ int main(int argc, char *argv[])
case USBCommand::GET_DSP_STATUS:
{
USBCB sts = {1, 0, 0};
if (m_scanner->IsScanning()) //队列不为空
if (m_scanner->IsScanning()) // 队列不为空
{
if (m_scanner->GetImagequeueEmpty())
{
//LOG("GetImagequeueEmpty\n");
// LOG("GetImagequeueEmpty\n");
auto evt = m_scanner->GetEventFront();
// if (evt != (int)HG_ScannerStatus::NORMAL && evt != (int)HG_ScannerStatus::STOP_SCAN)
if (evt.code != (int)HG_ScannerStatus::NORMAL && evt.code != (int)HG_ScannerStatus::STOP_SCAN)
{
sts.Data = m_scanner->GetEvent().code; //确保第一张扫描之前所发生的异常事件能够被通知
sts.Data = m_scanner->GetEvent().code; // 确保第一张扫描之前所发生的异常事件能够被通知
}
}
else
@ -299,7 +299,7 @@ int main(int argc, char *argv[])
int evt = m_scanner->GetEventFront().code;
if (evt != (int)HG_ScannerStatus::NORMAL && evt != (int)HG_ScannerStatus::STOP_SCAN)
{
sts.Data = m_scanner->GetEvent().code; //扫描中途的事件能够被通知
sts.Data = m_scanner->GetEvent().code; // 扫描中途的事件能够被通知
}
else
{
@ -311,7 +311,7 @@ int main(int argc, char *argv[])
}
else
{
//LOG("Scanning not scanning \n");
// LOG("Scanning not scanning \n");
if (!m_scanner->GetImagequeueEmpty())
{
HG_JpegCompressInfo info = m_scanner->GetFrontImage();
@ -340,22 +340,21 @@ int main(int argc, char *argv[])
case USBCommand::GET_IMAGE:
{
HG_JpegCompressInfo info = m_scanner->GetImage();
//sw.reset();
// sw.reset();
if (info.pJpegData != nullptr && info.DataLength != 0)
{
int tt = m_scanner->write_bulk((void*)&info, sizeof(int)*7);
int tt = m_scanner->write_bulk((void *)&info, sizeof(int) * 7);
//int tt = m_scanner->write_bulk(info.pJpegData, info.DataLength);
//free(info.pJpegData);
//break;
// int tt = m_scanner->write_bulk(info.pJpegData, info.DataLength);
// free(info.pJpegData);
//tt = m_scanner->write_bulk(info.mat.data, info.DataLength);
//free(info.pJpegData);
//break;
//LOG("GET_IMAGE info.pJpegData =%p info.DataLength=%d \n", info.pJpegData, info.DataLength);
// break;
// tt = m_scanner->write_bulk(info.mat.data, info.DataLength);
// free(info.pJpegData);
// break;
// LOG("GET_IMAGE info.pJpegData =%p info.DataLength=%d \n", info.pJpegData, info.DataLength);
int index = 0;
int total = info.DataLength;
while (total > 0)
@ -366,27 +365,27 @@ int main(int argc, char *argv[])
dstlength = total;
total = 0; // jpeg图像小于1MB 则一次传输
}
else //压缩大于1MB的图像 分包传输
else // 压缩大于1MB的图像 分包传输
{
total -= dstlength;
}
int tt = m_scanner->write_bulk(info.pJpegData + index, dstlength);
//printf("write_bulk info.pJpegData+index = %p index = %d dstlength =%d tt = %d \n", info.pJpegData + index, index, dstlength, tt);
// printf("write_bulk info.pJpegData+index = %p index = %d dstlength =%d tt = %d \n", info.pJpegData + index, index, dstlength, tt);
if (tt <= -1)
{
LOG("FAIL GET_IMAGE write bulk data error\n");
//writesyslog(LOG_WARNING, "usb write_bulk error,lost image!");
// writesyslog(LOG_WARNING, "usb write_bulk error,lost image!");
break;
}
else
index += tt;
}
//free(info.pJpegData);
// free(info.pJpegData);
tjFree(info.pJpegData);
LOG("Free info.pJpegData done\n");
//printf("TIME!!!!!!!!!!!!! :%f info.DataLength:%d\r\n",sw.elapsed_ms(),info.DataLength);
// printf("TIME!!!!!!!!!!!!! :%f info.DataLength:%d\r\n",sw.elapsed_ms(),info.DataLength);
}
}
break;
@ -397,11 +396,10 @@ int main(int argc, char *argv[])
m_scanner->StartScan(usbcb.Data);
std::string loginfo = "start scan dst scan num = " + to_string(usbcb.Data) + "\n";
writesyslog(LOG_INFO, loginfo);
}
break;
case USBCommand::STOP:
m_scanner->StopScan();
break;
case USBCommand::GET_FW_VERSION:
@ -442,7 +440,7 @@ int main(int argc, char *argv[])
case USBCommand::STOP_FLAT:
break;
case USBCommand::SEND_SERIAL:
if (usbcb.Length == 14) //长度必须是14
if (usbcb.Length == 14) // 长度必须是14
{
LOG("SET SEND_SERIAL \n");
std::vector<unsigned char> str(14);
@ -599,7 +597,7 @@ int main(int argc, char *argv[])
dstlength = length;
length = 0; // jpeg图像小于1MB 则一次传输
}
else //压缩大于1MB的图像 分包传输
else // 压缩大于1MB的图像 分包传输
length -= dstlength;
int tt = m_scanner->write_bulk(bufferlog + index, dstlength);
@ -734,7 +732,7 @@ int main(int argc, char *argv[])
jsonpath.resize(usbcb.Length);
m_scanner->read_bulk(&jsonpath[0], usbcb.Length);
LOG("get json path = %s \n", jsonpath.c_str());
if (access(jsonpath.c_str(), F_OK) == 0) //存在
if (access(jsonpath.c_str(), F_OK) == 0) // 存在
{
ifstream i(jsonpath);
json j;
@ -754,18 +752,71 @@ int main(int argc, char *argv[])
m_scanner->read_bulk(&jspath[0], usbcb.Data);
LOG("save json path =%s \n", jspath.c_str());
m_scanner->read_bulk(&jscontent[0], usbcb.Length);
//LOG("json content =%s \n", jscontent.c_str());
// LOG("json content =%s \n", jscontent.c_str());
auto j = json::parse(jscontent);
ofstream ofs(jspath);
ofs << std::setw(4) << j << std::endl;
}
break;
case USBCommand::GET_FLAT_DATA:
{
FLAT_INFO *flatinfo = static_cast<FLAT_INFO *>(usbcb.Data);
unsigned char *lut_buffer;
if (flatinfo->params.dpi != 0)
{
std::ifstream lut_item;
int dpi = flatinfo->params.dpi == 0x01 ? 200 : (flatinfo->params.dpi == 0x02 ? 300 : 600);
std::string mode = flatinfo->params.colormode ? "clr" : "gray";
std::string is_white_lut = flatinfo->params.is_whiteimage ? "white" : "bw";
std::string lut_path = "/mnt/conf-disk/huago/lut" + std::to_string(dpi) + mode + is_white_lut + ".bmp";
lut_item.open(lut_path, std::ios_base::in | std::ios_base::binary);
if (!lut_item.is_open())
{
flatinfo->params.datalen = 0;
flatinfo->params.status = 1; // 文件打开失败
}
else
{
lut_item.seekg(0, std::ios::end);
size_t length = lut_item.tellg();
lut_item.seekg(0, std::ios::beg);
flatinfo->params.datalen = length
}
if (flatinfo->params.datalen != 0)
{
lut_buffer = new unsigned char[flatinfo->params.datalen];
if (lut_buffer)
lut_item.read(lut_buffer, flatinfo->params.datalen);
else
{
flatinfo->params.status = 2; // OOM 异常
flatinfo->params.datalen = 0;
}
}
}
else
{
flatinfo->params.datalen = 0;
flatinfo->params.status = 3; // 未知dpi
}
usbcb.Data = flatinfo->value;
m_scanner->write_bulk(&usbcb, sizeof(usbcb));
if (lut_buffer)
{
m_scanner->write_bulk(lut_buffer, flatinfo->params.datalen);
delete[] lut_buffer;
}
}
break;
default:
break;
}
}
m_scanner->ClearErrorEvents();
m_scanner->ClearImages(); //清空内存 释放压缩数据 避免内存堆积
m_scanner->ClearImages(); // 清空内存 释放压缩数据 避免内存堆积
m_scanner.reset();
LOG("reset scanner \n");
LOG("reset usb \n");

View File

@ -352,3 +352,17 @@ constexpr char BULK_OUT_PATH[] = "/dev/usb-ffs/mtp/ep2";
constexpr char BULK_IN_PATH[] = "/dev/usb-ffs/mtp/ep1";
constexpr char BULK_INT_PATH[] = "/dev/usb-ffs/mtp/ep3";
constexpr char STATE_PATH[] = "/sys/class/android_usb/android0/state";
union FLAT_INFO
{
struct
{
unsigned int dpi:5;
unsigned int colormode:1;
unsigned int is_whiteimage:1;
unsigned int status:8;
unsigned int reversed:1;
unsigned int datalen:16;
}params;
unsigned int value;
};