From 72cdcf9147446191ce2526f44e5c1b634bda22ad Mon Sep 17 00:00:00 2001 From: zhaohe Date: Tue, 1 Aug 2023 15:20:28 +0800 Subject: [PATCH] =?UTF-8?q?=E9=BB=91=E7=99=BD=E6=89=AB=E7=A0=81OK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- decode.c | 31 + scan_code_tester/config.js | 36 + scan_code_tester/index.html | 1153 +++++++++++++++++++++++++++ sdk | 2 +- usrc/main.cpp | 13 +- usrc/one_dimensional_code_laser_scanner.cpp | 47 +- usrc/one_dimensional_code_laser_scanner.hpp | 8 +- 7 files changed, 1280 insertions(+), 10 deletions(-) create mode 100644 decode.c create mode 100644 scan_code_tester/config.js create mode 100644 scan_code_tester/index.html diff --git a/decode.c b/decode.c new file mode 100644 index 0000000..6c974a1 --- /dev/null +++ b/decode.c @@ -0,0 +1,31 @@ +#include +#include + +#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; +} diff --git a/scan_code_tester/config.js b/scan_code_tester/config.js new file mode 100644 index 0000000..8e65156 --- /dev/null +++ b/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, + }, +}; + + + diff --git a/scan_code_tester/index.html b/scan_code_tester/index.html new file mode 100644 index 0000000..72d681d --- /dev/null +++ b/scan_code_tester/index.html @@ -0,0 +1,1153 @@ + + + + + + + + 板夹仓测试工具 + + + +
+
+
+ + +
+

当前状态: 未连接

+
+
+ + + +
+
+
+
+

上报解析

+
+

ADDRESS:

+ +
+
+

VALUE:

+ +
+
+
+

回执解析

+
+

ADDRESS:

+ +
+
+

VALUE:

+ +
+
+

结果:

+ +
+
+
+
    +
  • 通用指令
  • +
  • 指令列表
  • +
+
+
+
+
+

ID

+ +
+
+

BASE

+ +
+
+

OFFSET

+ +
+
+

VALUE

+ +
+
+
+ + + + +
+
+
+
+
+
+
+
+
+
+
+

ID

+ +
+
+

BASE

+ +
+
+

OFFSET

+ +
+
+
+

状态

+
+

异常

+ + +
+
+

状态

+ + +
+
+

位置

+ + +
+
+
+

配置

+
+

反复运动启始位置

+ + + +
+
+

反复运动终止位置

+ + + +
+
+

运行时速度配置

+ + + +
+
+
+

动作

+
+

舵机移动到角度

+ + +
+
+

舵机停止

+ + +
+
+

清除异常

+ + +
+
+

反复运动

+ + +
+
+
+
+
+
+

ID

+ +
+
+

BASE

+ +
+
+

OFFSET

+ +
+
+
+

状态

+
+

设备状态

+ + +
+
+

异常状态

+ + +
+
+

当前转速

+ + +
+
+

当前位置

+ + +
+
+
+

配置

+
+

加速度

+ + + +
+
+

减速度

+ + + +
+
+

速度

+ + + +
+
+

零点偏移

+ + + +
+
+

归零速度

+ + + +
+
+

归零减速度

+ + + +
+
+

归零最大位移

+ + + +
+
+

归零第一阶段移动距离

+ + + +
+
+
+

动作

+
+

速度模式控制

+ + +
+
+

位置模式控制

+ + +
+
+

位置模式相对位置

+ + +
+
+

归零

+ + +
+
+

零位校准

+ + +
+
+

停止

+ + +
+
+

清空异常

+ + +
+
+
+
+
+
+
+
+
+ +
+ + +
+
+
+
+ + + + + + diff --git a/sdk b/sdk index 5aa192c..43beaed 160000 --- a/sdk +++ b/sdk @@ -1 +1 @@ -Subproject commit 5aa192ca54d7e03866bfd9132f293d85f192e4a7 +Subproject commit 43beaedd3e6c3b1b45cd8796e496902c03699a28 diff --git a/usrc/main.cpp b/usrc/main.cpp index d54d493..f8cd2cd 100644 --- a/usrc/main.cpp +++ b/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); } diff --git a/usrc/one_dimensional_code_laser_scanner.cpp b/usrc/one_dimensional_code_laser_scanner.cpp index 354e1ee..8c9d35a 100644 --- a/usrc/one_dimensional_code_laser_scanner.cpp +++ b/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); } diff --git a/usrc/one_dimensional_code_laser_scanner.hpp b/usrc/one_dimensional_code_laser_scanner.hpp index 19361a1..18684ab 100644 --- a/usrc/one_dimensional_code_laser_scanner.hpp +++ b/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);