增加守护进程 增加摩尔纹模式,调整bug

This commit is contained in:
modehua 2023-10-19 02:29:46 -07:00
parent 947e525ce8
commit 91a5de2d13
13 changed files with 205 additions and 133 deletions

View File

@ -112,16 +112,16 @@ void CuoZhiMotor::speedRecover()
void CuoZhiMotor::speedConfig()
{
// printf("CuoZhiMotor speed=%d \n dpi=%d \n colormode=%d \n finalPeriod=%d \n Fmin=%d \n a=%.2f \n offset=%.2f \n stepnum=%.2f \n finalDelay=%.2f \n ",
// m_cuoparamex.speed,
// m_cuoparamex.dpi,
// m_cuoparamex.colormode,
// m_cuoparamex.mt_param.finalPeriod,
// m_cuoparamex.mt_param.Fmin,
// m_cuoparamex.mt_param.a,
// m_cuoparamex.mt_param.offset,
// m_cuoparamex.mt_param.stepnum,
// m_cuoparamex.mt_param.finalDelay);
printf("CuoZhiMotor speed=%d \n dpi=%d \n colormode=%d \n finalPeriod=%d \n Fmin=%d \n a=%.2f \n offset=%.2f \n stepnum=%.2f \n finalDelay=%.2f \n ",
m_cuoparamex.speed,
m_cuoparamex.dpi,
m_cuoparamex.colormode,
m_cuoparamex.mt_param.finalPeriod,
m_cuoparamex.mt_param.Fmin,
m_cuoparamex.mt_param.a,
m_cuoparamex.mt_param.offset,
m_cuoparamex.mt_param.stepnum,
m_cuoparamex.mt_param.finalDelay);
delays_forward.clear();
delays_forward = speedup_cfg(m_cuoparamex.mt_param.finalPeriod, m_cuoparamex.mt_param.Fmin, m_cuoparamex.mt_param.stepnum, m_cuoparamex.mt_param.a,

View File

@ -291,7 +291,6 @@ FsmState *ScanningState::on_event(ScanEvent event)
scanner->SetIsDoublePaper(true);
scanner->emergency_stop(1);
LOG("\nScanningState S_EVT_DOUBLEPAPER %s \n",GetCurrentTimeStamp(2).c_str());
writesyslog(LOG_INFO,"double paper error\n");
return FsmStateManagerEx<ErrorJamState>::GetState();
}
else if (event == S_EVT_JAM_IN)

View File

@ -207,7 +207,7 @@ int HCamDevice::uninit_fpga()
int HCamDevice::open_device(int width , int height)
{
close_device();
v4lWidth = width;//@300dpi 5184 @600dpi 5184*2
v4lHeight = height ;//* 3;//color_h/gray_h = 3 比如目标复原图像高度为128 则灰度需要FPGA采集128 彩色采集128*3
@ -673,7 +673,7 @@ int HCamDevice::init_capture()
camera_print(" fmt.fmt.pix.width = %d\n", fmt.fmt.pix_mp.width);
camera_print(" fmt.fmt.pix.height = %d\n", fmt.fmt.pix_mp.height);
camera_print(" fmt.fmt.pix.field = %d\n", fmt.fmt.pix_mp.field);
// close(videofd);
close_device();
return -1;
}
@ -1363,7 +1363,7 @@ void HCamDevice::HtCamResizeBuffer(int width, int height, int number)
v4lHeight = height;
v4lBufferCount = number;
HtCamExitVideoCapturing();
close_device();
init_sample();
init_capture();
init_video_buffer();

View File

@ -80,6 +80,9 @@ void MultiFrameCapture::SetParent(void *scanner)
void MultiFrameCapture::open()
{
printf("open-------\r\n");
//stop_countdown();
printf("open close-------\r\n");
int ret = video->open_device(v4l2_width_,v4l2_height_);
if(ret < -1)
return;
@ -176,6 +179,11 @@ SIZE MultiFrameCapture::GetPaperSize(PaperSize paper, int dpi)
void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config)
{
m_config = config;
printf("config.params.slow_moire:%d\r\n",config.params.slow_moire);
if(config.params.slow_moire && config.params.dpi != 3)
{
config.params.dpi = 2;
}
if (!video.get())
{
@ -213,6 +221,22 @@ void MultiFrameCapture::UpdateScanParam(HG_ScanConfiguration config)
{
int val = config.params.dpi == 3 ? 600 :(config.params.dpi == 2?300:200);
printf("val = %d\r\n",val);
//除摩尔纹模式
if(config.params.slow_moire && config.params.dpi != 3)
{
int sp = fpgaparam.Sp - 538;
val = 400;
video->HtCamSetSpTime(sp,49); // 2344 灰色 //2023-8-10 最新2650
if (color_mode_)
{
video->HtCamSetSpTime2(sp * 3);
}
printf("摩尔纹高度 = %d\r\n",val);
printf("灰度sp = %d\r\n",sp);
printf("彩色sp = %d\r\n",sp * 3);
}
uint32_t cnt = compute_frame(paper_size_ , val) ;
if (m_config.params.dpi == 2 && m_config.params.pageSize == (int)PaperSize::G400_A4)
{
@ -763,7 +787,12 @@ bool MultiFrameCapture::saveLutImg(int dpi, int mode, bool black)
{
int k = (3 * s + x);
// int diff = LIGHT_DIFF(*((double *)values + k));
int diff = 210 - *((double *)values + k);;//param.MaxBright - *((double *)values + k);
int diff;//= 240 - *((double *)values + k);;//param.MaxBright - *((double *)values + k);
if(x==0)
diff = 190 - *((double *)values + k);
else
diff = 240 - *((double *)values + k);
log += " 明场:" + std::to_string(k) + ";diff" + std::to_string(diff) + "\r\n";
double step = diff * radio;

View File

@ -33,37 +33,26 @@ Scanner::Scanner(ScannerGlue glue)
capturer->SetParent(this);
//固件版本
int version=7010;
fpgacontrol fc(version);
if (fc.ifneedupdatefpga())
{
if (fc.updatefpga())
{
system("poweroff");
}
else
{
LOG("error error update fpga error");
}
}
auto btnevent = [this](const int eventtype)
{
if (!IsScanning()) //未扫描
{
if (eventtype == BTN_LOW_POWER)
switch (eventtype)
{
//system("echo mem > /sys/power/state");
//capturer->SetLowPower(0);
system("/mnt/flash-disk/low_power.sh 1");
}
else if (eventtype == BTN_START)
{
// put(S_EVT_START_SCAN);
}
else if(eventtype == BTN_NORMAL_POWER)
{
//capturer->SetLowPower(1);
system("/mnt/flash-disk/low_power.sh 0");
case BTN_LOW_POWER:
stop_countdown();
system("sh /mnt/flash-disk/low_power.sh 1");
break;
case BTN_NORMAL_POWER:
system("sh /mnt/flash-disk/low_power.sh 0");
start_enter_lowpwoer();
break;
case BTN_START:
/* code */
break;
default:
break;
}
}
else //扫描中
@ -71,7 +60,7 @@ Scanner::Scanner(ScannerGlue glue)
if (eventtype == BTN_STOP)
{
put(S_EVT_STOP_SCAN);
LOG("BTN_STOP put(S_EVT_STOP_SCAN)");
printf("keyboard cancel scan\r\n");
}
}
};
@ -119,6 +108,10 @@ void Scanner::updateSpeedMode(int speed)
if(typeid(*capturer)==typeid(MultiFrameCapture))
if(m_config.params.pageSize == 17 || m_config.params.pageSize == 19 ) //长文稿采用600dpi模式扫描
t_dpi = 3;
if (m_config.params.slow_moire) //摩尔纹使用300dpi进行采集
{
t_dpi = 2;
}
motorCuozhi.speedChange(m_scaninfo.SpeedMode, t_dpi,m_config.params.isColor);
motorZouzhi.speedChange(m_scaninfo.SpeedMode, t_dpi,m_config.params.isColor);
@ -129,6 +122,7 @@ void Scanner::startScan()
if (threadRunScan.joinable())
threadRunScan.join();
stop_countdown();
this_thread::sleep_for(std::chrono::milliseconds(200));
updateSpeedMode(4);
// //开始进行扫描
threadRunScan = std::thread(&Scanner::runScan, this);
@ -256,7 +250,6 @@ void Scanner::runScan()
m_jamIn = true;
put(S_EVT_JAM_IN);
m_scaninfo.JamInNum++;
//writesyslog(LOG_INFO, "paper jam in error \n");
}
break;
}

View File

@ -144,7 +144,6 @@ UsbScanner::UsbScanner() : m_startscan(false),
if (eventID == (int)HG_ScannerStatus::STOP_SCAN)
{
m_startscan = false;
writesyslog(LOG_INFO, getmeminfo());
}
if (eventID == (int)(HG_ScannerStatus::AUTO_FLAT_FINISHED))
{
@ -179,7 +178,7 @@ void UsbScanner::StartScan(int scancount)
{
ClearImages();
ClearErrorEvents();
m_hgScanner->SetDstScanNum(9999);//scancount <= 0 ? 1 : scancount);
m_hgScanner->SetDstScanNum(scancount <= 0 ? 1 : scancount);
m_hgScanner->put(S_EVT_START_SCAN);
}
@ -400,7 +399,7 @@ void UsbScanner::UpdateScanInfo(int type, void *data)
info.SleepTime = *(unsigned int *)(data);
printf("set sleep time = %d \n", info.SleepTime);
SaveScaninfo(info);
stop_countdown();
//stop_countdown();
start_enter_lowpwoer();
return;
case USBCommand::SET_SPEED_MODE:

View File

@ -32,16 +32,16 @@ void ZouZhiMotor::speedRecover()
void ZouZhiMotor::speedConfig()
{
// printf("ZouZhiMotor speed=%d \n dpi=%d \n colormode=%d \n finalPeriod=%d \n Fmin=%d \n a=%.2f \n offset=%.2f \n stepnum=%.2f \n finalDelay=%.2f \n ",
// m_zouparamex.speed,
// m_zouparamex.dpi,
// m_zouparamex.colormode,
// m_zouparamex.mt_param.finalPeriod,
// m_zouparamex.mt_param.Fmin,
// m_zouparamex.mt_param.a,
// m_zouparamex.mt_param.offset,
// m_zouparamex.mt_param.stepnum,
// m_zouparamex.mt_param.finalDelay);
printf("ZouZhiMotor speed=%d \n dpi=%d \n colormode=%d \n finalPeriod=%d \n Fmin=%d \n a=%.2f \n offset=%.2f \n stepnum=%.2f \n finalDelay=%.2f \n ",
m_zouparamex.speed,
m_zouparamex.dpi,
m_zouparamex.colormode,
m_zouparamex.mt_param.finalPeriod,
m_zouparamex.mt_param.Fmin,
m_zouparamex.mt_param.a,
m_zouparamex.mt_param.offset,
m_zouparamex.mt_param.stepnum,
m_zouparamex.mt_param.finalDelay);
delays.clear();

View File

@ -31,15 +31,8 @@ start(){
done
if [ $SEC -gt 0 ] ; then
#echo freeze > /sys/power/state
echo sleep > /etc/kernel_state
pkill scanservice
/etc/usbmonitor &
/etc/pm_control off
echo 0 > /sys/class/leds/red/brightness
echo 0 > /sys/class/leds/white/brightness
echo 0 > /sys/class/leds/green/brightness
echo 1 > /sys/class/leds/green/brightness
sh /mnt/flash-disk/low_power.sh 1
fi
}

View File

@ -1 +1,11 @@
ps -efww|grep countdown |grep -v grep|cut -c 9-15|xargs kill -9
#!/bin/bash
ID=`PS -EF | grep countdown.sh | grep -v grep |awk '{printf $2}'`
echo $ID
for id in $ID
do
kill -9 $id
echo "kill $id"
done

View File

@ -228,7 +228,7 @@ int main(int argc, char *argv[])
{
exit(-1);
}
creat_sleep_fifo();
init_get_CISType_GPIO();
initscanner();
start_enter_lowpwoer();
@ -323,7 +323,6 @@ int main(int argc, char *argv[])
auto data = m_scanner->GetEvent();
if (data.code == (int)(HG_ScannerStatus::STOP_SCAN))
{
system("cpufreq-set -g ondemand");
printf("关闭V4L2 4444\r\n");
m_scanner->close_v4l2();
}
@ -355,16 +354,6 @@ int main(int argc, char *argv[])
if (info.pJpegData != nullptr && info.DataLength != 0)
{
int tt = m_scanner->write_bulk((void *)&info, sizeof(int) * 8);
//printf("USB传输第一次write_bulk时间 :%f \r\n",sw.elapsed_ms());
// tt = m_scanner->write_bulk(info.pJpegData, info.DataLength);
// //free(info.pJpegData);
// printf("USB传输第二次write_bulk时间 :%f \r\n",sw.elapsed_ms());
// 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)
@ -376,30 +365,18 @@ int main(int argc, char *argv[])
total = 0; // jpeg图像小于1MB 则一次传输
}
else // 压缩大于1MB的图像 分包传输
{
total -= dstlength;
}
int tt = m_scanner->write_bulk(info.pJpegData + index, dstlength);
//printf("USB传输第二次write_bulk时间 :%f \r\n",sw.elapsed_ms());
// 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!");
break;
}
else
index += tt;
}
//dnasfree(info.pJpegData);
//tjFree(info.pJpegData);
//LOG("Free info.pJpegData done\n");
if (info.dpi)
{
free(info.pJpegData);
}
sw1.reset();
printf("USB传输一帧第[%d]次时间 :%f \r\n",indx,sw.elapsed_ms());
@ -409,11 +386,8 @@ int main(int argc, char *argv[])
break;
case USBCommand::START_COMMAND:
{
system("cpufreq-set -g performance");
LOG("start scan scancount = %d\n", usbcb.Data);
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:
@ -434,7 +408,6 @@ int main(int argc, char *argv[])
config.value = usbcb.Data;
m_scanner->ConfigScanParam(config);
std::string loginfo = "config scanner config data = " + to_string(usbcb.Data) + "\n";
writesyslog(LOG_INFO, loginfo);
LOG("CONFIGURED_DATA data = %d \n", config.value);
}
break;
@ -534,9 +507,8 @@ int main(int argc, char *argv[])
// break;
case USBCommand::PRE_UPGRADE:
{
writesyslog(LOG_INFO, "start updating system\n");
LOG("start PRE_UPGRADE \n");
updatePkg.open("/usr/local/update.zip", ios::out | ios::binary);
updatePkg.open("/home/root/update.zip", ios::out | ios::binary);
m_scanner->SetLEDStatus(LedStatus::Updating);
total_length = usbcb.Length;
}
@ -569,18 +541,12 @@ int main(int argc, char *argv[])
this_thread::sleep_for(std::chrono::seconds(10));
m_scanner->SetLEDStatus(LedStatus::UpdateDone);
updatePkg.close();
system("cp /usr/local/update.zip /userdata/update.zip -f");
system("rm -rf /usr/local/update.zip");
// m_scanner->SetLEDStatus(LedStatus::Ready);
// this_thread::sleep_for(std::chrono::seconds(3));
// total_length = 0;
// writesyslog(LOG_INFO, "update system finished\n");
// system("reboot");
system("sh /mnt/flash-disk/upgrade_firmware.sh");
}
break;
case USBCommand::REBOOT:
{
writesyslog(LOG_INFO, "scanservices aquired reboot\n");
if (usbcb.Data == 0)
system("reboot");
else
@ -622,7 +588,6 @@ int main(int argc, char *argv[])
if (tt == -1)
{
LOG("GET_LOG_FILES_INFO write bulk data error\n");
writesyslog(LOG_WARNING, "usb write_bulk error,lost log data!");
break;
}
else
@ -635,7 +600,7 @@ int main(int argc, char *argv[])
break;
case USBCommand::GET_UPDATE_RESULT:
{
fstream updateResult("/userdata/md5_result.log");
fstream updateResult("/mnt/flash-disk/updata_status.txt");
if (!updateResult.is_open())
usbcb.Data = 0;
else
@ -643,19 +608,18 @@ int main(int argc, char *argv[])
updateResult >> usbcb.Data;
updateResult.close();
}
printf("usbcb.Data:%d\r\n",usbcb.Data);
m_scanner->write_bulk(&usbcb, sizeof(usbcb));
this_thread::sleep_for(std::chrono::milliseconds(1000));
if (usbcb.Data == 2)
if (usbcb.Data == 0)
system("reboot");
else if (usbcb.Data == 3)
system("update ota /userdata/updatefile/update.img");
}
break;
case USBCommand::CLEAR_LOG_FILES:
{
system("echo \"\" > /var/log/syslog");
writesyslog(LOG_WARNING, "clear /var/log/syslog contents!");
}
break;
case USBCommand::GET_SCANN_NUM:
@ -700,8 +664,15 @@ int main(int argc, char *argv[])
break;
case USBCommand::ACTIVE_SCANNER:
{
usbcb.Data = 0x10;
int ret = get_devs_status(SLEEP_STATUS_PATH);
printf("sleep status :%d\r\n",ret);
usbcb.Data = ret == SCANNER_ERR_SLEEP ? 0x100 : 0x10;
m_scanner->write_bulk(&usbcb, sizeof(usbcb));
if (ret == SCANNER_ERR_SLEEP)
{
system("sh /mnt/flash-disk/low_power.sh 0");
}
}
break;
case USBCommand::SET_USB_INFOR_VIDPID:
@ -712,9 +683,6 @@ int main(int argc, char *argv[])
info.VID = t_vidpid.VID;
info.PID = t_vidpid.PID;
SaveScaninfo(info);
string usbvidpid = "/etc/mdfusbconfig " + to_string(t_vidpid.VID) + " " + to_string(t_vidpid.PID);
LOG("SET_USB_INFOR_VIDPID + %s \n", usbvidpid.c_str());
system(usbvidpid.c_str());
}
break;
case USBCommand::GET_USB_INFOR_VIDPID:
@ -791,7 +759,6 @@ int main(int argc, char *argv[])
std::string lut_path = "/mnt/flash-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;
@ -825,9 +792,10 @@ int main(int argc, char *argv[])
flatinfo.params.datalen = 0;
flatinfo.params.status = 3; // 未知dpi
}
usbcb.Data = flatinfo.value;
printf("flatinfo.params.status:%d flatinfo.params.datalen:%d flatinfo.value:%d\r\n",flatinfo.params.status,flatinfo.params.datalen,flatinfo.value);
printf("flatinfo.params.status:%d\r\n" ,flatinfo.params.status);
printf("flatinfo.params.datalen:%d\r\n" ,flatinfo.params.datalen);
printf("flatinfo.value:%d\r\n",flatinfo.value);
m_scanner->write_bulk(&usbcb, sizeof(usbcb));
if (lut_buffer)
@ -852,6 +820,5 @@ int main(int argc, char *argv[])
LOG("reset scanner \n");
LOG("reset usb \n");
LOG("scanservice exit \n");
writesyslog(LOG_INFO, "usb disconnect! scanservices exit now");
return 0;
}

View File

@ -246,7 +246,8 @@ union HG_ScanConfiguration
unsigned int enableLed : 1;
unsigned int enableSizeDetect : 1;
unsigned int lutmode : 1 ;
unsigned int reversed1 : 4;
unsigned int slow_moire : 1;
unsigned int reversed1 : 3;
unsigned int isCorrect : 1;
unsigned int dstHeight : 8;
unsigned int reversed2 : 6;
@ -358,3 +359,16 @@ union FLAT_INFO
}params;
unsigned int value;
};
#define SLEEP_STATUS_PATH "/mnt/flash-disk/sleep_status.txt"
#define UPDATE_STATUS_PATH "/mnt/flash-disk/update_status.txt"
enum scanner_err
{
SCANNER_ERR_OK = 0, //设备正常状态
SCANNER_ERR_SLEEP, //设备处于休眠当中
SCANNER_ERR_UPDATE_OK, //设备更新:成功
SCANNER_ERR_UPDATE_UPDATAING, //设备更新:进行中
SCANNER_ERR_UPDATE_CHECK_VAL_ERROR, //设备更新:校验检测错误
SCANNER_ERR_UPDATE_CHECK_FILE_LOST, //设备更新:文件丢失
SCANNER_ERR_UPDATE_UNZIP_FAIL, //设备更新:解压失败
};

View File

@ -17,6 +17,9 @@
#define LUT_COLOR_LUT_PATH "/usr/local/huago/color_lut.bmp"
#define LUT_GRAY_LUT_PATH "/usr/local/huago/gray_lut.bmp"
static std::unique_ptr<TypeIO> g_sTypeio;
//using namespace cv;
@ -358,22 +361,32 @@ std::string getmeminfo()
void start_enter_lowpwoer()
{
#ifdef ENABLE_LOWPOWERMODE
// // stop_countdown();
// int seconds=900;
// auto scaninfo= js_config.GetScanInfo();
// if(scaninfo.SleepTime<0||scaninfo.SleepTime<180)
// seconds=180;
// else
// seconds=scaninfo.SleepTime;
// std::string str="sh /etc/countdown.sh start 0 0 "+std::to_string(seconds)+" &";
// LOG("start_enter_lowpwoer %s \n",str.c_str());
// system(str.c_str());
// std::string str="sh /mnt/flash-disk/countdown.sh start 0 0 "+std::to_string(seconds) + " &";
// printf("start_enter_lowpwoer %s \n",str.c_str());
// int ret = system(str.c_str());
printf("system start_enter_lowpwoer :%d\r\n",true);
write_sleep_fifo(true);
#endif
}
void stop_countdown()
{
#ifdef ENABLE_LOWPOWERMODE
system("sh /etc/hgkilltimer.sh");
// int ret = system("sh /mnt/flash-disk/killtimer.sh");
// printf("system stop_countdown :%d\r\n",ret);
//sleep(2);
printf("stop_countdown :%d\r\n",false);
write_sleep_fifo(false);
#endif
}
@ -402,3 +415,53 @@ SMBType GetSMBType()
g_sTypeio = std::make_unique<TypeIO>(CIS_T_S0, CIS_T_S1, CIS_T_S2, CIS_T_S3);
return g_sTypeio->GetMotorType();
}
int creat_sleep_fifo()
{
if (access("/home/root/dev/", F_OK) == -1)
{
system("mkdir /home/root/dev/");
}
int ret = mkfifo("/home/root/dev/sleep", 0666);
if (!ret)
{
perror("mkfifo");
}
sleep_fd_ = open("/home/root/dev/sleep", O_WRONLY);
if(sleep_fd_ < 0)
{
perror("open fifo fail");
}
return sleep_fd_;
}
int write_sleep_fifo(int status)
{
if(sleep_fd_ < 0)
{
perror("write_sleep_fifo open fifo fail");
return sleep_fd_;
}
char buffer[12];
sprintf(buffer,"%d",status);
printf("status:%d\r\n",status);
int ret = write(sleep_fd_,buffer,strlen(buffer));
return ret;
}
//睡眠状态 //更新状态 等等
int get_devs_status(std::string filename)
{
std::ifstream in;
in.open(filename.c_str(),ios::in);
if (!in.is_open())
{
return -1;
}
char buf[1024] = { 0 };
in >> buf;
return atoi(buf);
}

View File

@ -9,6 +9,7 @@
//static cv::Mat lutoldGrayMat; //灰色校正值
//static cv::Mat lutoldColorMat; //彩色校正值
static JsonConfig js_config;
static int sleep_fd_ = 0;
//cv::Mat extractRepresentRow(const cv::Mat& src);
@ -48,3 +49,7 @@ CISVendor GetCisType();
/*获取扫描板类型*/
SMBType GetSMBType();
int creat_sleep_fifo();
int write_sleep_fifo(int status);
int get_devs_status(std::string filename);