diff --git a/components/sensors/m3078/M03078_OEM产品手册_V1.1.4.pdf b/components/sensors/m3078/M03078_OEM产品手册_V1.1.4.pdf new file mode 100644 index 0000000..ec15413 Binary files /dev/null and b/components/sensors/m3078/M03078_OEM产品手册_V1.1.4.pdf differ diff --git a/components/sensors/m3078/m3078_code_scaner.cpp b/components/sensors/m3078/m3078_code_scaner.cpp new file mode 100644 index 0000000..64b5849 --- /dev/null +++ b/components/sensors/m3078/m3078_code_scaner.cpp @@ -0,0 +1,118 @@ +#include "m3078_code_scaner.hpp" + +#include +#include + +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; +} diff --git a/components/sensors/m3078/m3078_code_scaner.hpp b/components/sensors/m3078/m3078_code_scaner.hpp new file mode 100644 index 0000000..49acacc --- /dev/null +++ b/components/sensors/m3078/m3078_code_scaner.hpp @@ -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Ҫһ֡ij + * 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 \ No newline at end of file diff --git a/components/zprotocols/zcancmder_v2 b/components/zprotocols/zcancmder_v2 index ced01b8..fb17dcb 160000 --- a/components/zprotocols/zcancmder_v2 +++ b/components/zprotocols/zcancmder_v2 @@ -1 +1 @@ -Subproject commit ced01b81ca88792a9278c139be63faed5ef8efb1 +Subproject commit fb17dcb55250a0d7230051ca725149928905aa25 diff --git a/os/zthread.hpp b/os/zthread.hpp index aca86ff..9c3941c 100644 --- a/os/zthread.hpp +++ b/os/zthread.hpp @@ -37,7 +37,7 @@ class ZThread { */ static void zthread_module_init(); - void init(const char* threadname, int stack_size = 1024, osPriority priority = osPriorityNormal); + void init(const char* threadname, int stack_size = 512, osPriority priority = osPriorityNormal); void start(zosthread_cb_t cb); void start(zosthread_cb_t cb, zosthread_cb_t exitcb); void stop();