Browse Source

黑白扫码OK

master
zhaohe 2 years ago
parent
commit
72cdcf9147
  1. 31
      decode.c
  2. 36
      scan_code_tester/config.js
  3. 1153
      scan_code_tester/index.html
  4. 2
      sdk
  5. 13
      usrc/main.cpp
  6. 47
      usrc/one_dimensional_code_laser_scanner.cpp
  7. 8
      usrc/one_dimensional_code_laser_scanner.hpp

31
decode.c

@ -0,0 +1,31 @@
#include <stdint.h>
#include <stdio.h>
#define BITVAL(code, off) ((code & (1 << off)) >> off)
void decode(uint32_t rawcode) {
// Lot:3:6
// bit3->bit3, bit4->bit2, bit5->bit1, bit6->bit0
uint32_t lot = 0;
lot = BITVAL(rawcode, 3) << 3 | BITVAL(rawcode, 4) << 2 | BITVAL(rawcode, 5) << 1 | BITVAL(rawcode, 6) << 0;
// =(bit1)*2^6+(bit2)*2^5+(bit11)*2^4+(bit10)*2^0+(bit9)*2^1+(bit8)*2^2+(bit7)*2^3
uint32_t item = 0;
item = (BITVAL(rawcode, 1) << 6) //
| (BITVAL(rawcode, 2) << 5) //
| (BITVAL(rawcode, 11) << 4) //
| (BITVAL(rawcode, 10) << 0) //
| (BITVAL(rawcode, 9) << 1) //
| (BITVAL(rawcode, 8) << 2) //
| (BITVAL(rawcode, 7) << 3);
printf(" item-lot: %d-%d\n", item, lot);
}
int main(int argc, char const *argv[]) {
decode(0x48C1); // 0x48C1 100 1000 1100 0001 ,expect24-1
decode(0x443B); // 0x443B 100 0100 0011 1011 ,expect65-14
decode(0x45c1); // 0x443B 100 0100 0011 1011 ,expect65-14
return 0;
}

36
scan_code_tester/config.js

@ -0,0 +1,36 @@
const websocketAddress = "ws://192.168.1.100:19001";
const config = {
// 256333
打开工程师模式: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":2,"ctrlPointVal":1}}`,
关闭工程师模式: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":2,"ctrlPointVal":0}}`,
推杆电机_归零: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":10103,"ctrlPointVal":1000}}`,
STEP1_设置_推杆电机_最快速度: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":10122,"ctrlPointVal":1000000}}`,
STEP2_推杆电机_移动到扫码开始位置: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":10101,"ctrlPointVal":517000}}`,
STEP3_设置_推杆电机_扫码速度: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":10122,"ctrlPointVal":100000}}`,
STEP4_板夹开始扫码: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":30000,"ctrlPointVal":1}}`,
STEP5_推杆电机_移动推出位置: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":10101,"ctrlPointVal":719133}}`,
STEP6_板夹停止扫码: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":30000,"ctrlPointVal":0}}`,
STEP7_设置_推杆电机_最快速度: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":10122,"ctrlPointVal":1000000}}`,
STEP8_板夹移动到零位: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":10101,"ctrlPointVal":0}}`,
推杆电机_停止: `{"protocol":"icpsv1","message":{"type":"write","targetId":133,"sourceId":1,"seq":0,"ctrlPointAddr":10108,"ctrlPointVal":0}}`,
};
const commonMessage = {
protocol: "iflytopCanProtocolStackV1",
message: {
attribute: "normal",
priority: 4,
type: "write",
targetId: 133,
sourceId: 1,
seq: 0,
ctrlPointAddr: 10500,
ctrlPointVal: 1,
},
};

1153
scan_code_tester/index.html
File diff suppressed because it is too large
View File

2
sdk

@ -1 +1 @@
Subproject commit 5aa192ca54d7e03866bfd9132f293d85f192e4a7
Subproject commit 43beaedd3e6c3b1b45cd8796e496902c03699a28

13
usrc/main.cpp

@ -224,12 +224,19 @@ void Main::run() {
m_tjMotorControlService.cfg_runtohome_max_distance->setVal(INT32_MAX);
m_tjMotorControlService.cfg_runtohome_leave_zero_point_distance->setVal(256 * 200 * 1);
// bwm_gpio
{
#if 0
:518400
:659200
#endif
OneDimensionalCodeLaserScanner::cfg_t cfg;
cfg.triggerPin = FYBJL_SENSOR0;
cfg.codestartpos = 0;
cfg.codeendpos = 0;
cfg.codestartpos = 518500;
cfg.codeendpos = 659200;
cfg.readder = [this]() { return m_tj_motor.getXACTUAL(); };
m_oneDimensionalCodeLaserScanner.initialize(&m_protocolStack, REG_LARSER_SCANNER_CTRL_ADD_BASE, &cfg);
}

47
usrc/one_dimensional_code_laser_scanner.cpp

@ -19,8 +19,10 @@ void OneDimensionalCodeLaserScanner::initialize(IflytopCanProtocolStackProcesser
m_statusReg = m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_STAT_STATUS, icps::kr, 0);
m_errReg = m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_STAT_ERROR, icps::kr, 0);
m_codeReg = m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_CODE, icps::kr, 0);
m_item = m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_ITEM, icps::kr, 0);
m_lot = m_protocolProcesser->activeReg(m_slave, REG_CODE_SCANER_LOT, icps::kr, 0);
m_triggerGpio.initAsInput(m_cfg.triggerPin, ZGPIO::kMode_nopull, ZGPIO::kIRQ_risingAndFallingIrq, false /*mirror*/);
m_triggerGpio.initAsInput(m_cfg.triggerPin, ZGPIO::kMode_nopull, ZGPIO::kIRQ_risingAndFallingIrq, true /*mirror*/);
m_triggerGpio.regListener([this](ZGPIO* GPIO_Pin, ZGPIO::IrqTypeEvent_t irqevent) { onGpioIrq(GPIO_Pin, irqevent); });
m_readder = m_cfg.readder;
}
@ -52,11 +54,13 @@ void OneDimensionalCodeLaserScanner::startScan() {
m_workflag = true;
m_idleLevel = m_triggerGpio.getState();
m_startpos = m_readder();
ZLOGI(TAG, "start scan startpos:%d", m_startpos);
}
void OneDimensionalCodeLaserScanner::stopScan() {
CriticalContext cc;
m_workflag = false;
m_endpos = m_readder();
ZLOGI(TAG, "stop scan endpos:%d", m_endpos);
}
bool OneDimensionalCodeLaserScanner::getPosLevel(int pos) {
@ -90,11 +94,36 @@ int32_t OneDimensionalCodeLaserScanner::compute_point_num(int32_t startpos, int3
}
void OneDimensionalCodeLaserScanner::dumpcodecache(code_cache_t* cache) {
#if 0
ZLOGI(TAG, "startpos:%d,endpos:%d,pointnum:%d", cache->startpos, cache->endpos, cache->pointnum);
for (int i = 0; i < cache->pointnum; i++) {
printf("%d", cache->codecache[i]);
}
printf("\n");
#endif
}
#define BITVAL(code, off) ((code & (1 << off)) >> off)
void OneDimensionalCodeLaserScanner::decode(uint32_t rawcode) { //
// Lot:3:6
// bit3->bit3, bit4->bit2, bit5->bit1, bit6->bit0
uint32_t lot = 0;
lot = BITVAL(rawcode, 3) << 3 | BITVAL(rawcode, 4) << 2 | BITVAL(rawcode, 5) << 1 | BITVAL(rawcode, 6) << 0;
// =(bit1)*2^6+(bit2)*2^5+(bit11)*2^4+(bit10)*2^0+(bit9)*2^1+(bit8)*2^2+(bit7)*2^3
uint32_t item = 0;
item = (BITVAL(rawcode, 1) << 6) //
| (BITVAL(rawcode, 2) << 5) //
| (BITVAL(rawcode, 11) << 4) //
| (BITVAL(rawcode, 10) << 0) //
| (BITVAL(rawcode, 9) << 1) //
| (BITVAL(rawcode, 8) << 2) //
| (BITVAL(rawcode, 7) << 3);
ZLOGI(TAG, "item-lot: %d-%d\n", item, lot);
m_item->setValue(item);
m_lot->setValue(lot);
}
void OneDimensionalCodeLaserScanner::parsecode(code_cache_t* cache) { //
@ -156,12 +185,20 @@ void OneDimensionalCodeLaserScanner::parsecode(code_cache_t* cache) { //
}
m_errReg->setValue(kerr_success);
m_codeReg->setValue(code);
ZLOGI(TAG, "parse success,code:%d", code);
printf("code:");
for (int i = 0; i < 15; i++) {
printf("%d", bits[i]);
}
printf("\n");
ZLOGI(TAG, "parse success,code:0x%0x", (uint32_t)code);
decode(code);
// return;
}
void OneDimensionalCodeLaserScanner::parseResult() { //
m_codeReg->setValue(-1);
m_item->setValue(-1);
m_lot->setValue(-1);
static code_cache_t rawcodecache = {0};
memset(&rawcodecache, 0, sizeof(rawcodecache));
@ -172,7 +209,7 @@ void OneDimensionalCodeLaserScanner::parseResult() { //
int32_t len = m_endpos - m_startpos;
int32_t pointnum = compute_point_num(m_startpos, m_endpos);
ZLOGI(TAG, "pointnum:%d", len, pointnum);
ZLOGI(TAG, "pointnum:%d", pointnum);
if ((size_t)pointnum > sizeof(rawcodecache.codecache)) {
ZLOGE(TAG, "len too long");
@ -199,7 +236,7 @@ void OneDimensionalCodeLaserScanner::parseResult() { //
*
*/
int32_t sp = m_posChache[0];
int32_t sp = m_startpos;
int32_t ep = m_endpos;
for (int i = 0; i < pointnum; i++) {
@ -223,7 +260,7 @@ void OneDimensionalCodeLaserScanner::parseResult() { //
rawcodecache.startpos = m_cfg.codestartpos;
rawcodecache.pointnum = after_cut_code_nums;
rawcodecache.endpos = m_cfg.codeendpos;
memcpy(rawcodecache.codecache, rawcodecache.codecache + startpointoff, after_cut_code_nums);
memmove(rawcodecache.codecache, rawcodecache.codecache + startpointoff, after_cut_code_nums);
ZLOGI(TAG, "after_cut: code_nums:%d,cutoff:%d", after_cut_code_nums, startpointoff);
}

8
usrc/one_dimensional_code_laser_scanner.hpp

@ -11,6 +11,8 @@
#define REG_CODE_SCANER_STAT_STATUS (5) // 设备状态
#define REG_CODE_SCANER_STAT_ERROR (6) // 上次采集结果是否有误
#define REG_CODE_SCANER_CODE (7) // 码存放的地方
#define REG_CODE_SCANER_ITEM (8) // 码存放的地方
#define REG_CODE_SCANER_LOT (9) // 码存放的地方
namespace iflytop {
using namespace std;
@ -59,6 +61,8 @@ class OneDimensionalCodeLaserScanner : public ICPSListener {
icps::Reg_t* m_statusReg = NULL;
icps::Reg_t* m_errReg = NULL;
icps::Reg_t* m_codeReg = NULL;
icps::Reg_t* m_item = NULL;
icps::Reg_t* m_lot = NULL;
ZGPIO m_triggerGpio;
bool m_workflag = false;
@ -84,7 +88,9 @@ class OneDimensionalCodeLaserScanner : public ICPSListener {
void parseResult();
private:
void parsecode(code_cache_t* cache);
void parsecode(code_cache_t* cache);
void decode(uint32_t rawcode);
int32_t compute_point_num(int32_t startpos, int32_t endpos);
void dumpcodecache(code_cache_t* cache);

Loading…
Cancel
Save