15 changed files with 700 additions and 735 deletions
-
47chip/chip.c
-
120chip/chip.h
-
4chip/delay.h
-
16components/iflytop_can_slave_v1/iflytop_can_slave.cpp
-
11components/iflytop_can_slave_v1/iflytop_can_slave.hpp
-
BINcomponents/m3078/M03078_OEM产品手册_V1.1.4.pdf
-
37components/m3078/m3078_code_scaner.cpp
-
59components/m3078/m3078_code_scaner.hpp
-
4hal/clock.hpp
-
1hal/critical_context.hpp
-
462hal/gpio.cpp
-
368hal/gpio.hpp
-
7hal/zhal.hpp
-
231hal/zuart.cpp
-
68hal/zuart.hpp
@ -0,0 +1,37 @@ |
|||
#include "m3078_code_scaner.hpp"
|
|||
using namespace iflytop; |
|||
using namespace std; |
|||
|
|||
void M3078CodeScanner::initialize(UART_HandleTypeDef* huart, Pin_t triggerPin) { |
|||
ZUART::cfg_t cfg; |
|||
cfg.name = "m3078"; |
|||
cfg.huart = huart; |
|||
cfg.rxbuffersize = 300; |
|||
cfg.rxovertime_ms = 10; |
|||
|
|||
m_uart.initialize(&cfg, [this](uint8_t* data, size_t len) { |
|||
if (m_onidinfo) m_onidinfo((char*)data); |
|||
}); |
|||
m_triggerGpio.initAsOutput(triggerPin, ZGPIO::kOutput_nopull, false, false); |
|||
|
|||
m_trigger = false; |
|||
m_uart.startRxIt(); |
|||
|
|||
m_triggerGpio.setState(0); |
|||
m_onidinfo = NULL; |
|||
} |
|||
|
|||
void M3078CodeScanner::regListener(onidinfo_t listener) { m_onidinfo = listener; } |
|||
void M3078CodeScanner::trigger() { |
|||
if (!m_trigger) { |
|||
m_triggerGpio.setState(0); |
|||
chip_delay_ms(3); |
|||
} |
|||
m_uart.clearRxData(); |
|||
m_triggerGpio.setState(1); |
|||
m_trigger = true; |
|||
} |
|||
void M3078CodeScanner::stopTrigger() { |
|||
m_triggerGpio.setState(0); |
|||
m_trigger = false; |
|||
} |
@ -0,0 +1,59 @@ |
|||
//
|
|||
// Created by zwsd
|
|||
//
|
|||
|
|||
#pragma once
|
|||
#include "sdk\hal\zhal.hpp"
|
|||
|
|||
/**
|
|||
* @brief |
|||
* |
|||
* service: M3078 |
|||
* |
|||
* 监听事件: |
|||
* 依赖状态: |
|||
* 依赖服务: |
|||
* 作用: |
|||
* |
|||
* 推荐配置: |
|||
* 1. 识读模式:按键保持 |
|||
* 2. 波特率:9600 |
|||
* 3. 单次扫码时长:无限时 |
|||
* |
|||
*/ |
|||
namespace iflytop { |
|||
using namespace std; |
|||
|
|||
class M3078CodeScanner { |
|||
typedef function<void(char* idinfo)> onidinfo_t; |
|||
|
|||
private: |
|||
ZGPIO m_triggerGpio; |
|||
ZUART m_uart; |
|||
bool m_trigger; |
|||
|
|||
onidinfo_t m_onidinfo; |
|||
|
|||
public: |
|||
M3078CodeScanner(){}; |
|||
~M3078CodeScanner(){}; |
|||
|
|||
/**
|
|||
* @brief |
|||
* |
|||
* @param os |
|||
* @param uart |
|||
* @param triggerGpio |
|||
* |
|||
* @注意事项 |
|||
* 1. 串口缓冲buffer要大于最大的一帧码的长度 |
|||
* 2. 接收超时建议大于10ms |
|||
*/ |
|||
void initialize(UART_HandleTypeDef* huart, Pin_t triggerPin); |
|||
void regListener(onidinfo_t listener); |
|||
|
|||
void trigger(); |
|||
void stopTrigger(); |
|||
}; |
|||
|
|||
} // namespace iflytop
|
@ -0,0 +1,4 @@ |
|||
#pragma once
|
|||
#include <functional>
|
|||
|
|||
#include "../chip/iflytop_no_os.h"
|
@ -1,6 +1,9 @@ |
|||
#pragma once
|
|||
#include "../chip/iflytop_no_os.h"
|
|||
#include "gpio.hpp"
|
|||
//
|
|||
#include "critical_context.hpp"
|
|||
#include "zhal_core.hpp"
|
|||
//
|
|||
#include "gpio.hpp"
|
|||
#include "zcan.hpp"
|
|||
#include "critical_context.hpp"
|
|||
#include "zuart.hpp"
|
@ -0,0 +1,231 @@ |
|||
#include "zuart.hpp"
|
|||
|
|||
#include <stdio.h>
|
|||
#include <string.h>
|
|||
|
|||
#include "critical_context.hpp"
|
|||
#include "zhal_core.hpp"
|
|||
using namespace iflytop; |
|||
|
|||
static ZUART *s_uart_table[10]; |
|||
static int s_numUart; |
|||
|
|||
static void prv_reg_uart(ZUART *uart) { |
|||
if (s_numUart < 10) { |
|||
s_uart_table[s_numUart++] = uart; |
|||
} |
|||
} |
|||
|
|||
ZUART *prv_find_uart(UART_HandleTypeDef *huart) { |
|||
for (int i = 0; i < s_numUart; i++) { |
|||
if (s_uart_table[i]->getHuart() == huart) { |
|||
return s_uart_table[i]; |
|||
} |
|||
} |
|||
return NULL; |
|||
} |
|||
|
|||
extern "C" { |
|||
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart) { |
|||
ZUART *stm32uart = prv_find_uart(huart); |
|||
if (stm32uart != NULL) stm32uart->HAL_UART_TxCpltCallback(); |
|||
} |
|||
void HAL_UART_TxHalfCpltCallback(UART_HandleTypeDef *huart) { |
|||
ZUART *stm32uart = prv_find_uart(huart); |
|||
if (stm32uart != NULL) stm32uart->HAL_UART_TxHalfCpltCallback(); |
|||
} |
|||
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { |
|||
ZUART *stm32uart = prv_find_uart(huart); |
|||
if (stm32uart != NULL) stm32uart->HAL_UART_RxCpltCallback(); |
|||
} |
|||
void HAL_UART_RxHalfCpltCallback(UART_HandleTypeDef *huart) { |
|||
ZUART *stm32uart = prv_find_uart(huart); |
|||
if (stm32uart != NULL) stm32uart->HAL_UART_RxHalfCpltCallback(); |
|||
} |
|||
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart) { |
|||
ZUART *stm32uart = prv_find_uart(huart); |
|||
if (stm32uart != NULL) stm32uart->HAL_UART_ErrorCallback(); |
|||
} |
|||
void HAL_UART_AbortCpltCallback(UART_HandleTypeDef *huart) { |
|||
ZUART *stm32uart = prv_find_uart(huart); |
|||
if (stm32uart != NULL) stm32uart->HAL_UART_AbortCpltCallback(); |
|||
} |
|||
void HAL_UART_AbortTransmitCpltCallback(UART_HandleTypeDef *huart) { |
|||
ZUART *stm32uart = prv_find_uart(huart); |
|||
if (stm32uart != NULL) stm32uart->HAL_UART_AbortTransmitCpltCallback(); |
|||
} |
|||
void HAL_UART_AbortReceiveCpltCallback(UART_HandleTypeDef *huart) { |
|||
ZUART *stm32uart = prv_find_uart(huart); |
|||
if (stm32uart != NULL) stm32uart->HAL_UART_AbortReceiveCpltCallback(); |
|||
} |
|||
} |
|||
|
|||
IRQn_Type ZUART::getUartIRQType() { |
|||
#ifdef USART1
|
|||
if (m_huart->Instance == USART1) { |
|||
return USART1_IRQn; |
|||
} |
|||
#endif
|
|||
#ifdef USART2
|
|||
if (m_huart->Instance == USART2) { |
|||
return USART2_IRQn; |
|||
} |
|||
#endif
|
|||
#ifdef USART3
|
|||
if (m_huart->Instance == USART3) { |
|||
return USART3_IRQn; |
|||
} |
|||
#endif
|
|||
#ifdef UART4
|
|||
if (m_huart->Instance == UART4) { |
|||
return UART4_IRQn; |
|||
} |
|||
#endif
|
|||
#ifdef UART5
|
|||
if (m_huart->Instance == UART5) { |
|||
return UART5_IRQn; |
|||
} |
|||
#endif
|
|||
#ifdef USART6
|
|||
if (m_huart->Instance == USART6) { |
|||
return USART6_IRQn; |
|||
} |
|||
#endif
|
|||
ZASSERT(false); |
|||
return USART1_IRQn; |
|||
} |
|||
|
|||
void ZUART::initialize(cfg_t *cfg, callback_t cb) { |
|||
m_name = cfg->name; |
|||
m_huart = cfg->huart; |
|||
m_cb = cb; |
|||
m_rxovertime_ms = cfg->rxovertime_ms; |
|||
|
|||
m_rxBuffer = (uint8_t *)malloc(cfg->rxbuffersize); |
|||
memset(m_rxBuffer, 0, cfg->rxbuffersize); |
|||
ZASSERT(m_rxBuffer != NULL); |
|||
m_rxBufferLen = cfg->rxbuffersize; |
|||
|
|||
m_isRxing = false; |
|||
m_dataIsReady = false; |
|||
m_rxBufferPos = 0; |
|||
m_lastRxTime = 0; |
|||
onebyte = 0; |
|||
|
|||
ZHALCORE::getInstance()->regPeriodJob([this](ZHALCORE::Context &context) { periodicJob(); }, 1); |
|||
} |
|||
void ZUART::initialize(cfg_t *cfg) { initialize(cfg, NULL); } |
|||
|
|||
bool ZUART::tx(uint8_t *data, size_t len) { |
|||
HAL_UART_Transmit(m_huart, data, len, 0xffff); |
|||
return true; |
|||
} |
|||
bool ZUART::tx(const char *data) { |
|||
HAL_UART_Transmit(m_huart, (uint8_t *)data, strlen(data), 0xffff); |
|||
return true; |
|||
} |
|||
|
|||
bool ZUART::startRxIt() { |
|||
ZASSERT(m_rxBuffer != NULL); |
|||
ZASSERT(NVIC_GetEnableIRQ(getUartIRQType()) != 0); |
|||
|
|||
if (m_isRxing) return true; |
|||
m_isRxing = true; |
|||
|
|||
HAL_UART_Receive_IT(m_huart, &onebyte, 1); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
bool ZUART::dataIsReady() { |
|||
CriticalContext criticalContext(); |
|||
if (m_dataIsReady) { |
|||
return true; |
|||
} |
|||
if (!m_dataIsReady && m_rxBufferPos != 0) { |
|||
if (ifly_has_passedms(m_lastRxTime) > m_rxovertime_ms) { |
|||
m_dataIsReady = true; |
|||
return true; |
|||
} |
|||
} |
|||
return false; |
|||
} |
|||
void ZUART::clearRxData() { |
|||
ZCriticalContext criticalContext(); |
|||
m_dataIsReady = false; |
|||
memset(m_rxBuffer, 0, m_rxBufferLen); |
|||
m_rxBufferPos = 0; |
|||
} |
|||
void ZUART::periodicJob() { |
|||
if (dataIsReady()) { |
|||
if (m_cb) { |
|||
m_cb(m_rxBuffer, m_rxBufferPos); |
|||
} |
|||
clearRxData(); |
|||
} |
|||
} |
|||
|
|||
bool ZUART::startRxIt() { |
|||
ZASSERT(m_rxBuffer != NULL); |
|||
ZASSERT(NVIC_GetEnableIRQ(getUartIRQType()) != 0); |
|||
|
|||
if (m_isRxing) return true; |
|||
m_isRxing = true; |
|||
|
|||
HAL_UART_Receive_IT(m_huart, &onebyte, 1); |
|||
|
|||
return true; |
|||
} |
|||
|
|||
/*******************************************************************************
|
|||
* 中断 * |
|||
*******************************************************************************/ |
|||
void ZUART::HAL_UART_TxCpltCallback() {} |
|||
void ZUART::HAL_UART_TxHalfCpltCallback() {} |
|||
void ZUART::HAL_UART_RxCpltCallback() { |
|||
if (m_dataIsReady) { |
|||
HAL_UART_Receive_IT(m_huart, &onebyte, 1); |
|||
return; |
|||
} |
|||
|
|||
m_rxBuffer[m_rxBufferPos] = onebyte; |
|||
m_rxBufferPos++; |
|||
m_lastRxTime = chip_get_ticket(); |
|||
|
|||
if (m_rxBufferPos >= m_rxBufferLen) { |
|||
m_dataIsReady = true; |
|||
} |
|||
HAL_UART_Receive_IT(m_huart, &onebyte, 1); |
|||
} |
|||
|
|||
void ZUART::HAL_UART_RxHalfCpltCallback() {} |
|||
void ZUART::HAL_UART_ErrorCallback() { |
|||
HAL_UART_AbortReceive_IT(m_huart); |
|||
HAL_UART_Receive_IT(m_huart, &onebyte, 1); |
|||
} |
|||
void ZUART::HAL_UART_AbortCpltCallback() {} |
|||
void ZUART::HAL_UART_AbortTransmitCpltCallback() {} |
|||
void ZUART::HAL_UART_AbortReceiveCpltCallback() {} |
|||
|
|||
namespace iflytop { |
|||
#if 0
|
|||
#ifdef USART1
|
|||
ZUART STM32_UART1("uart1", USART1); |
|||
#endif
|
|||
#ifdef USART2
|
|||
ZUART STM32_UART2("uart2", USART2); |
|||
#endif
|
|||
#ifdef USART3
|
|||
ZUART STM32_UART3("uart3", USART3); |
|||
#endif
|
|||
#ifdef UART4
|
|||
ZUART STM32_UART4("uart4", UART4); |
|||
#endif
|
|||
#ifdef UART5
|
|||
ZUART STM32_UART5("uart5", UART5); |
|||
#endif
|
|||
#ifdef USART6
|
|||
ZUART STM32_UART6("uart6", USART6); |
|||
#endif
|
|||
#endif
|
|||
} // namespace iflytop
|
@ -0,0 +1,68 @@ |
|||
#pragma once
|
|||
#include <functional>
|
|||
|
|||
#include "../chip/iflytop_no_os.h"
|
|||
|
|||
namespace iflytop { |
|||
using namespace std; |
|||
class ZUART { |
|||
public: |
|||
typedef struct { |
|||
const char *name; |
|||
UART_HandleTypeDef *huart; |
|||
int32_t rxbuffersize = 128; |
|||
int32_t rxovertime_ms = 3; |
|||
} cfg_t; |
|||
typedef function<void(uint8_t *data, size_t len)> callback_t; |
|||
|
|||
private: |
|||
const char *m_name; |
|||
UART_HandleTypeDef *m_huart; |
|||
|
|||
uint8_t *m_rxBuffer; |
|||
volatile int32_t m_rxBufferPos; |
|||
int32_t m_rxBufferLen; |
|||
|
|||
volatile uint32_t m_lastRxTime; |
|||
|
|||
int32_t m_rxovertime_ms = 3; |
|||
|
|||
uint8_t onebyte; |
|||
|
|||
bool m_isRxing = false; |
|||
volatile bool m_dataIsReady = false; |
|||
|
|||
callback_t m_cb; |
|||
|
|||
public: |
|||
ZUART() {} |
|||
void initialize(cfg_t *cfg, callback_t cb); |
|||
void initialize(cfg_t *cfg); |
|||
|
|||
void setrxcb(callback_t cb) { m_cb = cb; } |
|||
|
|||
bool tx(const char *data); |
|||
bool tx(uint8_t *data, size_t len); |
|||
bool startRxIt(); |
|||
|
|||
void clearRxData(); |
|||
|
|||
public: |
|||
void HAL_UART_TxCpltCallback(); |
|||
void HAL_UART_TxHalfCpltCallback(); |
|||
void HAL_UART_RxCpltCallback(); |
|||
void HAL_UART_RxHalfCpltCallback(); |
|||
void HAL_UART_ErrorCallback(); |
|||
void HAL_UART_AbortCpltCallback(); |
|||
void HAL_UART_AbortTransmitCpltCallback(); |
|||
void HAL_UART_AbortReceiveCpltCallback(); |
|||
|
|||
UART_HandleTypeDef *getHuart() { return m_huart; } |
|||
|
|||
private: |
|||
IRQn_Type getUartIRQType(); |
|||
bool dataIsReady(); |
|||
void periodicJob(); |
|||
}; |
|||
|
|||
} // namespace iflytop
|
Write
Preview
Loading…
Cancel
Save
Reference in new issue