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