|
|
@ -15,7 +15,45 @@ bool m_idleLevel = true; |
|
|
|
void OneDimensionalCodeLaserScanner::initialize(IflytopCanProtocolStackProcesser* protocolProcesser, int32_t regStartOff, Pin_t triggerPin, |
|
|
|
PosReadder_t readder) { |
|
|
|
m_protocolProcesser = protocolProcesser; |
|
|
|
|
|
|
|
|
|
|
|
m_protocolProcesser->activeReg(REG_CODE_SCANER_ACT_CTRL, icps::kw, 0); |
|
|
|
m_protocolProcesser->activeReg(REG_CODE_SCANER_ACT_CLEAR_EXCEPTION, icps::kw, 0); |
|
|
|
m_protocolProcesser->activeReg(REG_CODE_SCANER_STAT_STATUS, icps::kr, 0); |
|
|
|
m_protocolProcesser->activeReg(REG_CODE_SCANER_STAT_EXCEPTION, icps::kr, 0); |
|
|
|
m_protocolProcesser->activeReg(REG_CODE_SCANER_CODE, icps::kr, 0); |
|
|
|
|
|
|
|
m_triggerGpio.initAsInput(triggerPin, ZGPIO::kMode_nopull, ZGPIO::kIRQ_risingAndFallingIrq, false /*mirror*/); |
|
|
|
m_protocolProcesser->registerListener(this); |
|
|
|
} |
|
|
|
|
|
|
|
bool OneDimensionalCodeLaserScanner::isThisRegOwnToMe(IflytopCanProtocolStackProcesser* processer, icps::Reg_t* reg) { //
|
|
|
|
switch (reg->add) { |
|
|
|
case REG_CODE_SCANER_ACT_CTRL: |
|
|
|
case REG_CODE_SCANER_ACT_CLEAR_EXCEPTION: |
|
|
|
return true; |
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
return false; |
|
|
|
} |
|
|
|
icps::error_t OneDimensionalCodeLaserScanner::onHostRegisterWriteEvent(IflytopCanProtocolStackProcesser* processer, IflytopCanProtocolStackWriteEvent* writeEvent) { |
|
|
|
switch (writeEvent->reg->add) { |
|
|
|
case REG_CODE_SCANER_ACT_CTRL: |
|
|
|
if (writeEvent->newvalue == 1) { |
|
|
|
startScan(); |
|
|
|
} else if (writeEvent->newvalue == 0) { |
|
|
|
stopScan(); |
|
|
|
parseResult(); |
|
|
|
} else { |
|
|
|
return icps::kIllegalValue; |
|
|
|
} |
|
|
|
return icps::kSuccess; |
|
|
|
case REG_CODE_SCANER_ACT_CLEAR_EXCEPTION: |
|
|
|
return icps::kSuccess; |
|
|
|
default: |
|
|
|
break; |
|
|
|
} |
|
|
|
return icps::kRegNotFound; |
|
|
|
} |
|
|
|
|
|
|
|
void OneDimensionalCodeLaserScanner::startScan() { |
|
|
@ -41,7 +79,7 @@ bool OneDimensionalCodeLaserScanner::getPosLevel(int pos) { |
|
|
|
return m_idleLevel; |
|
|
|
} |
|
|
|
|
|
|
|
for (size_t i = 0; i < m_off; i++) { |
|
|
|
for (int i = 0; i < m_off; i++) { |
|
|
|
nowlevel = !nowlevel; |
|
|
|
if (i + 1 < m_off) { |
|
|
|
if (pos >= m_posChache[i] && pos < m_posChache[i + 1]) { |
|
|
@ -59,18 +97,26 @@ bool OneDimensionalCodeLaserScanner::getPosLevel(int pos) { |
|
|
|
void OneDimensionalCodeLaserScanner::parseResult() { //
|
|
|
|
static uint8_t code[500] = {0}; |
|
|
|
|
|
|
|
printf("scan raw result:\n"); |
|
|
|
printf("(%d)", m_idleLevel); |
|
|
|
printf("%d ", startpos); |
|
|
|
for (int i = 0; i < m_off; i++) { |
|
|
|
printf("%d ", m_posChache[i]); |
|
|
|
} |
|
|
|
printf("%d ", endpos); |
|
|
|
printf("\r\n"); |
|
|
|
//
|
|
|
|
int32_t sp = m_posChache[0]; |
|
|
|
int32_t ep = endpos; |
|
|
|
|
|
|
|
int32_t len = ep - sp; |
|
|
|
// 把 len分成500份
|
|
|
|
for (size_t i = 0; i < 500; i++) { |
|
|
|
for (int i = 0; i < 500; i++) { |
|
|
|
code[i] = getPosLevel((int32_t)(sp + len / 500.0 * i)); |
|
|
|
} |
|
|
|
|
|
|
|
printf("scanresult:"); |
|
|
|
for (size_t i = 0; i < 500; i++) { |
|
|
|
printf("scanresult:\n"); |
|
|
|
for (int i = 0; i < 500; i++) { |
|
|
|
printf("%d", code[i]); |
|
|
|
} |
|
|
|
printf("\r\n"); |
|
|
|