diff --git a/main.cpp b/main.cpp index b375ebe..191dcf7 100644 --- a/main.cpp +++ b/main.cpp @@ -34,7 +34,7 @@ using json = nlohmann::json; using namespace std; -//shared_ptr m_usb; +// shared_ptr m_usb; shared_ptr 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 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(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"); diff --git a/scanservices_utils.h b/scanservices_utils.h index 341f6e8..6f2e233 100644 --- a/scanservices_utils.h +++ b/scanservices_utils.h @@ -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; +};