newtx/hardware/motor/motorboard.cpp

1000 lines
29 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "motorboard.h"
#include <iostream>
#include <uart/PinMonitor.h>
#include "../uart/uartregsaccess.h"
#include <iomanip>
#include <bitset>
#include <base/utils.h>
#include <base/ui.h>
#include <huagao/hgscanner_error.h>
#include <base/words.h>
#define MOTOR_UART "/dev/ttyS4"
static const std::string loggername = "MotorBoard";
MotorBoard::MotorBoard(std::function<void(int, unsigned int)> evcb)
: devPort(MOTOR_UART), event_cb_(evcb)
, autopaperkeystop(nullptr), mb_events_("motor-events")
{
// LOG_INIT();
//m_uartEnable.reset(new GpioOut(149));
//m_uartEnable->setValue(Gpio::Low);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
m_regsAccess.reset(new UartRegsAccess(devPort, bauds, 0x07, 0x87));
m_intPinMonitor.reset(new PinMonitor(intport, std::bind(&MotorBoard::pin_call, this, std::placeholders::_1)));
//m_uartEnable->setValue(Gpio::High);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
m_os_mode = os_mode();
// m_statecontrol.reset(new StateControl(m_regsAccess,wake));
init_sensor_duty();
}
static int paperinnum = 0;
void MotorBoard::start(void)
{
keep_last_paper=false;
paperinnum = 0;
m_paperout_count = 0;
clear_error();
set_time_error(120);
// set_double_inpect(m_config.g200params.double_feed_enbale);
// set_staple_inpect(m_config.g200params.stable_enbale);
// set_paper_inspect(0);
// set_auto_paper(m_config.g200params.is_autopaper,m_config.g200params.en_anlogic_key);
// set_screw_inpect(m_config.g200params.screw_detect_enable);
// set_screw_level(m_config.g200params.screw_detect_level);
// set_long_paper(true);
// set_double_out_en(m_config.g200params.double_out_en);
unsigned int val;
SMBCONFIG *smbc = (SMBCONFIG *)(&val);
read(0, val);
smbc->enable = 0;
write(0, val);
smbc->enable = 1;
write(0, val);
en_lifter();
}
void MotorBoard::stop()
{
unsigned int val;
SMBCONFIG *smbc = (SMBCONFIG *)(&val);
SMBSTATUS *status = (SMBSTATUS*)&val;
if(this->read(MB_PORT_STATUS, val))
{
if(!status->scan_pulse)
{
utils::to_log(LOG_LEVEL_DEBUG, "ignore 'MotorBoard::stop' command for device is not in working(0x%08x).\n", val);
return;
}
}
printf("MotorBoard Stop \n");
read(0, val);
smbc->enable = 0;
write(0, val);
}
bool MotorBoard::en_lifter()
{
unsigned int val;
SMBCONFIG *smbc = (SMBCONFIG *)(&val);
read(MB_PORT_CONFIG, val);
smbc->lifter_en = 1;
write(MB_PORT_CONFIG, val);
smbc->lifter_en = 0;
return write(MB_PORT_CONFIG, val);
}
void MotorBoard::pick_paper(void)
{
unsigned int val,pick_en;
SMBCONFIG *smbc = (SMBCONFIG *)(&val);
read(MB_PORT_CONFIG, val);
smbc->pick_paper = 0;
write(MB_PORT_CONFIG, val);
std::this_thread::sleep_for(std::chrono::microseconds(400));
smbc->pick_paper = 1;
write(MB_PORT_CONFIG, val);
std::string v_str = std::to_string(m_version);
// if(v_str.size()<8)
return;
uint32_t date = atoi(v_str.substr(2,6).c_str());
#ifdef G100
if(date < 231115)
return;
#else
if(date < 231122)
return;
#endif
std::this_thread::sleep_for(std::chrono::milliseconds(5));
read(0x09,pick_en);
if(!(pick_en&0xffff))
{
smbc->pick_paper = 0;
write(MB_PORT_CONFIG, val);
std::this_thread::sleep_for(std::chrono::microseconds(400));
smbc->pick_paper = 1;
write(MB_PORT_CONFIG, val);
}
// smbc->pick_paper = 0;
// write(MB_PORT_CONFIG, val);
}
void MotorBoard::clean_paper_road(){
unsigned int val;
SMB_FUNC *smbc = (SMB_FUNC *)(&val);
read(6, val);
if(smbc->param.work_mode == 0)
{
smbc->param.func_clean_passthro = 1;
write(6, val);
smbc->param.func_clean_passthro = 0;
write(6, val);
}
else{
printf("\n 非空闲模式不允许清理纸道!!!!");
}
}
void MotorBoard::clear_error()
{
unsigned int val;
SMBCONFIG *smbc = (SMBCONFIG *)(&val);
read(0, val);
smbc->error_clean = 1;
write(0, val);
smbc->error_clean = 0;
write(0, val);
mb_events_.clear();
}
bool MotorBoard::wait_arrival_top(int timeout_ms)
{
return cv_arrival_top.wait(timeout_ms);
}
bool MotorBoard::wait_paper_in(int timeout_ms)
{
return cv_paper_in.wait(timeout_ms);
}
bool MotorBoard::wait_error(int timeout_ms)
{
return cv_error.wait(timeout_ms);
}
bool MotorBoard::wait_paper_out(int timeout_ms)
{
// StopWatch sw;
// LOG_TRACE("wait_paper_out ");
// while(sw.elapsed_ms()<timeout_ms)
// {
// if(m_paperout_count > 0)
// {
// m_paperout_count--;
// return true;
// }
// std::this_thread::sleep_for(std::chrono::milliseconds(1));
// }
// return false;
return cv_paper_out.wait(timeout_ms);
}
bool MotorBoard::wait_done(int timeout_ms)
{
return cv_scan_done.wait(timeout_ms);
}
int MotorBoard::os_mode()
{
// unsigned int val;
// read(MB_PORT_MODE, val);
// SMB_MODE *smb_mode = (SMB_MODE *)&val;
// return smb_mode->scan_mode;
unsigned int val;
read(MB_PORT_FUNCTION,val);
SMB_FUNC smb_func = *(SMB_FUNC*)&val;
return smb_func.param.work_mode == 1;
}
bool MotorBoard::paper_ready()
{
unsigned int val;
read(MB_PORT_MODE, val);
SMB_MODE *smb_mode = (SMB_MODE *)&val;
return smb_mode->feeding_paper_ready;
}
bool MotorBoard::is_scanning()
{
unsigned int val;
read(MB_PORT_MODE, val);
SMB_MODE *smb_mode = (SMB_MODE *)&val;
return smb_mode->work_status;
}
int MotorBoard::paper_counter()
{
unsigned int val;
read(MB_PORT_MODE, val);
SMBMODE *smb_mode = (SMBMODE *)&val;
return smb_mode->scan_num;
}
bool MotorBoard::set_paper_inspect_param(unsigned int value /* = 1000 */)
{
unsigned int val;
if (!read(MB_PORT_CONFIG_EX, val))
return false;
SMBCONFIGEXT *smb_config_ext = (SMBCONFIGEXT *)&val;
smb_config_ext->error_range_set = value;
return write(MB_PORT_CONFIG_EX, val);
}
bool MotorBoard::get_keeplastpaper(){
return keep_last_paper;
}
bool MotorBoard::set_paper_inpect_info(unsigned int value)
{
unsigned int val;
if (!read(MB_PORT_CONFIG_EX, val))
return false;
SMBCONFIGEXT *smb_config_ext = (SMBCONFIGEXT *)&val;
smb_config_ext->paper_infor = value;
return write(MB_PORT_CONFIG_EX, val);
}
bool MotorBoard::set_paper_inspect(bool enable /* = true */)
{
unsigned int val;
if (!read(MB_PORT_CONFIG_EX, val))
return false;
SMBCONFIGEXT *smb_config_ext = (SMBCONFIGEXT *)&val;
smb_config_ext->paper_size_check_en = enable;
return write(MB_PORT_CONFIG_EX, val);
}
bool MotorBoard::set_double_inpect(bool enable)
{
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
// enable?m_statecontrol->lcdcontrol(4):m_statecontrol->lcdcontrol(5);
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
smb_config->double_paper = enable;
return write(MB_PORT_CONFIG, val);
}
bool MotorBoard::get_doublle_inpect()
{
return 0;
}
bool MotorBoard::set_double_out_en(bool enable)
{
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
smb_config->double_out_en = enable;
return write(MB_PORT_CONFIG, val);
}
bool MotorBoard::get_double_out_en()
{
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
return smb_config->double_out_en;
}
bool MotorBoard::set_staple_inpect(bool enable)
{
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
smb_config->staple_enable = enable;
return write(MB_PORT_CONFIG, val);
}
bool MotorBoard::get_staple_inpect()
{
return 0;
}
bool MotorBoard::set_cuospeed(int value)
{
unsigned int val;
if (!read(0x4, val))
return false;
SMBCONFIGEXT *smb_config = (SMBCONFIGEXT *)&val;
smb_config->cuo_speed = value;
return write(MB_PORT_CONFIG_EX, val);
}
// bool MotorBoard::set_en600DPI(bool en)
// {
// unsigned int val;
// if (!read(MB_PORT_CONFIG, val))
// return false;
// SMBCONFIG *smb_config = (SMBCONFIG *)&val;
// smb_config->dpi600 = en?1:0;
// return write(MB_PORT_CONFIG, val);
// }
bool MotorBoard::set_color_mode(int mode)
{
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
smb_config->color_mode = mode;
return write(MB_PORT_CONFIG, val);
}
bool MotorBoard::set_slowmoire(bool en){
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
smb_config->slow_moire = en;
return write(MB_PORT_CONFIG, val);
}
int MotorBoard::get_color_mode()
{
return 0;
}
bool MotorBoard::set_speed_mode(int mode)
{
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
smb_config->speed_set_enable = 1;
smb_config->v_setting = mode;
write(MB_PORT_CONFIG, val);
smb_config->speed_set_enable = 0;
return write(MB_PORT_CONFIG, val);
}
bool MotorBoard::set_speed_mode_v_temp(int mode)
{
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
printf(" set v_tmp = %d \n",mode);
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
smb_config->speed_set_enable = 1;
smb_config->v_temp = mode;
write(MB_PORT_CONFIG, val);
smb_config->speed_set_enable = 0;
return write(MB_PORT_CONFIG, val);
}
int MotorBoard::get_speed_mode()
{
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return -1;
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
return smb_config->v_setting;
}
std::shared_ptr<IRegsAccess> MotorBoard::regs()
{
return m_regsAccess;
}
static int countindex =0;
void MotorBoard::pin_call(unsigned int pinNum)
{
if(!event_cb_)
{
unsigned int val = 0;
if (!read(MB_PORT_STATUS, val))
utils::to_log(LOG_LEVEL_FATAL, "read motorboard status failed.\n");
else
mb_events_.save(val, true);
return;
}
static int index = 0;
// int os_m = os_mode(); //安路屏蔽计数 扫描过程中无法操作按键
// if (m_os_mode != os_m)
// {
// m_os_mode = os_m;
// cv_os_mode.notify_all();
// if (m_glue.m_os_mode_call)
// m_glue.m_os_mode_call(m_os_mode);
// }
// if (m_os_mode) //安路屏蔽计数返回 以刷新计数状态
// {
// LOG_TRACE("not scan mode");
// return;
// }
unsigned int val;
SMBSTATUS *s = (SMBSTATUS *)&val;
if (!read(MB_PORT_STATUS, val))
utils::to_log(LOG_LEVEL_FATAL, "read motorboard status failed.\n");
else
printf("\tmotorboard status = 0x%08X\n", val);
if(s->keep_last_paper) // (val & 0x800)
{
//printf("\n keep_last_paper ");
keep_last_paper=true;
}
if(s->sleep_set) // (val & 0x1000)
{
event_cb_(MOTOR_BORD_EVENT_SLEEP, s->sleep_conf);
}
if(s->arrival_top_int) // (val & 0x80000)
{
event_cb_(MOTOR_BORD_EVENT_LIFTER_READY, 1);
}
if(s->auto_feed)
{
event_cb_(MOTOR_BORD_EVENT_PAPER_READY, 1);
}
if (val & 0x7c003FE)
{
SetKeyState(false);
cv_error.notify_all();
event_cb_(MOTOR_BORD_EVENT_ERROR, val & 0x30efe); //0xefe index of 16:aquireimage error index of bit 17 :size check error
if(val & 0x30efe){
cv_paper_out.notify_all();
m_paperout_count++;
}
errormsg(val & 0x1c003fa);
if((val & 0x4) ||(val & 0x02000000))
{
if(val & 0x4){
PutMsg(STATUS_WORDS_ID(COVER_OPEN), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
set_auto_paper(false,false);
autopaperkeystop?autopaperkeystop():void(0);
// if(m_statecontrol){
// m_statecontrol->setcoverstate(true);
// m_statecontrol->setmenuindex(0);
// }
}
else{
// PutMsg(STATUS_WORDS_ID(READY), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
// m_statecontrol?m_statecontrol->setcoverstate(false):void();
// printf("pin_call(%x)\n", val);
}
return;
}
// if(smb_status->double_clean_f)
// PutMsg(STATUS_WORDS_ID(READY), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
// printf("pin_call(%x)\n", val);
return;
}
else
{
if (!s->scan_pulse)
{
cv_paper_in.notify_all();
unsigned int papercount = 0;
read(MB_PORT_MODE,papercount);
SMBMODE smbmode = *(SMBMODE*)&papercount;
printf("paper in arm count = %d, motorcount = %d\n",++countindex,smbmode.scan_num);
startcapimage(true);
}
if(s->paper_left)
{
cv_paper_out.notify_all();
m_paperout_count++;
//printf("paper out time = %s \n",GetCurrentTimeStamp(2).c_str());
startcapimage(true);
utils::to_log(LOG_LEVEL_DEBUG, "m_paperout_count %d\n", (unsigned int)m_paperout_count);
}
}
if (val & 0x400)
{
cv_scan_done.notify_all();
event_cb_(MOTOR_BORD_EVENT_SCAN_DONE, 1);
cv_paper_out.notify_all();
clear_error();
SetKeyState(false);
}
}
bool MotorBoard::write(unsigned int addr, unsigned int val)
{
return m_regsAccess.get()?m_regsAccess->write(addr, val):false;
}
bool MotorBoard::read(unsigned int addr, unsigned int &val)
{
return m_regsAccess.get()?m_regsAccess->read(addr, val):false;
}
bool MotorBoard::set_time_error(int value){
unsigned int val;
if (!read(MB_PORT_TIME, val))
return false;
SMBCONFIGTIME *smb_config = (SMBCONFIGTIME *)&val;
smb_config->error_time_set = value;
return write(MB_PORT_TIME, val);
}
bool MotorBoard::set_screw_inpect(bool enable)
{
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
smb_config->skew_enable = enable;
return write(MB_PORT_CONFIG, val);
}
bool MotorBoard::get_screw_inpect()
{
unsigned int val;
read(MB_PORT_CONFIG, val);
SMBCONFIG *smb_mode = (SMBCONFIG *)&val;
return smb_mode->skew_enable;
}
bool MotorBoard::set_screw_level(int level)
{
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
smb_config->skew_parameter = level;
return write(MB_PORT_CONFIG, val);
}
bool MotorBoard::set_auto_paper(bool enable,bool enkey){
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
// m_statecontrol?m_statecontrol->setautopaperflag(enable,enkey):void(0);
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
smb_config->autofeed_mode = enable;
return write(MB_PORT_CONFIG, val);
}
bool MotorBoard::set_long_paper(bool enable)
{
unsigned int val;
if (!read(MB_PORT_CONFIG, val))
return false;
SMBCONFIG *smb_config = (SMBCONFIG *)&val;
smb_config->paper = enable;
return write(MB_PORT_CONFIG, val);
}
int MotorBoard::get_screw_level()
{
unsigned int val;
auto ret= read(MB_PORT_CONFIG, val);
if(!ret)
return -1;
SMBCONFIG *smb_mode = (SMBCONFIG *)&val;
return smb_mode->skew_parameter;
}
void MotorBoard::start_countmode()
{
unsigned int regval=0;
read(MB_PORT_FUNCTION,regval);
utils::to_log(LOG_LEVEL_DEBUG, "func6 regval = 0x%08x\n", regval);
SMBFUNC func = *(SMBFUNC*)&regval;
func.param.work_mode =1;
func.param.func_feed_mid = 1;
func.param.func_clear_count = 1;
utils::to_log(LOG_LEVEL_DEBUG, "func6 value = 0x%08x\n", func.value);
write(MB_PORT_FUNCTION,func.value);
func.param.func_encount = 1;
func.param.key_sound = 1;
func.param.func_clear_count = 0;
utils::to_log(LOG_LEVEL_DEBUG, "func6 value = 0x%08x\n", func.value);
write(MB_PORT_FUNCTION,func.value);
func.param.func_encount = 0;
func.param.key_sound = 0;
utils::to_log(LOG_LEVEL_DEBUG, "func6 value = 0x%08x\n",func.value);
write(MB_PORT_FUNCTION,func.value);
}
void MotorBoard::PutMsg(int words, int align_v, int align_h, int font, int clear_method)
{
// devui::send_status_message(words, align_h, align_v, font, clear_method);
}
void MotorBoard::errormsg(uint value)
{
if(value & 0x4)
PutMsg(STATUS_WORDS_ID(COVER_OPEN), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
else if (value & 0x2)
PutMsg(STATUS_WORDS_ID(NO_PAPER), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
else if (value & 0x8)
PutMsg(STATUS_WORDS_ID(FEED_ERR), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
// else if (value & 0x10)
// PutMsg((int)DisType::Dis_Err_JamIn,devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
else if (value & 0x20)
PutMsg(STATUS_WORDS_ID(DOUBLE_FEED), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
else if (value & 0x40)
PutMsg(STATUS_WORDS_ID(STAPLE), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
else if (value & 0x80)
PutMsg(STATUS_WORDS_ID(ASKEW), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
else if (value & 0x00010000)
PutMsg(STATUS_WORDS_ID(CIS_TIMEOUT), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
else if((value & 0x1000010) == 0x1000010)
PutMsg(STATUS_WORDS_ID(JAMMED), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
else if((value & 0x800010) == 0x800010)
PutMsg(STATUS_WORDS_ID(JAMMED), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
else if((value & 0x400010) == 0x400010)
PutMsg(STATUS_WORDS_ID(JAMMED), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
}
void MotorBoard::SetKeyState(bool value)
{
// if(m_statecontrol)
// m_statecontrol->setrunstate(value);
}
void MotorBoard::set_keystopenable(bool value){
unsigned int regval=0;
read(MB_PORT_FUNCTION,regval);
utils::to_log(LOG_LEVEL_DEBUG, "func6 regval = 0x%08x\n", regval);
SMBFUNC func = *(SMBFUNC*)&regval;
func.param.key_stop_enable = value;
write(MB_PORT_FUNCTION, regval);
}
void MotorBoard::set_freq(int motor_choose,int speedmode,int colormode,int dpi)
{
// MotorConfig cf;
// auto params = cf.GetMotorSpeedParams(motor_choose == 1?0:1,MotorConfig::MTBDType::MT_DRV);
// MotorSpeedParam param;
// //printf("\n---node.dpi ==%d && node.colormode == %d && node.speed == %d----- ",dpi,colormode,speedmode);
// for(auto &node : params)
// {
// if(node.dpi == dpi && node.colormode == colormode && node.speed == speedmode)
// {
// param = node.mt_param;
// //printf("\n-------------------------------------------------");
// break;
// }
// }
// std::vector<std::uint32_t> table;
// if(motor_choose == 0)
// {
// int x = 0; // (dpi == 1?(Get_static_jsonconfig().getscannerinfo().chu_motor_speed_200):(dpi == 2?Get_static_jsonconfig().getscannerinfo().chu_motor_speed_300 : Get_static_jsonconfig().getscannerinfo().chu_motor_speed_600));
// unsigned int regval=0;
// read(MB_PORT_FUNCTION,regval);
// SMBFUNC func = *(SMBFUNC*)&regval;
// func.param.motor_choose = motor_choose;
// func.param.wr_en = 1;
// write(MB_PORT_FUNCTION,func.value);
// write(MB_PORT_CONFIG_EX,x);
// //func.param.wr_en = 0;
// //write(MB_PORT_FUNCTION,func.value);
// return ;
// }
// if(motor_choose == 1)
// table = frep_cfg(param.finalPeriod,param.Fmin,param.stepnum,param.a,param.offset,param.finalDelay,param.acceleration_time);
// if(motor_choose == 2)
// table = frep_cfg(param.finalPeriod,param.Fmin,param.stepnum,param.a,param.offset,param.finalDelay,param.acceleration_time);
// if(motor_choose == 3)
// table = frep_cfg(param.finalPeriod,param.Fmin,param.stepnum,param.a,param.offset,param.finalDelay,param.acceleration_time);
// unsigned int regval=0;
// read(MB_PORT_FUNCTION,regval);
// SMBFUNC func = *(SMBFUNC*)&regval;
// int start_addr_cuo = 0;
// #ifdef G200
// if(motor_choose ==1 && speedmode > 1 && dpi <3)
// start_addr_cuo = 63;
// if(motor_choose ==1 && dpi ==3)
// start_addr_cuo = 127;
// #endif
// printf("\nstart_addr_cuo =%d ",start_addr_cuo);
// for(int i =0;i<256;i++)
// {
// func.param.motor_choose = motor_choose;
// func.param.wr_en = 1;
// func.param.motor_addr =i;
// write(MB_PORT_FUNCTION,func.value);
// write(MB_PORT_CONFIG_EX,i<start_addr_cuo?0:table[i-start_addr_cuo]);
// //printf("\nfreq= %x addr =%d ",table[i-start_addr_cuo],i);
// }
// func.param.wr_en = 0;
// write(MB_PORT_FUNCTION,func.value);
}
void MotorBoard::init_statecontrol()
{
m_regsAccess.reset(new UartRegsAccess(devPort, bauds, 0x07, 0x87));
m_intPinMonitor.reset(new PinMonitor(intport, std::bind(&MotorBoard::pin_call, this, std::placeholders::_1)));
std::this_thread::sleep_for(std::chrono::milliseconds(10));
m_os_mode = os_mode();
// m_statecontrol.reset(new StateControl(m_regsAccess,m_wake));
// m_statecontrol->setautopaperstopcallback([&]{
// autopaperkeystop?autopaperkeystop():void(0);
// if(m_config.g200params.is_autopaper)
// set_auto_paper(false,false);
// });
init_sensor_duty();
// PutMsg(STATUS_WORDS_ID(READY), devui::ALIGN_COMPONENT_MID, devui::ALIGN_COMPONENT_MID);
printf("init_statecontrol()\n");
}
void MotorBoard::release_statecontrol()
{
if(autopaperkeystop.operator bool())
autopaperkeystop();
set_auto_paper(false,false);
// m_statecontrol.reset();
m_regsAccess.reset();
m_intPinMonitor.reset();
}
void MotorBoard::setautopaperkeystopcallback(std::function<void()> func){
if(func)
autopaperkeystop = func;
// m_statecontrol?m_statecontrol->setautopaperstopcallback([&]{
// autopaperkeystop?autopaperkeystop():void(0);
// set_auto_paper(false,false);
// }):void(0);
}
void MotorBoard::startcapimage(bool value)
{
// if(m_config.g200params.is_fixedpaper)
// return;
FILE *fp = fopen("/sys/class/tty/ttyUSB0/device/huagao_scanner", "w");
if (fp == NULL)
perror("startcapimage open filed");
else{
fprintf(fp, "%d", value ? 1 : 0);
fclose(fp);
}
}
bool MotorBoard::set_sensor_pwm_duty(int sensorid,int duty)
{
//1扫描2开盖3歪斜—14歪斜-25出纸口6有无纸
printf("set_sensor_pwm_duty type = %d duty = %d \n",sensorid,duty);
unsigned int val;
if (!read(MB_PORT_TIME, val))
return false;
if(sensorid< 1 || sensorid >6)
return false;
if(duty< 2 || duty > 90)
return false;
SMBCONFIGTIME *smb_config_time = (SMBCONFIGTIME *)&val;
smb_config_time->sen_duty_set_sel = sensorid;
smb_config_time->duty_set = duty*8+50;
write(MB_PORT_TIME, val);
smb_config_time->sen_duty_set_sel = 0;
return write(MB_PORT_TIME, val);
}
bool MotorBoard::enable_sensor_pwm(int sensorid,bool en)
{
std::uint32_t val;
if (!read(MB_PORT_TIME, val))
return false;
if(sensorid< 1 || sensorid >6)
return false;
std::bitset<32> bit(val);
bit.set(sensorid+6,en);
val = bit.to_ulong();
printf("enable_sensor_pwm = %d \n",val);
return write(MB_PORT_TIME, val);
}
bool MotorBoard::set_ultrasonic_param(int type,int value){
//1双张检测周期2有无纸检测周期3双张阈值4单张阈值
unsigned int val;
if (!read(MB_PORT_ULTROSONIC, val))
return false;
if(type< 1 || type >4)
return false;
printf("set_ultrasonic_param type = %d value = %d \n",type,value);
SMB_Ultrasonic_Config *tmp = (SMB_Ultrasonic_Config *)&val;
switch (type)
{
case 1:
tmp->param.double_check_cyc = value;
break;
case 2:
tmp->param.paper_check_cyc = value;
break;
case 3:
tmp->param.double_max = value;
break;
case 4:
tmp->param.single_max = value;
break;
default:
break;
}
printf("val = %d \n",val);
tmp->param.send_cyc_en = 1;
write(MB_PORT_ULTROSONIC,val);
tmp->param.send_cyc_en = 0;
return write(MB_PORT_ULTROSONIC,val);
}
void MotorBoard::init_sensor_duty()
{
// auto p = Get_Static_SC().get_mem_param();
// std::vector<uint32_t> params(sizeof(SensorConfig::SensorConfig_Param)/sizeof(uint32_t));
// memcpy(&params[0],&p,sizeof(SensorConfig::SensorConfig_Param));
// for(int i = 0;i<params.size();i++){
// if(((i >= 0) || (i < 6)) && (params[i] < 100))
// {
// set_sensor_pwm_duty(i+1,params[i]);
// }
// if((i >= 6) || (i < 10))
// {
// set_ultrasonic_param(i-5,params[i]);
// }
// }
}
std::uint32_t MotorBoard::get_ultrasonic_version(){
unsigned int val;
if (!read(MB_PORT_ULTROSONIC, val))
return 0;
SMB_Ultrasonic_Config *tmp = (SMB_Ultrasonic_Config *)&val;
tmp->param.rd_ver_en = 1;
write(MB_PORT_ULTROSONIC,val);
tmp->param.rd_ver_en = 0;
write(MB_PORT_ULTROSONIC,val);
std::this_thread::sleep_for(std::chrono::milliseconds(10));
read(0x08,val);
return val;
}
std::string MotorBoard::getmbversion(){
uint32_t value = 0;
read(MB_PORT_VERSION, value);
m_version = value;
printf("mb version: = %s \n", std::to_string(value).c_str());
return std::to_string(value);
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
bool MotorBoard::wait_event(int event, int *evdata, int to_ms, int* fatal_ev, int* fatal_msg)
{
bool waited = false;
int evd = 0, fe = 0, msg = 0;
chronograph watch;
if(!evdata)
evdata = &evd;
if(!fatal_ev)
fatal_ev = &fe;
if(!fatal_msg)
fatal_msg = &msg;
*fatal_ev = 0;
while(watch.elapse_ms() < to_ms)
{
int val = 0;
SMBSTATUS *s = (SMBSTATUS *)&val;
// if (!read(MB_PORT_STATUS, val))
if(!mb_events_.take(val))
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
continue;
}
else if(val <= 1)
{
std::this_thread::sleep_for(std::chrono::milliseconds(1));
continue;
}
if(s->arrival_top_int) // (val & 0x80000)
{
if(event == MOTOR_BORD_EVENT_LIFTER_READY)
{
*evdata = 1;
waited = true;
break;
}
}
if(s->auto_feed)
{
if(event == MOTOR_BORD_EVENT_PAPER_READY)
{
*evdata = 1;
waited = true;
break;
}
}
if(s->paper_left)
{
startcapimage(true);
if(event == MOTOR_BORD_EVENT_PAPER_PASSING)
{
*evdata = 0;
waited = true;
break;
}
}
if(s->motor_status)
{
*evdata = 0;
if(event == MOTOR_BORD_EVENT_SCAN_DONE)
{
waited = true;
}
else
{
*fatal_ev = MOTOR_BORD_EVENT_SCAN_DONE;
}
break;
}
if(!s->scan_pulse)
startcapimage(true);
if (val & 0x7c003FE)
{
*fatal_ev = MOTOR_BORD_EVENT_ERROR;
if(s->m1_paper_sin)
{
*evdata = SCANNER_ERR_DEVICE_NO_PAPER;
*fatal_msg = ID_WORDS_STATUS_NO_PAPER;
}
else if(s->open_machine)
{
*evdata = SCANNER_ERR_DEVICE_COVER_OPENNED;
*fatal_msg = ID_WORDS_STATUS_COVER_OPEN;
}
else if(s->pick_failed)
{
*evdata = SCANNER_ERR_DEVICE_FEEDING_PAPER;
*fatal_msg = ID_WORDS_STATUS_FEED_ERR;
}
else if(s->stop_jam && (s->jam_1 || s->jam_2 || s->jam_3))
{
*evdata = SCANNER_ERR_DEVICE_PAPER_JAMMED;
*fatal_msg = ID_WORDS_STATUS_JAMMED;
}
else if(s->double_paper)
{
*evdata = SCANNER_ERR_DEVICE_DOUBLE_FEEDING;
*fatal_msg = ID_WORDS_STATUS_DOUBLE_FEED;
}
else if(s->staple)
{
*evdata = SCANNER_ERR_DEVICE_STAPLE_ON;
*fatal_msg = ID_WORDS_STATUS_STAPLE;
}
else if(s->papertilted)
{
*evdata = SCANNER_ERR_DEVICE_PAPER_SKEW;
*fatal_msg = ID_WORDS_STATUS_ASKEW;
}
break;
}
}
// printf("\twait event %d = %s: evdata = %d, fatal_ev = %d\n", event, waited ? "true" : "false"
// , *evdata, *fatal_ev);
return waited;
}