5 changed files with 223 additions and 2 deletions
-
BINcomponents/sensors/m3078/M03078_OEM产品手册_V1.1.4.pdf
-
118components/sensors/m3078/m3078_code_scaner.cpp
-
103components/sensors/m3078/m3078_code_scaner.hpp
-
2components/zprotocols/zcancmder_v2
-
2os/zthread.hpp
@ -0,0 +1,118 @@ |
|||
#include "m3078_code_scaner.hpp"
|
|||
|
|||
#include <stdlib.h>
|
|||
#include <string.h>
|
|||
|
|||
using namespace iflytop; |
|||
using namespace std; |
|||
|
|||
#define TAG "m3078"
|
|||
void M3078CodeScanner::initialize(int moduleid, hardware_config_t* hardwareconfig) { |
|||
ZUART::cfg_t cfg = { |
|||
.name = "m3078", |
|||
.huart = hardwareconfig->uart, |
|||
.rxbuffersize = ZARRAY_SIZE(codecache) - 1, |
|||
.rxovertime_ms = 10, |
|||
}; |
|||
|
|||
m_uart.initialize(&cfg); |
|||
m_uart.setrxcb([this](uint8_t* data, size_t len) { |
|||
if (m_codeisready) return; |
|||
if (len > 0) { |
|||
codecachelen = len; |
|||
memcpy(codecache, data, len); |
|||
codecache[len] = 0; |
|||
m_codeisready = true; |
|||
} |
|||
}); |
|||
m_uart.startRxIt(); |
|||
|
|||
m_triggerGpio.initAsOutput(hardwareconfig->triggerPin, ZGPIO::kMode_nopull, false, false); |
|||
} |
|||
void M3078CodeScanner::trigger() { |
|||
m_codeisready = false; |
|||
m_triggerGpio.setState(0); |
|||
zos_delay(3); |
|||
m_uart.clearRxData(); |
|||
m_triggerGpio.setState(1); |
|||
} |
|||
void M3078CodeScanner::stopTrigger() { m_triggerGpio.setState(0); } |
|||
|
|||
bool M3078CodeScanner::idInfoIsReady() { return m_codeisready; } |
|||
char* M3078CodeScanner::getIdinfo() { return codecache; } |
|||
void M3078CodeScanner::clearIdinfo() { |
|||
memset(codecache, 0, sizeof(codecache)); |
|||
codecachelen = 0; |
|||
m_codeisready = false; |
|||
} |
|||
|
|||
size_t M3078CodeScanner::getIdinfoLen() { return codecachelen; } |
|||
|
|||
int32_t M3078CodeScanner::module_stop() { |
|||
stopTrigger(); |
|||
return 0; |
|||
} |
|||
int32_t M3078CodeScanner::module_break() { |
|||
stopTrigger(); |
|||
return 0; |
|||
} |
|||
int32_t M3078CodeScanner::module_start() { |
|||
trigger(); |
|||
return 0; |
|||
} |
|||
|
|||
#define ACTION_NULL ;
|
|||
#define REG(param_id, readaction, writeacton) \
|
|||
case param_id: { \ |
|||
if (read) { \ |
|||
readaction; \ |
|||
} else { \ |
|||
writeacton; \ |
|||
} \ |
|||
} |
|||
|
|||
int32_t M3078CodeScanner::module_xxx_reg(int32_t param_id, bool read, int32_t& val) { |
|||
switch (param_id) { |
|||
REG(kreg_module_version, /* */ val = 0x0001, ACTION_NULL); |
|||
REG(kreg_module_type, /* */ val = 0, ACTION_NULL); |
|||
REG(kreg_module_status, /* */ val = read_status(), ACTION_NULL); |
|||
REG(kreg_module_errorcode, /* */ val = 0, ACTION_NULL); |
|||
REG(kreg_module_initflag, /* */ val = module_get_inited_flag(), module_set_inited_flag(val)); |
|||
REG(kreg_module_enableflag, /* */ val = 1, ACTION_NULL); |
|||
REG(kreg_module_last_cmd_exec_status, val = 0, ACTION_NULL); |
|||
default: |
|||
return err::kmodule_not_find_config_index; |
|||
break; |
|||
} |
|||
return 0; |
|||
} |
|||
|
|||
int32_t M3078CodeScanner::module_set_reg(int32_t param_id, int32_t param_value) { return module_xxx_reg(param_id, false, param_value); } |
|||
int32_t M3078CodeScanner::module_get_reg(int32_t param_id, int32_t* param_value) { return module_xxx_reg(param_id, true, *param_value); } |
|||
|
|||
int32_t M3078CodeScanner::code_scaner_start_scan() { |
|||
ZLOGI(TAG, "code_scaner_start_scan"); |
|||
return module_start(); |
|||
} |
|||
int32_t M3078CodeScanner::code_scaner_stop_scan() { |
|||
ZLOGI(TAG, "code_scaner_stop_scan"); |
|||
return module_stop(); |
|||
} |
|||
int32_t M3078CodeScanner::code_scaner_read_scaner_result(int32_t startadd, uint8_t* data, int32_t* len) { |
|||
ZLOGI(TAG, "code_scaner_read_scaner_result"); |
|||
if (codecachelen > *len) { |
|||
return err::kbuffer_not_enough; |
|||
} |
|||
*len = codecachelen; |
|||
memcpy(data, codecache, codecachelen); |
|||
return 0; |
|||
} |
|||
int32_t M3078CodeScanner::read_status() { |
|||
if (m_triggerGpio.getState() == 0) { |
|||
return 0; |
|||
} |
|||
if (m_codeisready) { |
|||
return 0; |
|||
} |
|||
return 1; |
|||
} |
@ -0,0 +1,103 @@ |
|||
//
|
|||
// Created by zwsd
|
|||
//
|
|||
|
|||
#pragma once
|
|||
#include "sdk/os/zos.hpp"
|
|||
#include "sdk\components\zprotocols\zcancmder_v2\api\api.hpp"
|
|||
|
|||
/**
|
|||
* @brief |
|||
* |
|||
* service: M3078 |
|||
* |
|||
* 监听事件: |
|||
* 依赖状态: |
|||
* 依赖服务: |
|||
* 作用: |
|||
* |
|||
* 推荐配置: |
|||
* 1. 识读模式:按键保持 |
|||
* 2. 波特率:9600 |
|||
* 3. 单次扫码时长:无限时 |
|||
* |
|||
*/ |
|||
|
|||
namespace iflytop { |
|||
using namespace std; |
|||
|
|||
class M3078CodeScanner : public ZIModule, public ZICodeScaner { |
|||
public: |
|||
typedef struct { |
|||
UART_HandleTypeDef* uart; |
|||
DMA_HandleTypeDef* hdma_rx; |
|||
DMA_HandleTypeDef* hdma_tx; |
|||
|
|||
Pin_t codeReadOkPin; |
|||
Pin_t rstPin; |
|||
Pin_t triggerPin; |
|||
|
|||
} hardware_config_t; |
|||
|
|||
private: |
|||
ZUART m_uart; |
|||
ZGPIO m_triggerGpio; |
|||
ZGPIO m_rstPin; |
|||
|
|||
int32_t id = 0; |
|||
|
|||
bool m_trigger = false; |
|||
|
|||
char codecache[256] = {0}; |
|||
int32_t codecachelen = 0; |
|||
bool m_codeisready = false; |
|||
|
|||
public: |
|||
M3078CodeScanner(){}; |
|||
~M3078CodeScanner(){}; |
|||
|
|||
/**
|
|||
* @brief |
|||
* |
|||
* @param os |
|||
* @param uart |
|||
* @param triggerGpio |
|||
* |
|||
* @注意事项 |
|||
* 1. 串口缓冲buffer要大于最大的一帧码的长度 |
|||
* 2. 接收超时建议大于10ms |
|||
*/ |
|||
void initialize(int moduleid, hardware_config_t* hardwareconfig); |
|||
|
|||
void trigger(); |
|||
void stopTrigger(); |
|||
|
|||
bool idInfoIsReady(); |
|||
|
|||
char* getIdinfo(); |
|||
size_t getIdinfoLen(); |
|||
void clearIdinfo(); |
|||
|
|||
public: |
|||
virtual int32_t getid(int32_t* id) override { |
|||
*id = this->id; |
|||
return 0; |
|||
} |
|||
|
|||
virtual int32_t module_stop(); |
|||
virtual int32_t module_break(); |
|||
virtual int32_t module_start(); |
|||
|
|||
virtual int32_t module_set_reg(int32_t param_id, int32_t param_value); |
|||
virtual int32_t module_get_reg(int32_t param_id, int32_t* param_value); |
|||
|
|||
virtual int32_t code_scaner_start_scan(); |
|||
virtual int32_t code_scaner_stop_scan(); |
|||
virtual int32_t code_scaner_read_scaner_result(int32_t startadd, uint8_t* data, int32_t* len); |
|||
|
|||
private: |
|||
int32_t module_xxx_reg(int32_t param_id, bool read, int32_t& param_value); |
|||
int32_t read_status(); |
|||
}; |
|||
|
|||
} // namespace iflytop
|
@ -1 +1 @@ |
|||
Subproject commit ced01b81ca88792a9278c139be63faed5ef8efb1 |
|||
Subproject commit fb17dcb55250a0d7230051ca725149928905aa25 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue