From 667a9898896dc1a0a958ba7b781a02cfaaec9d0d Mon Sep 17 00:00:00 2001 From: zhaohe Date: Mon, 26 Aug 2024 22:36:55 +0800 Subject: [PATCH] recode --- uappbase/apphal/apphal.cpp | 328 ++++++++++++++++++ uappbase/apphal/apphal.hpp | 21 ++ uappbase/base.hpp | 1 + uappbase/service/config_service.cpp | 20 +- uappbase/service/config_service.hpp | 8 +- usrc/apphal/apphal.cpp | 328 ------------------ usrc/apphal/apphal.hpp | 21 -- usrc/apphal/apphardware.cpp | 79 ----- usrc/apphal/apphardware.hpp | 52 --- usrc/apphardware/apphardware.cpp | 79 +++++ usrc/apphardware/apphardware.hpp | 51 +++ usrc/service/app_core.cpp | 18 +- usrc/service/app_core.hpp | 2 +- usrc/service/front_end_controler.cpp | 396 ++++++++++++++++++++++ usrc/service/front_end_controler.hpp | 81 +++++ usrc/service/page/page_processer.hpp | 4 +- usrc/service/pump_ctrl_service.hpp | 3 +- usrc/service/remote_controler.cpp | 20 +- usrc/service/remote_controler.hpp | 37 +- usrc/service/remote_controler_event_processer.cpp | 2 +- usrc/service/remote_controler_event_processer.hpp | 3 +- usrc/service/ui_scheduler.cpp | 396 ---------------------- usrc/service/ui_scheduler.hpp | 82 ----- 23 files changed, 1028 insertions(+), 1004 deletions(-) create mode 100644 uappbase/apphal/apphal.cpp create mode 100644 uappbase/apphal/apphal.hpp delete mode 100644 usrc/apphal/apphal.cpp delete mode 100644 usrc/apphal/apphal.hpp delete mode 100644 usrc/apphal/apphardware.cpp delete mode 100644 usrc/apphal/apphardware.hpp create mode 100644 usrc/apphardware/apphardware.cpp create mode 100644 usrc/apphardware/apphardware.hpp create mode 100644 usrc/service/front_end_controler.cpp create mode 100644 usrc/service/front_end_controler.hpp delete mode 100644 usrc/service/ui_scheduler.cpp delete mode 100644 usrc/service/ui_scheduler.hpp diff --git a/uappbase/apphal/apphal.cpp b/uappbase/apphal/apphal.cpp new file mode 100644 index 0000000..23832b5 --- /dev/null +++ b/uappbase/apphal/apphal.cpp @@ -0,0 +1,328 @@ +#include "apphal.hpp" +using namespace iflytop; + +void AppHal::MX_TIM6_Init(void) { + __HAL_RCC_TIM6_CLK_ENABLE(); + + TIM_MasterConfigTypeDef sMasterConfig = {0}; + htim6.Instance = TIM6; + htim6.Init.Prescaler = 71; + htim6.Init.CounterMode = TIM_COUNTERMODE_UP; + htim6.Init.Period = 65535; + htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { + Error_Handler(); + } + + /* TIM6 interrupt Init */ + HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); +} +/* TIM7 init function */ +void AppHal::MX_TIM7_Init(void) { + __HAL_RCC_TIM7_CLK_ENABLE(); + + TIM_MasterConfigTypeDef sMasterConfig = {0}; + htim7.Instance = TIM7; + htim7.Init.Prescaler = 81; + htim7.Init.CounterMode = TIM_COUNTERMODE_UP; + htim7.Init.Period = 65535; + htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim7) != HAL_OK) { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK) { + Error_Handler(); + } + + /* TIM7 interrupt Init */ + HAL_NVIC_SetPriority(TIM7_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(TIM7_IRQn); +} + +#define EARLY_ASSERT(exptr) \ + if (!(exptr)) { \ + while (true) { \ + } \ + } + +void AppHal::DEBUG_UART_INIT(Pin_t tx, Pin_t rx, int32_t baudrate) { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + EARLY_ASSERT(PA9 == tx); + EARLY_ASSERT(PA10 == rx); + + /*********************************************************************************************************************** + * IO鍒濆?嬪寲 * + ***********************************************************************************************************************/ + __HAL_RCC_USART1_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_DMA2_CLK_ENABLE(); + + GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + huart1.Instance = USART1; + huart1.Init.BaudRate = baudrate; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart1) != HAL_OK) { + Error_Handler(); + } + + /*********************************************************************************************************************** + * DMA鍒濆?嬪寲 * + ***********************************************************************************************************************/ + HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); + hdma2_stream2.Instance = DMA2_Stream2; + hdma2_stream2.Init.Channel = DMA_CHANNEL_4; + hdma2_stream2.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma2_stream2.Init.PeriphInc = DMA_PINC_DISABLE; + hdma2_stream2.Init.MemInc = DMA_MINC_ENABLE; + hdma2_stream2.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma2_stream2.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma2_stream2.Init.Mode = DMA_NORMAL; + hdma2_stream2.Init.Priority = DMA_PRIORITY_LOW; + hdma2_stream2.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma2_stream2) != HAL_OK) { + Error_Handler(); + } + + __HAL_LINKDMA(&huart1, hdmarx, hdma2_stream2); + HAL_NVIC_SetPriority(USART1_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(USART1_IRQn); +} + +void AppHal::MX_IWDG_Init(void) { + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_64; + hiwdg.Init.Reload = 4095; + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { + Error_Handler(); + } +} + +void AppHal::UART3_Init() { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + __HAL_RCC_USART3_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_DMA1_CLK_ENABLE(); + + huart3.Instance = USART3; + huart3.Init.BaudRate = 115200; + huart3.Init.WordLength = UART_WORDLENGTH_8B; + huart3.Init.StopBits = UART_STOPBITS_1; + huart3.Init.Parity = UART_PARITY_NONE; + huart3.Init.Mode = UART_MODE_TX_RX; + huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart3.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart3) != HAL_OK) { + Error_Handler(); + } + + GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + hdma1_stream1.Instance = DMA1_Stream1; + hdma1_stream1.Init.Channel = DMA_CHANNEL_4; + hdma1_stream1.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma1_stream1.Init.PeriphInc = DMA_PINC_DISABLE; + hdma1_stream1.Init.MemInc = DMA_MINC_ENABLE; + hdma1_stream1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma1_stream1.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma1_stream1.Init.Mode = DMA_NORMAL; + hdma1_stream1.Init.Priority = DMA_PRIORITY_LOW; + hdma1_stream1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma1_stream1) != HAL_OK) { + Error_Handler(); + } + + __HAL_LINKDMA(&huart3, hdmarx, hdma1_stream1); + + hdma1_stream3.Instance = DMA1_Stream3; + hdma1_stream3.Init.Channel = DMA_CHANNEL_4; + hdma1_stream3.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma1_stream3.Init.PeriphInc = DMA_PINC_DISABLE; + hdma1_stream3.Init.MemInc = DMA_MINC_ENABLE; + hdma1_stream3.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma1_stream3.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma1_stream3.Init.Mode = DMA_NORMAL; + hdma1_stream3.Init.Priority = DMA_PRIORITY_LOW; + hdma1_stream3.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma1_stream3) != HAL_OK) { + Error_Handler(); + } + + __HAL_LINKDMA(&huart3, hdmatx, hdma1_stream3); + + HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); + + HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn); + + HAL_NVIC_SetPriority(USART3_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(USART3_IRQn); +} + +/** + * @brief + */ +void AppHal::UART4_Init() { + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + __HAL_RCC_UART4_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + + huart4.Instance = UART4; + huart4.Init.BaudRate = 256000; + huart4.Init.WordLength = UART_WORDLENGTH_8B; + huart4.Init.StopBits = UART_STOPBITS_1; + huart4.Init.Parity = UART_PARITY_NONE; + huart4.Init.Mode = UART_MODE_TX_RX; + huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart4.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart4) != HAL_OK) { + Error_Handler(); + } + + /**UART4 GPIO Configuration + PC10 ------> UART4_TX + PC11 ------> UART4_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLDOWN; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF8_UART4; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + /* UART4 interrupt Init */ + HAL_NVIC_SetPriority(UART4_IRQn, 5, 0); + HAL_NVIC_EnableIRQ(UART4_IRQn); + + /*********************************************************************************************************************** + * DMA_INIT * + ***********************************************************************************************************************/ + + /* UART4 DMA Init */ + /* UART4_RX Init */ + hdma1_stream2.Instance = DMA1_Stream2; + hdma1_stream2.Init.Channel = DMA_CHANNEL_4; + hdma1_stream2.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma1_stream2.Init.PeriphInc = DMA_PINC_DISABLE; + hdma1_stream2.Init.MemInc = DMA_MINC_ENABLE; + hdma1_stream2.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma1_stream2.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma1_stream2.Init.Mode = DMA_NORMAL; + hdma1_stream2.Init.Priority = DMA_PRIORITY_LOW; + hdma1_stream2.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma1_stream2) != HAL_OK) { + Error_Handler(); + } + + __HAL_LINKDMA(&huart4, hdmarx, hdma1_stream2); + + /* UART4_TX Init */ + hdma1_stream4.Instance = DMA1_Stream4; + hdma1_stream4.Init.Channel = DMA_CHANNEL_4; + hdma1_stream4.Init.Direction = DMA_MEMORY_TO_PERIPH; + hdma1_stream4.Init.PeriphInc = DMA_PINC_DISABLE; + hdma1_stream4.Init.MemInc = DMA_MINC_ENABLE; + hdma1_stream4.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; + hdma1_stream4.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; + hdma1_stream4.Init.Mode = DMA_NORMAL; + hdma1_stream4.Init.Priority = DMA_PRIORITY_LOW; + hdma1_stream4.Init.FIFOMode = DMA_FIFOMODE_DISABLE; + if (HAL_DMA_Init(&hdma1_stream4) != HAL_OK) { + Error_Handler(); + } + __HAL_LINKDMA(&huart4, hdmatx, hdma1_stream4); +} + +void AppHal::MX_I2C1_Init(void) { + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_I2C1_CLK_ENABLE(); + + hi2c1.Instance = I2C1; + hi2c1.Init.ClockSpeed = 400000; + hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) { + Error_Handler(); + } + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /**I2C1 GPIO Configuration + PB8 ------> I2C1_SCL + PB9 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); +} +void AppHal::MX_HSPI1_Init() { + __HAL_RCC_SPI1_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + + // static_assert(MOTOR_SPI == SPI1); + // static_assert(&MOTOR_SPI_INS == &hspi1); + + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi1) != HAL_OK) { + Error_Handler(); + } + + // static_assert(MOTOR_SPI_SCK == PA5); + // static_assert(MOTOR_SPI_SDO == PA6); + // static_assert(MOTOR_SPI_SDI == PA7); + + GPIO_InitTypeDef GPIO_InitStruct = {0}; + GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); +} diff --git a/uappbase/apphal/apphal.hpp b/uappbase/apphal/apphal.hpp new file mode 100644 index 0000000..f789e55 --- /dev/null +++ b/uappbase/apphal/apphal.hpp @@ -0,0 +1,21 @@ +#pragma once +#include "uappbase/appdep.hpp" +namespace iflytop { +class AppHal { + private: + /* data */ + public: + static void MX_TIM6_Init(void); + static void MX_TIM7_Init(void); + static void DEBUG_UART_INIT(Pin_t tx, Pin_t rx, int32_t baudrate); + static void MX_IWDG_Init(void); + + static void UART3_Init(); + static void UART4_Init(); + + static void MX_I2C1_Init(void) ; + static void MX_HSPI1_Init(); + +}; + +} // namespace iflytop diff --git a/uappbase/base.hpp b/uappbase/base.hpp index 5d8d354..8fb4488 100644 --- a/uappbase/base.hpp +++ b/uappbase/base.hpp @@ -7,3 +7,4 @@ #include "service/app_event_bus.hpp" #include "service/gstate_mgr.hpp" #include "service/config_service.hpp" +#include "apphal/apphal.hpp" diff --git a/uappbase/service/config_service.cpp b/uappbase/service/config_service.cpp index c4f1776..0e861d1 100644 --- a/uappbase/service/config_service.cpp +++ b/uappbase/service/config_service.cpp @@ -42,7 +42,6 @@ typedef struct { #define CHECKSUM() checksum((uint8_t *)&(cfgcache.cfg[0].str[0]), sizeof(cfgcache) - 8) static config_data_t cfgcache; -static M24M02_I2C_EEPROM *eeprom; static int32_t checksum(uint8_t *data, int32_t n) { int32_t sum = 0; @@ -52,10 +51,13 @@ static int32_t checksum(uint8_t *data, int32_t n) { return sum; } -bool ConfigService::initialize(M24M02_I2C_EEPROM *_eeprom) { +bool ConfigService::initialize() { mutex.init(); - eeprom = _eeprom; + AppHal::MX_I2C1_Init(); + eeprom.initialize(&hi2c1); + + static_assert(kcfg_max == CFG_MAX_INDEX, ""); if (!checkcfg()) { ZLOGI(TAG, "cfg check fail,init cfg"); @@ -68,7 +70,7 @@ bool ConfigService::initialize(M24M02_I2C_EEPROM *_eeprom) { } cfgcache.checksum = CHECKSUM(); - eeprom->write(CONFIG_EEPROM_ADD, (uint8_t *)&cfgcache, sizeof(cfgcache)); + eeprom.write(CONFIG_EEPROM_ADD, (uint8_t *)&cfgcache, sizeof(cfgcache)); flashall(); } bool suc = checkcfg(); @@ -174,7 +176,7 @@ const char *ConfigService::_getcfg(config_index_t index, CfgItermCache *cache) { } bool ConfigService::checkcfg() { - eeprom->read(CONFIG_EEPROM_ADD, (uint8_t *)&cfgcache, sizeof(cfgcache)); + eeprom.read(CONFIG_EEPROM_ADD, (uint8_t *)&cfgcache, sizeof(cfgcache)); int32_t checksumval = CHECKSUM(); @@ -187,10 +189,10 @@ bool ConfigService::checkcfg() { bool ConfigService::flashIndex(int32_t index) { // for (int i = 0; i < sizeof(cfg_content_t); i += 4) { // uint32_t wdata = cfgcache.cfg[index].u32s[i / 4]; - // eeprom->write32(TO_EEPROM_ADD(index) + i, wdata); + // eeprom.write32(TO_EEPROM_ADD(index) + i, wdata); // } - eeprom->write(TO_EEPROM_ADD(index), (uint8_t *)&cfgcache.cfg[index], sizeof(cfg_content_t)); - eeprom->write32(CONFIG_EEPROM_ADD + 4 * 1, (uint32_t)cfgcache.checksum); + eeprom.write(TO_EEPROM_ADD(index), (uint8_t *)&cfgcache.cfg[index], sizeof(cfg_content_t)); + eeprom.write32(CONFIG_EEPROM_ADD + 4 * 1, (uint32_t)cfgcache.checksum); return true; } -bool ConfigService::flashall() { eeprom->write(CONFIG_EEPROM_ADD, (uint8_t *)&cfgcache, sizeof(cfgcache)); } +bool ConfigService::flashall() { eeprom.write(CONFIG_EEPROM_ADD, (uint8_t *)&cfgcache, sizeof(cfgcache)); } diff --git a/uappbase/service/config_service.hpp b/uappbase/service/config_service.hpp index 504e9bc..ec41dbb 100644 --- a/uappbase/service/config_service.hpp +++ b/uappbase/service/config_service.hpp @@ -1,9 +1,10 @@ #pragma once #include "../appdep.hpp" +#include "config_index.hpp" #include "uappbase/appcfg/appcfg.hpp" #include "uappbase/bean/bean.hpp" #include "ucomponents/eeprom/m24m02_i2c_eeprom.hpp" -#include "config_index.hpp" +#include "uappbase/apphal/apphal.hpp" namespace iflytop { using namespace std; @@ -19,7 +20,8 @@ struct CfgItermCache { class ConfigService { private: /* data */ - zmutex mutex; + zmutex mutex; + M24M02_I2C_EEPROM eeprom; public: static ConfigService* ins() { @@ -27,7 +29,7 @@ class ConfigService { return &instance; } - bool initialize(M24M02_I2C_EEPROM* _eeprom); + bool initialize(); void setcfgAndFlush(config_index_t index, const char* val); void setcfgAndFlush(config_index_t index, int32_t val); diff --git a/usrc/apphal/apphal.cpp b/usrc/apphal/apphal.cpp deleted file mode 100644 index 23832b5..0000000 --- a/usrc/apphal/apphal.cpp +++ /dev/null @@ -1,328 +0,0 @@ -#include "apphal.hpp" -using namespace iflytop; - -void AppHal::MX_TIM6_Init(void) { - __HAL_RCC_TIM6_CLK_ENABLE(); - - TIM_MasterConfigTypeDef sMasterConfig = {0}; - htim6.Instance = TIM6; - htim6.Init.Prescaler = 71; - htim6.Init.CounterMode = TIM_COUNTERMODE_UP; - htim6.Init.Period = 65535; - htim6.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_Base_Init(&htim6) != HAL_OK) { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim6, &sMasterConfig) != HAL_OK) { - Error_Handler(); - } - - /* TIM6 interrupt Init */ - HAL_NVIC_SetPriority(TIM6_DAC_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(TIM6_DAC_IRQn); -} -/* TIM7 init function */ -void AppHal::MX_TIM7_Init(void) { - __HAL_RCC_TIM7_CLK_ENABLE(); - - TIM_MasterConfigTypeDef sMasterConfig = {0}; - htim7.Instance = TIM7; - htim7.Init.Prescaler = 81; - htim7.Init.CounterMode = TIM_COUNTERMODE_UP; - htim7.Init.Period = 65535; - htim7.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; - if (HAL_TIM_Base_Init(&htim7) != HAL_OK) { - Error_Handler(); - } - sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; - sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; - if (HAL_TIMEx_MasterConfigSynchronization(&htim7, &sMasterConfig) != HAL_OK) { - Error_Handler(); - } - - /* TIM7 interrupt Init */ - HAL_NVIC_SetPriority(TIM7_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(TIM7_IRQn); -} - -#define EARLY_ASSERT(exptr) \ - if (!(exptr)) { \ - while (true) { \ - } \ - } - -void AppHal::DEBUG_UART_INIT(Pin_t tx, Pin_t rx, int32_t baudrate) { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - EARLY_ASSERT(PA9 == tx); - EARLY_ASSERT(PA10 == rx); - - /*********************************************************************************************************************** - * IO鍒濆?嬪寲 * - ***********************************************************************************************************************/ - __HAL_RCC_USART1_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_DMA2_CLK_ENABLE(); - - GPIO_InitStruct.Pin = GPIO_PIN_9 | GPIO_PIN_10; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF7_USART1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); - - huart1.Instance = USART1; - huart1.Init.BaudRate = baudrate; - huart1.Init.WordLength = UART_WORDLENGTH_8B; - huart1.Init.StopBits = UART_STOPBITS_1; - huart1.Init.Parity = UART_PARITY_NONE; - huart1.Init.Mode = UART_MODE_TX_RX; - huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; - huart1.Init.OverSampling = UART_OVERSAMPLING_16; - if (HAL_UART_Init(&huart1) != HAL_OK) { - Error_Handler(); - } - - /*********************************************************************************************************************** - * DMA鍒濆?嬪寲 * - ***********************************************************************************************************************/ - HAL_NVIC_SetPriority(DMA2_Stream2_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(DMA2_Stream2_IRQn); - hdma2_stream2.Instance = DMA2_Stream2; - hdma2_stream2.Init.Channel = DMA_CHANNEL_4; - hdma2_stream2.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma2_stream2.Init.PeriphInc = DMA_PINC_DISABLE; - hdma2_stream2.Init.MemInc = DMA_MINC_ENABLE; - hdma2_stream2.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma2_stream2.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma2_stream2.Init.Mode = DMA_NORMAL; - hdma2_stream2.Init.Priority = DMA_PRIORITY_LOW; - hdma2_stream2.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - if (HAL_DMA_Init(&hdma2_stream2) != HAL_OK) { - Error_Handler(); - } - - __HAL_LINKDMA(&huart1, hdmarx, hdma2_stream2); - HAL_NVIC_SetPriority(USART1_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(USART1_IRQn); -} - -void AppHal::MX_IWDG_Init(void) { - hiwdg.Instance = IWDG; - hiwdg.Init.Prescaler = IWDG_PRESCALER_64; - hiwdg.Init.Reload = 4095; - if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { - Error_Handler(); - } -} - -void AppHal::UART3_Init() { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - __HAL_RCC_USART3_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_DMA1_CLK_ENABLE(); - - huart3.Instance = USART3; - huart3.Init.BaudRate = 115200; - huart3.Init.WordLength = UART_WORDLENGTH_8B; - huart3.Init.StopBits = UART_STOPBITS_1; - huart3.Init.Parity = UART_PARITY_NONE; - huart3.Init.Mode = UART_MODE_TX_RX; - huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; - huart3.Init.OverSampling = UART_OVERSAMPLING_16; - if (HAL_UART_Init(&huart3) != HAL_OK) { - Error_Handler(); - } - - GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF7_USART3; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - - hdma1_stream1.Instance = DMA1_Stream1; - hdma1_stream1.Init.Channel = DMA_CHANNEL_4; - hdma1_stream1.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma1_stream1.Init.PeriphInc = DMA_PINC_DISABLE; - hdma1_stream1.Init.MemInc = DMA_MINC_ENABLE; - hdma1_stream1.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma1_stream1.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma1_stream1.Init.Mode = DMA_NORMAL; - hdma1_stream1.Init.Priority = DMA_PRIORITY_LOW; - hdma1_stream1.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - if (HAL_DMA_Init(&hdma1_stream1) != HAL_OK) { - Error_Handler(); - } - - __HAL_LINKDMA(&huart3, hdmarx, hdma1_stream1); - - hdma1_stream3.Instance = DMA1_Stream3; - hdma1_stream3.Init.Channel = DMA_CHANNEL_4; - hdma1_stream3.Init.Direction = DMA_MEMORY_TO_PERIPH; - hdma1_stream3.Init.PeriphInc = DMA_PINC_DISABLE; - hdma1_stream3.Init.MemInc = DMA_MINC_ENABLE; - hdma1_stream3.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma1_stream3.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma1_stream3.Init.Mode = DMA_NORMAL; - hdma1_stream3.Init.Priority = DMA_PRIORITY_LOW; - hdma1_stream3.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - if (HAL_DMA_Init(&hdma1_stream3) != HAL_OK) { - Error_Handler(); - } - - __HAL_LINKDMA(&huart3, hdmatx, hdma1_stream3); - - HAL_NVIC_SetPriority(DMA1_Stream1_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(DMA1_Stream1_IRQn); - - HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn); - - HAL_NVIC_SetPriority(USART3_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(USART3_IRQn); -} - -/** - * @brief - */ -void AppHal::UART4_Init() { - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - __HAL_RCC_UART4_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - - huart4.Instance = UART4; - huart4.Init.BaudRate = 256000; - huart4.Init.WordLength = UART_WORDLENGTH_8B; - huart4.Init.StopBits = UART_STOPBITS_1; - huart4.Init.Parity = UART_PARITY_NONE; - huart4.Init.Mode = UART_MODE_TX_RX; - huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE; - huart4.Init.OverSampling = UART_OVERSAMPLING_16; - if (HAL_UART_Init(&huart4) != HAL_OK) { - Error_Handler(); - } - - /**UART4 GPIO Configuration - PC10 ------> UART4_TX - PC11 ------> UART4_RX - */ - GPIO_InitStruct.Pin = GPIO_PIN_10 | GPIO_PIN_11; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_PULLDOWN; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF8_UART4; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - - /* UART4 interrupt Init */ - HAL_NVIC_SetPriority(UART4_IRQn, 5, 0); - HAL_NVIC_EnableIRQ(UART4_IRQn); - - /*********************************************************************************************************************** - * DMA_INIT * - ***********************************************************************************************************************/ - - /* UART4 DMA Init */ - /* UART4_RX Init */ - hdma1_stream2.Instance = DMA1_Stream2; - hdma1_stream2.Init.Channel = DMA_CHANNEL_4; - hdma1_stream2.Init.Direction = DMA_PERIPH_TO_MEMORY; - hdma1_stream2.Init.PeriphInc = DMA_PINC_DISABLE; - hdma1_stream2.Init.MemInc = DMA_MINC_ENABLE; - hdma1_stream2.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma1_stream2.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma1_stream2.Init.Mode = DMA_NORMAL; - hdma1_stream2.Init.Priority = DMA_PRIORITY_LOW; - hdma1_stream2.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - if (HAL_DMA_Init(&hdma1_stream2) != HAL_OK) { - Error_Handler(); - } - - __HAL_LINKDMA(&huart4, hdmarx, hdma1_stream2); - - /* UART4_TX Init */ - hdma1_stream4.Instance = DMA1_Stream4; - hdma1_stream4.Init.Channel = DMA_CHANNEL_4; - hdma1_stream4.Init.Direction = DMA_MEMORY_TO_PERIPH; - hdma1_stream4.Init.PeriphInc = DMA_PINC_DISABLE; - hdma1_stream4.Init.MemInc = DMA_MINC_ENABLE; - hdma1_stream4.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; - hdma1_stream4.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE; - hdma1_stream4.Init.Mode = DMA_NORMAL; - hdma1_stream4.Init.Priority = DMA_PRIORITY_LOW; - hdma1_stream4.Init.FIFOMode = DMA_FIFOMODE_DISABLE; - if (HAL_DMA_Init(&hdma1_stream4) != HAL_OK) { - Error_Handler(); - } - __HAL_LINKDMA(&huart4, hdmatx, hdma1_stream4); -} - -void AppHal::MX_I2C1_Init(void) { - __HAL_RCC_GPIOB_CLK_ENABLE(); - __HAL_RCC_I2C1_CLK_ENABLE(); - - hi2c1.Instance = I2C1; - hi2c1.Init.ClockSpeed = 400000; - hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; - hi2c1.Init.OwnAddress1 = 0; - hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; - hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; - hi2c1.Init.OwnAddress2 = 0; - hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; - hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; - if (HAL_I2C_Init(&hi2c1) != HAL_OK) { - Error_Handler(); - } - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - - /**I2C1 GPIO Configuration - PB8 ------> I2C1_SCL - PB9 ------> I2C1_SDA - */ - GPIO_InitStruct.Pin = GPIO_PIN_8 | GPIO_PIN_9; - GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); -} -void AppHal::MX_HSPI1_Init() { - __HAL_RCC_SPI1_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - - // static_assert(MOTOR_SPI == SPI1); - // static_assert(&MOTOR_SPI_INS == &hspi1); - - hspi1.Instance = SPI1; - hspi1.Init.Mode = SPI_MODE_MASTER; - hspi1.Init.Direction = SPI_DIRECTION_2LINES; - hspi1.Init.DataSize = SPI_DATASIZE_8BIT; - hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; - hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; - hspi1.Init.NSS = SPI_NSS_SOFT; - hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_32; - hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; - hspi1.Init.TIMode = SPI_TIMODE_DISABLE; - hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; - hspi1.Init.CRCPolynomial = 10; - if (HAL_SPI_Init(&hspi1) != HAL_OK) { - Error_Handler(); - } - - // static_assert(MOTOR_SPI_SCK == PA5); - // static_assert(MOTOR_SPI_SDO == PA6); - // static_assert(MOTOR_SPI_SDI == PA7); - - GPIO_InitTypeDef GPIO_InitStruct = {0}; - GPIO_InitStruct.Pin = GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7; - GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; - GPIO_InitStruct.Pull = GPIO_NOPULL; - GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; - GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; - HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); -} diff --git a/usrc/apphal/apphal.hpp b/usrc/apphal/apphal.hpp deleted file mode 100644 index 8f4e552..0000000 --- a/usrc/apphal/apphal.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once -#include "uappbase/base.hpp" -namespace iflytop { -class AppHal { - private: - /* data */ - public: - static void MX_TIM6_Init(void); - static void MX_TIM7_Init(void); - static void DEBUG_UART_INIT(Pin_t tx, Pin_t rx, int32_t baudrate); - static void MX_IWDG_Init(void); - - static void UART3_Init(); - static void UART4_Init(); - - static void MX_I2C1_Init(void) ; - static void MX_HSPI1_Init(); - -}; - -} // namespace iflytop diff --git a/usrc/apphal/apphardware.cpp b/usrc/apphal/apphardware.cpp deleted file mode 100644 index 34a00b9..0000000 --- a/usrc/apphal/apphardware.cpp +++ /dev/null @@ -1,79 +0,0 @@ -#include "apphardware.hpp" -using namespace iflytop; - -#define TAG "AppHardware" - -void AppHardware::initialize() { - AppHal::UART3_Init(); - AppHal::UART4_Init(); - AppHal::MX_I2C1_Init(); - AppHal::MX_HSPI1_Init(); - - tjcUart = &huart4; - remoteContolerUart = &huart3; - - MOTO_POWER_EN.initAsOutput(MOTO_POWER_EN_IO, kxs_gpio_nopull, false, true); - MOTO1_CSN.initAsOutput(MOTO1_CSN_IO, kxs_gpio_nopull, false, true); - MOTO2_CSN.initAsOutput(MOTO2_CSN_IO, kxs_gpio_nopull, false, true); - MOTO3_CSN.initAsOutput(MOTO3_CSN_IO, kxs_gpio_nopull, false, true); - MOTO4_CSN.initAsOutput(MOTO4_CSN_IO, kxs_gpio_nopull, false, true); - MOTO1_DRV_ENN.initAsOutput(MOTO1_DRV_ENN_IO, kxs_gpio_nopull, false, true); - MOTO2_DRV_ENN.initAsOutput(MOTO2_DRV_ENN_IO, kxs_gpio_nopull, false, true); - MOTO3_DRV_ENN.initAsOutput(MOTO3_DRV_ENN_IO, kxs_gpio_nopull, false, true); - MOTO4_DRV_ENN.initAsOutput(MOTO4_DRV_ENN_IO, kxs_gpio_nopull, false, true); - ID1.initAsInput(ID1_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false); - ID2.initAsInput(ID2_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false); - ID3.initAsInput(ID3_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false); - ID4.initAsInput(ID4_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false); - ID5.initAsInput(ID5_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false); - IO_OUT1.initAsOutput(IO_OUT1_IO, kxs_gpio_nopull, true, false); - IO_OUT2.initAsOutput(IO_OUT2_IO, kxs_gpio_nopull, true, false); - - BLE_CONNECTED_STATE_IO_PE6.initAsInput(PE6, kxs_gpio_nopull, kxs_gpio_no_irq, false); - - - - osDelay(10); - MOTO_POWER_EN.setState(false); - - TMC51X0Cfg tmc5130cfg1 = {&MOTOR_SPI_INS, MOTO1_CSN_IO, MOTO1_DRV_ENN_IO}; - TMC51X0Cfg tmc5130cfg2 = {&MOTOR_SPI_INS, MOTO2_CSN_IO, MOTO2_DRV_ENN_IO}; - TMC51X0Cfg tmc5130cfg3 = {&MOTOR_SPI_INS, MOTO3_CSN_IO, MOTO3_DRV_ENN_IO}; - TMC51X0Cfg tmc5130cfg4 = {&MOTOR_SPI_INS, MOTO4_CSN_IO, MOTO4_DRV_ENN_IO}; - - MOTO1.initialize(tmc5130cfg1); - MOTO2.initialize(tmc5130cfg2); - MOTO3.initialize(tmc5130cfg3); - MOTO4.initialize(tmc5130cfg4); - - ZLOGI(TAG, "motor1 initialize TMC51X0:%x", MOTO1.readICVersion()); - ZLOGI(TAG, "motor2 initialize TMC51X0:%x", MOTO2.readICVersion()); - ZLOGI(TAG, "motor3 initialize TMC51X0:%x", MOTO3.readICVersion()); - ZLOGI(TAG, "motor4 initialize TMC51X0:%x", MOTO4.readICVersion()); - - MOTO1.setIHOLD_IRUN(10, 31, 100); - MOTO2.setIHOLD_IRUN(10, 31, 100); - MOTO3.setIHOLD_IRUN(10, 31, 100); - MOTO4.setIHOLD_IRUN(10, 31, 100); - - MOTO1.setScale(1000); - MOTO2.setScale(1000); - MOTO3.setScale(1000); - MOTO4.setScale(1000); - - MOTO1.enable(1); - MOTO2.enable(1); - MOTO3.enable(1); - MOTO4.enable(1); - - // MOTO1.rotate(1000); - // MOTO2.rotate(1000); - // MOTO3.rotate(1000); - // MOTO4.rotate(1000); - - IO_OUT1.setState(false); - IO_OUT2.setState(false); - -// ZCAN1::ins()->init(); - eeprom.initialize(&hi2c1); -} \ No newline at end of file diff --git a/usrc/apphal/apphardware.hpp b/usrc/apphal/apphardware.hpp deleted file mode 100644 index 9dcbd85..0000000 --- a/usrc/apphal/apphardware.hpp +++ /dev/null @@ -1,52 +0,0 @@ -#pragma once -#include "apphal.hpp" -namespace iflytop { -class AppHardware { - private: - /* data */ - public: - M24M02_I2C_EEPROM eeprom; - TMC51X0 MOTO1; - TMC51X0 MOTO2; - TMC51X0 MOTO3; - TMC51X0 MOTO4; - - ZGPIO MOTO_POWER_EN; - ZGPIO MOTO1_CSN; - ZGPIO MOTO2_CSN; - ZGPIO MOTO3_CSN; - ZGPIO MOTO4_CSN; - ZGPIO MOTO1_DRV_ENN; - ZGPIO MOTO2_DRV_ENN; - ZGPIO MOTO3_DRV_ENN; - ZGPIO MOTO4_DRV_ENN; - ZGPIO ID1; - ZGPIO ID2; - ZGPIO ID3; - ZGPIO ID4; - ZGPIO ID5; - ZGPIO IO_OUT1; - ZGPIO IO_OUT2; - - ZGPIO BLE_CONNECTED_STATE_IO_PE6; - - UART_HandleTypeDef* tjcUart; - UART_HandleTypeDef* remoteContolerUart; - - static AppHardware* ins() { - static AppHardware instance; - return &instance; - } - - void initialize(); - TMC51X0* getPump(int32_t index) { - if (index == 0) return &MOTO1; - if (index == 1) return &MOTO2; - if (index == 2) return &MOTO3; - if (index == 3) return &MOTO4; - ZASSERT(false); - return nullptr; - } -}; - -} // namespace iflytop diff --git a/usrc/apphardware/apphardware.cpp b/usrc/apphardware/apphardware.cpp new file mode 100644 index 0000000..efdc31a --- /dev/null +++ b/usrc/apphardware/apphardware.cpp @@ -0,0 +1,79 @@ +#include "apphardware.hpp" +using namespace iflytop; + +#define TAG "AppHardware" + +void AppHardware::initialize() { + AppHal::UART3_Init(); + AppHal::UART4_Init(); + AppHal::MX_I2C1_Init(); + AppHal::MX_HSPI1_Init(); + + tjcUart = &huart4; + remoteContolerUart = &huart3; + + MOTO_POWER_EN.initAsOutput(MOTO_POWER_EN_IO, kxs_gpio_nopull, false, true); + MOTO1_CSN.initAsOutput(MOTO1_CSN_IO, kxs_gpio_nopull, false, true); + MOTO2_CSN.initAsOutput(MOTO2_CSN_IO, kxs_gpio_nopull, false, true); + MOTO3_CSN.initAsOutput(MOTO3_CSN_IO, kxs_gpio_nopull, false, true); + MOTO4_CSN.initAsOutput(MOTO4_CSN_IO, kxs_gpio_nopull, false, true); + MOTO1_DRV_ENN.initAsOutput(MOTO1_DRV_ENN_IO, kxs_gpio_nopull, false, true); + MOTO2_DRV_ENN.initAsOutput(MOTO2_DRV_ENN_IO, kxs_gpio_nopull, false, true); + MOTO3_DRV_ENN.initAsOutput(MOTO3_DRV_ENN_IO, kxs_gpio_nopull, false, true); + MOTO4_DRV_ENN.initAsOutput(MOTO4_DRV_ENN_IO, kxs_gpio_nopull, false, true); + ID1.initAsInput(ID1_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false); + ID2.initAsInput(ID2_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false); + ID3.initAsInput(ID3_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false); + ID4.initAsInput(ID4_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false); + ID5.initAsInput(ID5_IO, kxs_gpio_nopull, kxs_gpio_no_irq, false); + IO_OUT1.initAsOutput(IO_OUT1_IO, kxs_gpio_nopull, true, false); + IO_OUT2.initAsOutput(IO_OUT2_IO, kxs_gpio_nopull, true, false); + + BLE_CONNECTED_STATE_IO_PE6.initAsInput(PE6, kxs_gpio_nopull, kxs_gpio_no_irq, false); + + + + osDelay(10); + MOTO_POWER_EN.setState(false); + + TMC51X0Cfg tmc5130cfg1 = {&MOTOR_SPI_INS, MOTO1_CSN_IO, MOTO1_DRV_ENN_IO}; + TMC51X0Cfg tmc5130cfg2 = {&MOTOR_SPI_INS, MOTO2_CSN_IO, MOTO2_DRV_ENN_IO}; + TMC51X0Cfg tmc5130cfg3 = {&MOTOR_SPI_INS, MOTO3_CSN_IO, MOTO3_DRV_ENN_IO}; + TMC51X0Cfg tmc5130cfg4 = {&MOTOR_SPI_INS, MOTO4_CSN_IO, MOTO4_DRV_ENN_IO}; + + MOTO1.initialize(tmc5130cfg1); + MOTO2.initialize(tmc5130cfg2); + MOTO3.initialize(tmc5130cfg3); + MOTO4.initialize(tmc5130cfg4); + + ZLOGI(TAG, "motor1 initialize TMC51X0:%x", MOTO1.readICVersion()); + ZLOGI(TAG, "motor2 initialize TMC51X0:%x", MOTO2.readICVersion()); + ZLOGI(TAG, "motor3 initialize TMC51X0:%x", MOTO3.readICVersion()); + ZLOGI(TAG, "motor4 initialize TMC51X0:%x", MOTO4.readICVersion()); + + MOTO1.setIHOLD_IRUN(10, 31, 100); + MOTO2.setIHOLD_IRUN(10, 31, 100); + MOTO3.setIHOLD_IRUN(10, 31, 100); + MOTO4.setIHOLD_IRUN(10, 31, 100); + + MOTO1.setScale(1000); + MOTO2.setScale(1000); + MOTO3.setScale(1000); + MOTO4.setScale(1000); + + MOTO1.enable(1); + MOTO2.enable(1); + MOTO3.enable(1); + MOTO4.enable(1); + + // MOTO1.rotate(1000); + // MOTO2.rotate(1000); + // MOTO3.rotate(1000); + // MOTO4.rotate(1000); + + IO_OUT1.setState(false); + IO_OUT2.setState(false); + +// ZCAN1::ins()->init(); + +} \ No newline at end of file diff --git a/usrc/apphardware/apphardware.hpp b/usrc/apphardware/apphardware.hpp new file mode 100644 index 0000000..2321a16 --- /dev/null +++ b/usrc/apphardware/apphardware.hpp @@ -0,0 +1,51 @@ +#pragma once +#include "uappbase/base.hpp" +namespace iflytop { +class AppHardware { + private: + /* data */ + public: + TMC51X0 MOTO1; + TMC51X0 MOTO2; + TMC51X0 MOTO3; + TMC51X0 MOTO4; + + ZGPIO MOTO_POWER_EN; + ZGPIO MOTO1_CSN; + ZGPIO MOTO2_CSN; + ZGPIO MOTO3_CSN; + ZGPIO MOTO4_CSN; + ZGPIO MOTO1_DRV_ENN; + ZGPIO MOTO2_DRV_ENN; + ZGPIO MOTO3_DRV_ENN; + ZGPIO MOTO4_DRV_ENN; + ZGPIO ID1; + ZGPIO ID2; + ZGPIO ID3; + ZGPIO ID4; + ZGPIO ID5; + ZGPIO IO_OUT1; + ZGPIO IO_OUT2; + + ZGPIO BLE_CONNECTED_STATE_IO_PE6; + + UART_HandleTypeDef* tjcUart; + UART_HandleTypeDef* remoteContolerUart; + + static AppHardware* ins() { + static AppHardware instance; + return &instance; + } + + void initialize(); + TMC51X0* getPump(int32_t index) { + if (index == 0) return &MOTO1; + if (index == 1) return &MOTO2; + if (index == 2) return &MOTO3; + if (index == 3) return &MOTO4; + ZASSERT(false); + return nullptr; + } +}; + +} // namespace iflytop diff --git a/usrc/service/app_core.cpp b/usrc/service/app_core.cpp index 7aad29b..7c70824 100644 --- a/usrc/service/app_core.cpp +++ b/usrc/service/app_core.cpp @@ -3,10 +3,10 @@ #include #include +#include "service/front_end_controler.hpp" #include "service/pump_ctrl_service.hpp" #include "service/remote_controler.hpp" #include "service/remote_controler_event_processer.hpp" -#include "service/ui_scheduler.hpp" // #include "service/page/page.hpp" @@ -50,30 +50,32 @@ void AppCore::appsetup() { /*********************************************************************************************************************** * INIT * ***********************************************************************************************************************/ - AppHardware::ins()->initialize(); + ConfigService::ins()->initialize(); - ConfigService::ins()->initialize(&AppHardware::ins()->eeprom); - UIScheduler::ins()->initialize(); + // hardInit + AppHardware::ins()->initialize(); // 基础硬件初始化 + RemoteControlerUpper::ins()->initialize(); // 遥控器初始化 + FrontEndControler::ins()->initialize(); // 前端控制器,对屏幕的消息进行解析,发送消息给屏幕 + + // BaseServiceInit // - RCTRL->initialize(); // 遥控器初始化 Page_login::ins()->initialize(); // Page_main::ins()->initialize(); // Page_keybAcidCh::ins()->initialize(); Page_muAcidType::ins()->initialize(); - // MenuPageMgrService::ins()->initialize(); // /*********************************************************************************************************************** * REG_EVENT_HANDLER * ***********************************************************************************************************************/ - RCTRL->regOnReport([](uint8_t* rx, int32_t len) { // + RemoteControlerUpper::ins()->regOnReport([](uint8_t* rx, int32_t len) { // ZLOGI(TAG, "[RCTRL] on event:%s", zhex2str(rx, len)); }); /*********************************************************************************************************************** * START * ***********************************************************************************************************************/ - UIScheduler::ins()->startSchedule(); + FrontEndControler::ins()->startSchedule(); RCTRL->startSchedule(); // dim diff --git a/usrc/service/app_core.hpp b/usrc/service/app_core.hpp index 55d8232..573a930 100644 --- a/usrc/service/app_core.hpp +++ b/usrc/service/app_core.hpp @@ -1,6 +1,6 @@ #pragma once -#include "apphal/apphal.hpp" +#include "apphardware/apphardware.hpp" #include "uappbase/base.hpp" namespace iflytop { diff --git a/usrc/service/front_end_controler.cpp b/usrc/service/front_end_controler.cpp new file mode 100644 index 0000000..664be0d --- /dev/null +++ b/usrc/service/front_end_controler.cpp @@ -0,0 +1,396 @@ +#include "front_end_controler.hpp" + +#include +#include +#include +#include + +#include "tjc/tjc_constant.hpp" +using namespace iflytop; +#define CMD_OVERTIME 50 + +#define DEBUG 1 +static ZThread uart_rx_thread; +static ZThread rx_processed_thread; + +static ZQueue ackQueue; +static ZQueue eventQueue; +static ZThread usartRxThread; +static ZThread eventProcessThread; +static bool m_isWaitingForAck; +static UART_HandleTypeDef* tjcUart; + +#define TAG "UIScheduler" + +static const char* zhex2str(uint8_t* data, size_t len) { + static char buf[256]; + memset(buf, 0, sizeof(buf)); + for (size_t i = 0; i < len; i++) { + sprintf(buf + i * 2, "%02X", data[i]); + } + return buf; +} + +void FrontEndControler::initialize() { // + ackQueue.initialize(5, sizeof(tjc_rx_packet_t)); + eventQueue.initialize(5, sizeof(tjc_rx_packet_t)); + usartRxThread.init("usartRxThread", 1024); + eventProcessThread.init("eventProcessThread", 1024); + + tjcUart = AppHardware::ins()->tjcUart; + m_cmdlock.init(); +} +#define UART_RX_OVERTIME 5 +void FrontEndControler::startSchedule() { + usartRxThread.start([this]() { + static uint8_t rxbuf[128]; + tjcUart->USR_UartITRxing = 1; + tjcUart->USR_UartITRxBuf = rxbuf; + tjcUart->USR_UartITRxBufSize = 128; + tjcUart->USR_UartITRxOff = 0; + HAL_UART_Receive_IT(tjcUart, &tjcUart->USR_UartITRxBufCache, 1); + while (1) { + static uint8_t processbuf[128]; + int32_t rxsize = 0; + if (tjcUart->USR_UartITRxOff != 0 && zos_haspassedms(tjcUart->USR_UartITLastRxTicket) > UART_RX_OVERTIME) { + vPortEnterCritical(); + if (tjcUart->USR_UartITRxOff != 0 && zos_haspassedms(tjcUart->USR_UartITLastRxTicket) > UART_RX_OVERTIME) { + memcpy(processbuf, tjcUart->USR_UartITRxBuf, tjcUart->USR_UartITRxOff); + rxsize = tjcUart->USR_UartITRxOff; + tjcUart->USR_UartITRxOff = 0; + } + vPortExitCritical(); + } + + if (rxsize != 0) { + processScreenRxPacket(processbuf, rxsize); + } + osDelay(1); + } + }); + + eventProcessThread.start([this]() { + while (1) { + static tjc_rx_packet_t packet; + bool suc = eventQueue.receive(&packet, 10); + if (suc) { + memset(&event_cache, 0, sizeof(event_cache)); + uint8_t packetType = packet.data[0]; + if (packetType == tjc::kpt_inputfield_content_change_event) { + processUsrKeyboardConfirmEvent(packet.data, packet.datalen); + } else if (packetType == tjc::kpt_double_state_button_event) { + processUsrDoubleStateButtonEvent(packet.data, packet.datalen); + } else if (packetType == tjc::kpt_unlogin_request) { + event_cache.eventId = packet.data[0]; + event_cache.pid = packet.data[1]; + event_cache.bid = packet.data[2]; + callUsrEventCb(&event_cache); + } else if (packetType == tjc::kpt_login_request) { + processLoginRequestEvent(packet.data, packet.datalen); + } else if (tjc::kpt_button_event == packetType) { + event_cache.eventId = packet.data[0]; + event_cache.pid = packet.data[1]; + event_cache.bid = packet.data[2]; + event_cache.d.button_event.val = packet.data[3]; + callUsrEventCb(&event_cache); + } else if (tjc::kpt_sys_event_page_id == packetType) { + event_cache.eventId = packet.data[0]; + event_cache.pid = packet.data[1]; + event_cache.bid = 0; + callUsrEventCb(&event_cache); + } else { + event_cache.eventId = packet.data[0]; + callUsrEventCb(&event_cache); + ZLOGI(TAG, "[eventprocess-thread]: rx_event:%s", tjc::pt2str(packetType)); + } + } + osDelay(1); + } + }); +} + +// GVAR_triET +// GVAR_triBId +// GVAR_triPageId + +void FrontEndControler::processScreenRxPacket(uint8_t* data, size_t len) { + // 判断包是否合法 +#if DEBUG + ZLOGI(TAG, "[rx-thread] : rx :%s(%d)", zhex2str(data, len), len); +#endif + + if (!(data[len - 1] == 0xff && data[len - 2] == 0xff && data[len - 3] == 0xff)) { + ZLOGI(TAG, "rx invalid packet %s", zhex2str(data, len)); + return; + } + if (TJC_MAX_PACKET_SIZE < len) { + ZLOGI(TAG, "rx invalid packet(tool long) %s", zhex2str(data, len)); + return; + } + + uint8_t packetType = data[0]; + + static tjc_rx_packet_t packet; + packet.datalen = len; + memcpy(packet.data, data, len); + if (tjc::kpt_ack == packetType) { + if (m_isWaitingForAck) { + bool suc = ackQueue.send(&packet, 10); + if (!suc) { + ZLOGI(TAG, "ackQueue send failed"); + } + m_isWaitingForAck = false; + } + + } else { + bool suc = eventQueue.send(&packet, 10); + if (!suc) { + ZLOGI(TAG, "eventQueue send failed"); + } + } +} + +void FrontEndControler::regOnUsrEventCb(on_usr_event_cb_t cb) { + m_cb[m_ncb] = cb; + m_ncb++; +} + +static const char* zcpystr(char* cpyto, const char* strbegin, int32_t maxlen) { + if (strbegin == NULL) return NULL; + int32_t i = 0; + for (i = 0; i < maxlen; i++) { + cpyto[i] = strbegin[i]; + if (strbegin[i] == 0) { + return &strbegin[i + 1]; + } + } + return NULL; +} +void FrontEndControler::processUsrButtonEvent(uint8_t* data, size_t len) { + /** + * @brief + * 指令格式: + * printh 65 + * prints dp,1 + * prints '&id&',1 + * printh FF FF FF + * + * AB Page cidName/0 FF FF FF + * + */ + // ButtonEventContext_t buttonEventCxt; + + // event_cache + memset(&event_cache, 0, sizeof(event_cache)); + event_cache.eventId = data[0]; + event_cache.pid = data[1]; + event_cache.bid = data[2]; + + callUsrEventCb(&event_cache); +} +void FrontEndControler::processUsrDoubleStateButtonEvent(uint8_t* data, size_t len) { + /** + * @brief + * 指令格式: + * printh AD + * prints dp,1 + * prints '&id&',1 + * prints '&val&',1 + * printh FF FF FF + * + * AB Page cidName/0 FF FF FF + * + */ + // ButtonEventContext_t buttonEventCxt; + + // event_cache + memset(&event_cache, 0, sizeof(event_cache)); + event_cache.eventId = data[0]; + event_cache.pid = data[1]; + event_cache.bid = data[2]; + event_cache.d.double_state_button.val = data[3]; + + callUsrEventCb(&event_cache); +} +void FrontEndControler::callUsrEventCb(tjc::tjc_usr_event_t* event) { + for (int32_t i = 0; i < m_ncb; i++) { + m_cb[i](event); + } +} + +void FrontEndControler::processUsrKeyboardConfirmEvent(uint8_t* data, size_t len) { + /** + * @brief + * + * printh AC + * prints loadpageid.val,1 + * prints loadcmpid.val,1 + * prints p[loadpageid.val].b[loadcmpid.val].txt,0 + * printh 00 + * printh FF FF FF + * page loadpageid.val + * + */ + // ZLOGI(TAG, "processUsrKeyboardConfirmEvent"); + memset(&event_cache, 0, sizeof(event_cache)); + event_cache.eventId = data[0]; + event_cache.pid = data[1]; + event_cache.bid = data[2]; + const char* strbegin = (const char*)&data[3]; + strbegin = zcpystr(event_cache.d.inputfield_content.text, strbegin, sizeof(event_cache.d.inputfield_content.text)); + callUsrEventCb(&event_cache); +} + +void FrontEndControler::processLoginRequestEvent(uint8_t* data, size_t len) { + /* + * printh AE + * prints dp,1 + * prints '&id&',1 + * prints cUsrName.txt,0 + * printh 00 + * prints txt_passwd.txt,0 + * printh 00 + * printh FF FF FF + */ + + // ZLOGI(TAG, "processLoginRequestEvent"); + memset(&event_cache, 0, sizeof(event_cache)); + event_cache.eventId = data[0]; + event_cache.pid = data[1]; + event_cache.bid = data[2]; + const char* strbegin = (const char*)&data[3]; + strbegin = zcpystr(event_cache.d.login_request.usrName, strbegin, MAX_USR_NAME_SIZE); + strbegin = zcpystr(event_cache.d.login_request.passwd, strbegin, MAX_USR_PASSWD_LENGTH); + + callUsrEventCb(&event_cache); +} + +bool FrontEndControler::readTxt(uint8_t pid, uint8_t cId, char* txt, int32_t txtbuflen) { + zlock_guard lg(m_cmdlock); + + startReceiveAck(); + sendcmd("com_stop"); + sendcmd("printh AA"); + sendcmd("prints p[%d].b[%d].txt,0", pid, cId); + sendcmd("printh 00"); + sendcmd("printh FF FF FF"); + sendcmd("com_start"); + + bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME); + if (!suc) { + ZLOGI(TAG, "readTxt failed"); + return false; + } + int32_t cpysize = ackcache.datalen - 3; + if (cpysize > txtbuflen) { + cpysize = txtbuflen - 1; + } + + memcpy(txt, &ackcache.data[1], cpysize); + return true; +} +bool FrontEndControler::readInt(uint8_t pid, uint8_t cId, int32_t* val) { + zlock_guard lg(m_cmdlock); + + startReceiveAck(); + sendcmd("com_stop"); + sendcmd("printh AA"); + sendcmd("prints p[%d].b[%d].val,4", pid, cId); + sendcmd("printh FF FF FF"); + sendcmd("com_start"); + + bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME); + if (!suc) { + ZLOGI(TAG, "readTxt failed"); + return false; + } + + uint8_t int32val[4] = {0}; + memcpy(int32val, &ackcache.data[1], 4); + *val = *(int32_t*)int32val; + return true; +} + +bool FrontEndControler::setVal(uint8_t pid, uint8_t bid, const char* txt, ...) { + zlock_guard lg(m_cmdlock); + + va_list args; + va_start(args, txt); + static char buf[128]; + vsprintf(buf, txt, args); + va_end(args); + + sendcmd("p[%d].b[%d].txt=\"%s\"", pid, bid, buf); + return true; +} +bool FrontEndControler::setVal(uint8_t pid, uint8_t cid, int32_t val) { + zlock_guard lg(m_cmdlock); + sendcmd("p[%d].b[%d].val=%d", pid, cid, val); + return true; +} +bool FrontEndControler::vis(uint16_t buuid, int32_t val) { + zlock_guard lg(m_cmdlock); + sendcmd("vis %d,%d", buuid & 0xff, val); + return true; +} + +void FrontEndControler::alert(const char* info, ...) { + zlock_guard lg(m_cmdlock); + + va_list args; + va_start(args, info); + static char buf[128]; + vsprintf(buf, info, args); + + sendcmd("p[%d].b[%d].val=dp", pg_alert, ob_alert_frompage); + sendcmd("p[%d].b[%d].txt=\"%s\"", pg_alert, ob_alert_info, buf); + sendcmd("page alert"); +} +void FrontEndControler::chpage(uint8_t page) { sendcmd("page %d", page); } + +void FrontEndControler::sendcmd(const char* format, ...) { + static char buf[128]; + va_list args; + va_start(args, format); + vsprintf(buf, format, args); + va_end(args); + + uint8_t len = strlen(buf); + if (len > (128 - 3)) { + ZLOGI(TAG, "sendcmd too long"); + return; + } + + buf[len] = 0xff; + buf[len + 1] = 0xff; + buf[len + 2] = 0xff; + + HAL_UART_Transmit(tjcUart, (uint8_t*)buf, len + 3, 100); + while (true) { + osDelay(1); + if (tjcUart->gState == HAL_UART_STATE_READY) { + return; + } + } +} + +void FrontEndControler::startReceiveAck() { + ackQueue.clear(); + m_isWaitingForAck = true; +} + +void FrontEndControler::virtualClick(uint8_t pid, uint8_t bid, uint8_t event) { + zlock_guard lg(m_cmdlock); + sendcmd("click b[%d],%d", bid, event); +} + +void FrontEndControler::setTouchEnableState(uint8_t bid, uint8_t enable) { + // tsw obj,state + zlock_guard lg(m_cmdlock); + sendcmd("tsw b[%d],%d", bid, enable); +} + +void FrontEndControler::setEnumComponentState(uint8_t pid, uint8_t bid, int32_t state) { + // 枚举类型使用动画组件 + sendcmd("p[%d].b[%d].tim=%d", pid, bid, state * 50); +} diff --git a/usrc/service/front_end_controler.hpp b/usrc/service/front_end_controler.hpp new file mode 100644 index 0000000..a885788 --- /dev/null +++ b/usrc/service/front_end_controler.hpp @@ -0,0 +1,81 @@ +#pragma once +#include "apphardware/apphardware.hpp" +#include "uappbase/base.hpp" + +// +#include "tjc/tjc.hpp" + +namespace iflytop { +using namespace std; +typedef struct { + uint8_t data[TJC_MAX_PACKET_SIZE]; + uint16_t datalen; +} tjc_rx_packet_t; + +typedef std::function on_usr_event_cb_t; + +#define UIS FrontEndControler::ins() +class FrontEndControler { + ZThread m_thread; + + tjc_rx_packet_t ackcache; + zmutex m_cmdlock; + + tjc::tjc_usr_event_t event_cache; + + // on_usr_event_cb_t cb; + + on_usr_event_cb_t m_cb[50]; + int32_t m_ncb = 0; + + public: + FrontEndControler() {}; + ~FrontEndControler() {}; + + static FrontEndControler* ins() { + static FrontEndControler instance; + return &instance; + } + + void initialize(); + void regOnUsrEventCb(on_usr_event_cb_t onclik); + + void startSchedule(); + + // cmd list + bool readTxt(uint8_t pid, uint8_t bid, char* txt, int32_t txtbuflen); + bool readInt(uint8_t pid, uint8_t bid, int32_t* val); + + bool setVal(uint8_t pid, uint8_t bid, const char* txt, ...); + bool setVal(uint8_t pid, uint8_t bid, int32_t val); + + bool setVal(uint16_t buuid, const char* txt) { return setVal(buuid >> 8, buuid & 0xff, txt); } + bool setVal(uint16_t buuid, int32_t val) { return setVal(buuid >> 8, buuid & 0xff, val); } + + bool vis(uint16_t buuid, int32_t val); // 不支持跨页面隐藏 + // vis b0,0 + + bool readTxt(uint16_t buuid, char* txt, int32_t txtbuflen) { return readTxt(buuid >> 8, buuid & 0xff, txt, txtbuflen); } + bool readInt(uint16_t buuid, int32_t* val) { return readInt(buuid >> 8, buuid & 0xff, val); } + + void alert(const char* info, ...); + void chpage(uint8_t page); + void virtualClick(uint8_t pid, uint8_t bid, uint8_t event); + void setTouchEnableState(uint8_t bid, uint8_t enable); + + void setEnumComponentState(uint8_t pid, uint8_t bid, int32_t state); + void sendcmd(const char* format, ...); + + private: + void processScreenRxPacket(uint8_t* data, size_t len); + void processUsrButtonEvent(uint8_t* data, size_t len); + void processUsrKeyboardConfirmEvent(uint8_t* data, size_t len); + void processUsrDoubleStateButtonEvent(uint8_t* data, size_t len); + void processLoginRequestEvent(uint8_t* data, size_t len); + + void startReceiveAck(); + + void callUsrEventCb(tjc::tjc_usr_event_t* event); +}; + +} // namespace iflytop diff --git a/usrc/service/page/page_processer.hpp b/usrc/service/page/page_processer.hpp index 5082b1d..9a657d1 100644 --- a/usrc/service/page/page_processer.hpp +++ b/usrc/service/page/page_processer.hpp @@ -1,7 +1,7 @@ #pragma once -#include "apphal/apphal.hpp" -#include "service\ui_scheduler.hpp" +#include "apphardware/apphardware.hpp" +#include "service\front_end_controler.hpp" #include "uappbase/base.hpp" #include "ui/ui.h" namespace iflytop { diff --git a/usrc/service/pump_ctrl_service.hpp b/usrc/service/pump_ctrl_service.hpp index 8657fd5..0375346 100644 --- a/usrc/service/pump_ctrl_service.hpp +++ b/usrc/service/pump_ctrl_service.hpp @@ -1,6 +1,5 @@ #pragma once -#include "apphal/apphal.hpp" -#include "apphal/apphardware.hpp" +#include "apphardware/apphardware.hpp" #include "uappbase/base.hpp" namespace iflytop { using namespace std; diff --git a/usrc/service/remote_controler.cpp b/usrc/service/remote_controler.cpp index cc07d29..4494be7 100644 --- a/usrc/service/remote_controler.cpp +++ b/usrc/service/remote_controler.cpp @@ -24,7 +24,7 @@ static const char* zhex2str(uint8_t* data, size_t len) { return buf; } -void RemoteControler::initialize() { +void RemoteControlerUpper::initialize() { ackQueue.initialize(1, sizeof(RemoteControlerReportPacket_t)); eventQueue.initialize(3, sizeof(RemoteControlerReportPacket_t)); usartRxThread.init("usartRxThread", 1024); @@ -34,19 +34,19 @@ void RemoteControler::initialize() { m_uart = AppHardware::ins()->remoteContolerUart; m_cmdlock.init(); } -void RemoteControler::regOnReport(on_report_cb_t on_report) { +void RemoteControlerUpper::regOnReport(on_report_cb_t on_report) { m_cb[m_ncb] = on_report; m_ncb++; } -bool RemoteControler::isConnected() { return AppHardware::ins()->BLE_CONNECTED_STATE_IO_PE6.getState(); } -void RemoteControler::callOnReport(uint8_t* rx, int32_t len) { +bool RemoteControlerUpper::isConnected() { return AppHardware::ins()->BLE_CONNECTED_STATE_IO_PE6.getState(); } +void RemoteControlerUpper::callOnReport(uint8_t* rx, int32_t len) { for (int32_t i = 0; i < m_ncb; i++) { m_cb[i](rx, len); } } -void RemoteControler::startSchedule() { +void RemoteControlerUpper::startSchedule() { usartRxThread.start([this]() { static uint8_t rxbuf[128]; m_uart->USR_UartITRxing = 1; @@ -91,7 +91,7 @@ void RemoteControler::startSchedule() { }); } -void RemoteControler::preProcessrxpacket(RemoteControlerReportPacket_t* packet) { +void RemoteControlerUpper::preProcessrxpacket(RemoteControlerReportPacket_t* packet) { // 判断包是否合法 #if DEBUG ZLOGI(TAG, "[rx-thread] : rx :%s(%d)", zhex2str(packet->data, packet->datalen), packet->datalen); @@ -119,7 +119,7 @@ void RemoteControler::preProcessrxpacket(RemoteControlerReportPacket_t* packet) } } -void RemoteControler::processRxEventPacket(RemoteControlerReportPacket_t* packet) { +void RemoteControlerUpper::processRxEventPacket(RemoteControlerReportPacket_t* packet) { #if DEBUG ZLOGI(TAG, "[process-thread] rx event : %s", zhex2str(packet->data, packet->datalen)); #endif @@ -128,7 +128,7 @@ void RemoteControler::processRxEventPacket(RemoteControlerReportPacket_t* packet // } callOnReport(packet->data, packet->datalen); } -bool RemoteControler::txcmd(uint8_t* data, uint32_t len) { +bool RemoteControlerUpper::txcmd(uint8_t* data, uint32_t len) { /** * @brief */ @@ -158,10 +158,12 @@ bool RemoteControler::txcmd(uint8_t* data, uint32_t len) { * CMD * ***********************************************************************************************************************/ -bool RemoteControler::setRemoterState(hand_acid_mode_t mode, bool state) { +bool RemoteControlerUpper::setRemoterState(hand_acid_mode_t mode, bool state) { zble_proto_packet_t* packet = (zble_proto_packet_t*)txbuf; int32_t param[2] = {mode, state}; zble_proto_utils_create_cmd_packet_int32(packet, kzble_app_cmd_set_state, m_index++, param, 2); bool suc = txcmd(txbuf, packet->packetlen); return suc; } + + diff --git a/usrc/service/remote_controler.hpp b/usrc/service/remote_controler.hpp index 9766a38..30759aa 100644 --- a/usrc/service/remote_controler.hpp +++ b/usrc/service/remote_controler.hpp @@ -1,15 +1,14 @@ #pragma once -#include "apphal/apphal.hpp" -#include "apphal/apphardware.hpp" +#include "apphardware/apphardware.hpp" #include "uappbase/base.hpp" namespace iflytop { using namespace std; -#define RCTRL RemoteControler::ins() +#define RCTRL RemoteControlerUpper::ins() typedef struct { uint8_t data[255]; uint16_t datalen; } RemoteControlerReportPacket_t; -class RemoteControler { +class RemoteControlerUpper { public: typedef std::function on_report_cb_t; @@ -25,11 +24,11 @@ class RemoteControler { uint8_t m_index = 0; public: - RemoteControler() {}; - ~RemoteControler() {}; + RemoteControlerUpper() {}; + ~RemoteControlerUpper() {}; - static RemoteControler* ins() { - static RemoteControler instance; + static RemoteControlerUpper* ins() { + static RemoteControlerUpper instance; return &instance; } @@ -38,7 +37,6 @@ class RemoteControler { void startSchedule(); bool isConnected(); - // bool cmd_set_state(hand_acid_mode_t mode, hand_pump_working_state_t state); private: bool txcmd(uint8_t* data, uint32_t len); @@ -47,6 +45,27 @@ class RemoteControler { void callOnReport(uint8_t* rx, int32_t len); public: + /*********************************************************************************************************************** + * COMMON_API * + ***********************************************************************************************************************/ + bool resetMasterBoard(); + bool resetClientBoard(); + + bool readMasterBoardVersion(zble_read_version_t* version); + bool readClientBoardVersion(zble_read_version_t* version); + + bool clearMasterResetFlag(); + bool clearSlaveResetFlag(); + + bool setMasterInDfuMode(); + bool setSlaveInDfuMode(); + + bool startScan(); + bool stopScan(); + + /*********************************************************************************************************************** + * app * + ***********************************************************************************************************************/ bool setRemoterState(hand_acid_mode_t mode, bool state); }; diff --git a/usrc/service/remote_controler_event_processer.cpp b/usrc/service/remote_controler_event_processer.cpp index a93b5a5..57e2ca2 100644 --- a/usrc/service/remote_controler_event_processer.cpp +++ b/usrc/service/remote_controler_event_processer.cpp @@ -3,7 +3,7 @@ using namespace iflytop; void RemoterControlerEventProcesser::initialize() { // - RemoteControler::ins()->regOnReport([this](uint8_t* rx, int32_t len) { // + RemoteControlerUpper::ins()->regOnReport([this](uint8_t* rx, int32_t len) { // onPacket((zble_proto_packet_t*)rx); }); } diff --git a/usrc/service/remote_controler_event_processer.hpp b/usrc/service/remote_controler_event_processer.hpp index 963cfa4..7a5cb78 100644 --- a/usrc/service/remote_controler_event_processer.hpp +++ b/usrc/service/remote_controler_event_processer.hpp @@ -1,6 +1,5 @@ #pragma once -#include "apphal/apphal.hpp" -#include "apphal/apphardware.hpp" +#include "apphardware/apphardware.hpp" #include "uappbase/base.hpp" namespace iflytop { using namespace std; diff --git a/usrc/service/ui_scheduler.cpp b/usrc/service/ui_scheduler.cpp deleted file mode 100644 index deb75d1..0000000 --- a/usrc/service/ui_scheduler.cpp +++ /dev/null @@ -1,396 +0,0 @@ -#include "ui_scheduler.hpp" - -#include -#include -#include -#include - -#include "tjc/tjc_constant.hpp" -using namespace iflytop; -#define CMD_OVERTIME 50 - -#define DEBUG 1 -static ZThread uart_rx_thread; -static ZThread rx_processed_thread; - -static ZQueue ackQueue; -static ZQueue eventQueue; -static ZThread usartRxThread; -static ZThread eventProcessThread; -static bool m_isWaitingForAck; -static UART_HandleTypeDef* tjcUart; - -#define TAG "UIScheduler" - -static const char* zhex2str(uint8_t* data, size_t len) { - static char buf[256]; - memset(buf, 0, sizeof(buf)); - for (size_t i = 0; i < len; i++) { - sprintf(buf + i * 2, "%02X", data[i]); - } - return buf; -} - -void UIScheduler::initialize() { // - ackQueue.initialize(5, sizeof(tjc_rx_packet_t)); - eventQueue.initialize(5, sizeof(tjc_rx_packet_t)); - usartRxThread.init("usartRxThread", 1024); - eventProcessThread.init("eventProcessThread", 1024); - - tjcUart = AppHardware::ins()->tjcUart; - m_cmdlock.init(); -} -#define UART_RX_OVERTIME 5 -void UIScheduler::startSchedule() { - usartRxThread.start([this]() { - static uint8_t rxbuf[128]; - tjcUart->USR_UartITRxing = 1; - tjcUart->USR_UartITRxBuf = rxbuf; - tjcUart->USR_UartITRxBufSize = 128; - tjcUart->USR_UartITRxOff = 0; - HAL_UART_Receive_IT(tjcUart, &tjcUart->USR_UartITRxBufCache, 1); - while (1) { - static uint8_t processbuf[128]; - int32_t rxsize = 0; - if (tjcUart->USR_UartITRxOff != 0 && zos_haspassedms(tjcUart->USR_UartITLastRxTicket) > UART_RX_OVERTIME) { - vPortEnterCritical(); - if (tjcUart->USR_UartITRxOff != 0 && zos_haspassedms(tjcUart->USR_UartITLastRxTicket) > UART_RX_OVERTIME) { - memcpy(processbuf, tjcUart->USR_UartITRxBuf, tjcUart->USR_UartITRxOff); - rxsize = tjcUart->USR_UartITRxOff; - tjcUart->USR_UartITRxOff = 0; - } - vPortExitCritical(); - } - - if (rxsize != 0) { - processScreenRxPacket(processbuf, rxsize); - } - osDelay(1); - } - }); - - eventProcessThread.start([this]() { - while (1) { - static tjc_rx_packet_t packet; - bool suc = eventQueue.receive(&packet, 10); - if (suc) { - memset(&event_cache, 0, sizeof(event_cache)); - uint8_t packetType = packet.data[0]; - if (packetType == tjc::kpt_inputfield_content_change_event) { - processUsrKeyboardConfirmEvent(packet.data, packet.datalen); - } else if (packetType == tjc::kpt_double_state_button_event) { - processUsrDoubleStateButtonEvent(packet.data, packet.datalen); - } else if (packetType == tjc::kpt_unlogin_request) { - event_cache.eventId = packet.data[0]; - event_cache.pid = packet.data[1]; - event_cache.bid = packet.data[2]; - callUsrEventCb(&event_cache); - } else if (packetType == tjc::kpt_login_request) { - processLoginRequestEvent(packet.data, packet.datalen); - } else if (tjc::kpt_button_event == packetType) { - event_cache.eventId = packet.data[0]; - event_cache.pid = packet.data[1]; - event_cache.bid = packet.data[2]; - event_cache.d.button_event.val = packet.data[3]; - callUsrEventCb(&event_cache); - } else if (tjc::kpt_sys_event_page_id == packetType) { - event_cache.eventId = packet.data[0]; - event_cache.pid = packet.data[1]; - event_cache.bid = 0; - callUsrEventCb(&event_cache); - } else { - event_cache.eventId = packet.data[0]; - callUsrEventCb(&event_cache); - ZLOGI(TAG, "[eventprocess-thread]: rx_event:%s", tjc::pt2str(packetType)); - } - } - osDelay(1); - } - }); -} - -// GVAR_triET -// GVAR_triBId -// GVAR_triPageId - -void UIScheduler::processScreenRxPacket(uint8_t* data, size_t len) { - // 判断包是否合法 -#if DEBUG - ZLOGI(TAG, "[rx-thread] : rx :%s(%d)", zhex2str(data, len), len); -#endif - - if (!(data[len - 1] == 0xff && data[len - 2] == 0xff && data[len - 3] == 0xff)) { - ZLOGI(TAG, "rx invalid packet %s", zhex2str(data, len)); - return; - } - if (TJC_MAX_PACKET_SIZE < len) { - ZLOGI(TAG, "rx invalid packet(tool long) %s", zhex2str(data, len)); - return; - } - - uint8_t packetType = data[0]; - - static tjc_rx_packet_t packet; - packet.datalen = len; - memcpy(packet.data, data, len); - if (tjc::kpt_ack == packetType) { - if (m_isWaitingForAck) { - bool suc = ackQueue.send(&packet, 10); - if (!suc) { - ZLOGI(TAG, "ackQueue send failed"); - } - m_isWaitingForAck = false; - } - - } else { - bool suc = eventQueue.send(&packet, 10); - if (!suc) { - ZLOGI(TAG, "eventQueue send failed"); - } - } -} - -void UIScheduler::regOnUsrEventCb(on_usr_event_cb_t cb) { - m_cb[m_ncb] = cb; - m_ncb++; -} - -static const char* zcpystr(char* cpyto, const char* strbegin, int32_t maxlen) { - if (strbegin == NULL) return NULL; - int32_t i = 0; - for (i = 0; i < maxlen; i++) { - cpyto[i] = strbegin[i]; - if (strbegin[i] == 0) { - return &strbegin[i + 1]; - } - } - return NULL; -} -void UIScheduler::processUsrButtonEvent(uint8_t* data, size_t len) { - /** - * @brief - * 指令格式: - * printh 65 - * prints dp,1 - * prints '&id&',1 - * printh FF FF FF - * - * AB Page cidName/0 FF FF FF - * - */ - // ButtonEventContext_t buttonEventCxt; - - // event_cache - memset(&event_cache, 0, sizeof(event_cache)); - event_cache.eventId = data[0]; - event_cache.pid = data[1]; - event_cache.bid = data[2]; - - callUsrEventCb(&event_cache); -} -void UIScheduler::processUsrDoubleStateButtonEvent(uint8_t* data, size_t len) { - /** - * @brief - * 指令格式: - * printh AD - * prints dp,1 - * prints '&id&',1 - * prints '&val&',1 - * printh FF FF FF - * - * AB Page cidName/0 FF FF FF - * - */ - // ButtonEventContext_t buttonEventCxt; - - // event_cache - memset(&event_cache, 0, sizeof(event_cache)); - event_cache.eventId = data[0]; - event_cache.pid = data[1]; - event_cache.bid = data[2]; - event_cache.d.double_state_button.val = data[3]; - - callUsrEventCb(&event_cache); -} -void UIScheduler::callUsrEventCb(tjc::tjc_usr_event_t* event) { - for (int32_t i = 0; i < m_ncb; i++) { - m_cb[i](event); - } -} - -void UIScheduler::processUsrKeyboardConfirmEvent(uint8_t* data, size_t len) { - /** - * @brief - * - * printh AC - * prints loadpageid.val,1 - * prints loadcmpid.val,1 - * prints p[loadpageid.val].b[loadcmpid.val].txt,0 - * printh 00 - * printh FF FF FF - * page loadpageid.val - * - */ - // ZLOGI(TAG, "processUsrKeyboardConfirmEvent"); - memset(&event_cache, 0, sizeof(event_cache)); - event_cache.eventId = data[0]; - event_cache.pid = data[1]; - event_cache.bid = data[2]; - const char* strbegin = (const char*)&data[3]; - strbegin = zcpystr(event_cache.d.inputfield_content.text, strbegin, sizeof(event_cache.d.inputfield_content.text)); - callUsrEventCb(&event_cache); -} - -void UIScheduler::processLoginRequestEvent(uint8_t* data, size_t len) { - /* - * printh AE - * prints dp,1 - * prints '&id&',1 - * prints cUsrName.txt,0 - * printh 00 - * prints txt_passwd.txt,0 - * printh 00 - * printh FF FF FF - */ - - // ZLOGI(TAG, "processLoginRequestEvent"); - memset(&event_cache, 0, sizeof(event_cache)); - event_cache.eventId = data[0]; - event_cache.pid = data[1]; - event_cache.bid = data[2]; - const char* strbegin = (const char*)&data[3]; - strbegin = zcpystr(event_cache.d.login_request.usrName, strbegin, MAX_USR_NAME_SIZE); - strbegin = zcpystr(event_cache.d.login_request.passwd, strbegin, MAX_USR_PASSWD_LENGTH); - - callUsrEventCb(&event_cache); -} - -bool UIScheduler::readTxt(uint8_t pid, uint8_t cId, char* txt, int32_t txtbuflen) { - zlock_guard lg(m_cmdlock); - - startReceiveAck(); - sendcmd("com_stop"); - sendcmd("printh AA"); - sendcmd("prints p[%d].b[%d].txt,0", pid, cId); - sendcmd("printh 00"); - sendcmd("printh FF FF FF"); - sendcmd("com_start"); - - bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME); - if (!suc) { - ZLOGI(TAG, "readTxt failed"); - return false; - } - int32_t cpysize = ackcache.datalen - 3; - if (cpysize > txtbuflen) { - cpysize = txtbuflen - 1; - } - - memcpy(txt, &ackcache.data[1], cpysize); - return true; -} -bool UIScheduler::readInt(uint8_t pid, uint8_t cId, int32_t* val) { - zlock_guard lg(m_cmdlock); - - startReceiveAck(); - sendcmd("com_stop"); - sendcmd("printh AA"); - sendcmd("prints p[%d].b[%d].val,4", pid, cId); - sendcmd("printh FF FF FF"); - sendcmd("com_start"); - - bool suc = ackQueue.receive(&ackcache, CMD_OVERTIME); - if (!suc) { - ZLOGI(TAG, "readTxt failed"); - return false; - } - - uint8_t int32val[4] = {0}; - memcpy(int32val, &ackcache.data[1], 4); - *val = *(int32_t*)int32val; - return true; -} - -bool UIScheduler::setVal(uint8_t pid, uint8_t bid, const char* txt, ...) { - zlock_guard lg(m_cmdlock); - - va_list args; - va_start(args, txt); - static char buf[128]; - vsprintf(buf, txt, args); - va_end(args); - - sendcmd("p[%d].b[%d].txt=\"%s\"", pid, bid, buf); - return true; -} -bool UIScheduler::setVal(uint8_t pid, uint8_t cid, int32_t val) { - zlock_guard lg(m_cmdlock); - sendcmd("p[%d].b[%d].val=%d", pid, cid, val); - return true; -} -bool UIScheduler::vis(uint16_t buuid, int32_t val) { - zlock_guard lg(m_cmdlock); - sendcmd("vis %d,%d", buuid & 0xff, val); - return true; -} - -void UIScheduler::alert(const char* info, ...) { - zlock_guard lg(m_cmdlock); - - va_list args; - va_start(args, info); - static char buf[128]; - vsprintf(buf, info, args); - - sendcmd("p[%d].b[%d].val=dp", pg_alert, ob_alert_frompage); - sendcmd("p[%d].b[%d].txt=\"%s\"", pg_alert, ob_alert_info, buf); - sendcmd("page alert"); -} -void UIScheduler::chpage(uint8_t page) { sendcmd("page %d", page); } - -void UIScheduler::sendcmd(const char* format, ...) { - static char buf[128]; - va_list args; - va_start(args, format); - vsprintf(buf, format, args); - va_end(args); - - uint8_t len = strlen(buf); - if (len > (128 - 3)) { - ZLOGI(TAG, "sendcmd too long"); - return; - } - - buf[len] = 0xff; - buf[len + 1] = 0xff; - buf[len + 2] = 0xff; - - HAL_UART_Transmit(tjcUart, (uint8_t*)buf, len + 3, 100); - while (true) { - osDelay(1); - if (tjcUart->gState == HAL_UART_STATE_READY) { - return; - } - } -} - -void UIScheduler::startReceiveAck() { - ackQueue.clear(); - m_isWaitingForAck = true; -} - -void UIScheduler::virtualClick(uint8_t pid, uint8_t bid, uint8_t event) { - zlock_guard lg(m_cmdlock); - sendcmd("click b[%d],%d", bid, event); -} - -void UIScheduler::setTouchEnableState(uint8_t bid, uint8_t enable) { - // tsw obj,state - zlock_guard lg(m_cmdlock); - sendcmd("tsw b[%d],%d", bid, enable); -} - -void UIScheduler::setEnumComponentState(uint8_t pid, uint8_t bid, int32_t state) { - // 枚举类型使用动画组件 - sendcmd("p[%d].b[%d].tim=%d", pid, bid, state * 50); -} diff --git a/usrc/service/ui_scheduler.hpp b/usrc/service/ui_scheduler.hpp deleted file mode 100644 index 6ff82fd..0000000 --- a/usrc/service/ui_scheduler.hpp +++ /dev/null @@ -1,82 +0,0 @@ -#pragma once -#include "apphal/apphal.hpp" -#include "apphal/apphardware.hpp" -#include "uappbase/base.hpp" - -// -#include "tjc/tjc.hpp" - -namespace iflytop { -using namespace std; -typedef struct { - uint8_t data[TJC_MAX_PACKET_SIZE]; - uint16_t datalen; -} tjc_rx_packet_t; - -typedef std::function on_usr_event_cb_t; - -#define UIS UIScheduler::ins() -class UIScheduler { - ZThread m_thread; - - tjc_rx_packet_t ackcache; - zmutex m_cmdlock; - - tjc::tjc_usr_event_t event_cache; - - // on_usr_event_cb_t cb; - - on_usr_event_cb_t m_cb[50]; - int32_t m_ncb = 0; - - public: - UIScheduler() {}; - ~UIScheduler() {}; - - static UIScheduler* ins() { - static UIScheduler instance; - return &instance; - } - - void initialize(); - void regOnUsrEventCb(on_usr_event_cb_t onclik); - - void startSchedule(); - - // cmd list - bool readTxt(uint8_t pid, uint8_t bid, char* txt, int32_t txtbuflen); - bool readInt(uint8_t pid, uint8_t bid, int32_t* val); - - bool setVal(uint8_t pid, uint8_t bid, const char* txt, ...); - bool setVal(uint8_t pid, uint8_t bid, int32_t val); - - bool setVal(uint16_t buuid, const char* txt) { return setVal(buuid >> 8, buuid & 0xff, txt); } - bool setVal(uint16_t buuid, int32_t val) { return setVal(buuid >> 8, buuid & 0xff, val); } - - bool vis(uint16_t buuid, int32_t val); // 不支持跨页面隐藏 - // vis b0,0 - - bool readTxt(uint16_t buuid, char* txt, int32_t txtbuflen) { return readTxt(buuid >> 8, buuid & 0xff, txt, txtbuflen); } - bool readInt(uint16_t buuid, int32_t* val) { return readInt(buuid >> 8, buuid & 0xff, val); } - - void alert(const char* info, ...); - void chpage(uint8_t page); - void virtualClick(uint8_t pid, uint8_t bid, uint8_t event); - void setTouchEnableState(uint8_t bid, uint8_t enable); - - void setEnumComponentState(uint8_t pid, uint8_t bid, int32_t state); - void sendcmd(const char* format, ...); - - private: - void processScreenRxPacket(uint8_t* data, size_t len); - void processUsrButtonEvent(uint8_t* data, size_t len); - void processUsrKeyboardConfirmEvent(uint8_t* data, size_t len); - void processUsrDoubleStateButtonEvent(uint8_t* data, size_t len); - void processLoginRequestEvent(uint8_t* data, size_t len); - - void startReceiveAck(); - - void callUsrEventCb(tjc::tjc_usr_event_t* event); -}; - -} // namespace iflytop