From 3f4162df70ac17d5cc1ea582a16dae95509541bb Mon Sep 17 00:00:00 2001 From: Wuqiyang312 Date: Mon, 19 Aug 2024 01:14:44 +0800 Subject: [PATCH] =?UTF-8?q?plaintextrefactor(stm32ui):=20=E9=87=8D?= =?UTF-8?q?=E6=96=B0=E9=85=8D=E7=BD=AESPI1=E4=B8=BASPI2=E5=B9=B6=E6=9B=B4?= =?UTF-8?q?=E6=96=B0GPIO=E8=AE=BE=E7=BD=AE=EF=BC=8CDEMO=E5=B7=B2=E7=BB=8F?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E4=BD=BF=E7=94=A8=E3=80=82=20-=20=E6=9B=B4?= =?UTF-8?q?=E6=96=B0GPIO=E8=AE=BE=E7=BD=AE=E4=BB=A5=E5=8F=8D=E6=98=A0SPI2?= =?UTF-8?q?=E7=9A=84=E5=BC=95=E8=84=9A=E5=88=86=E9=85=8D=E3=80=82=20-=20?= =?UTF-8?q?=E8=B0=83=E6=95=B4spi.c=E5=92=8Cspi.h=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E4=B8=AD=E7=9A=84SPI=E5=AE=9E=E4=BE=8B=E5=92=8C=E5=88=9D?= =?UTF-8?q?=E5=A7=8B=E5=8C=96=E4=BB=A3=E7=A0=81=E3=80=82=20-=E7=A1=AE?= =?UTF-8?q?=E4=BF=9DSTM32F407VGT6=E5=BE=AE=E6=8E=A7=E5=88=B6=E5=99=A8?= =?UTF-8?q?=E7=9A=84SPI2=E5=A4=96=E8=AE=BE=E7=8E=B0=E5=9C=A8=E6=AD=A3?= =?UTF-8?q?=E7=A1=AE=E5=88=9D=E5=A7=8B=E5=8C=96=E5=B9=B6=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=AD=A3=E7=A1=AE=E7=9A=84=E5=BC=95=E8=84=9A=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Core/Inc/main.h | 8 + Core/Inc/spi.h | 4 +- Core/Src/freertos.c | 82 +- Core/Src/gpio.c | 29 +- Core/Src/main.c | 2 +- Core/Src/spi.c | 104 +- U8g2/mui_u8g2.c | 2243 ----------------------------------------- U8g2/mui_u8g2.h | 308 ------ U8g2/u8g2_stm32_spi.c | 83 ++ U8g2/u8g2_stm32_spi.h | 23 + stm32ui.ioc | 76 +- 11 files changed, 287 insertions(+), 2675 deletions(-) delete mode 100644 U8g2/mui_u8g2.c delete mode 100644 U8g2/mui_u8g2.h create mode 100644 U8g2/u8g2_stm32_spi.c create mode 100644 U8g2/u8g2_stm32_spi.h diff --git a/Core/Inc/main.h b/Core/Inc/main.h index a46bccd..9c5d3a1 100644 --- a/Core/Inc/main.h +++ b/Core/Inc/main.h @@ -57,6 +57,14 @@ void Error_Handler(void); /* USER CODE END EFP */ /* Private defines -----------------------------------------------------------*/ +#define LED0_Pin GPIO_PIN_2 +#define LED0_GPIO_Port GPIOB +#define SPI2_CS_Pin GPIO_PIN_7 +#define SPI2_CS_GPIO_Port GPIOE +#define SPI2_RS_Pin GPIO_PIN_8 +#define SPI2_RS_GPIO_Port GPIOE +#define SPI2_RST_Pin GPIO_PIN_9 +#define SPI2_RST_GPIO_Port GPIOE /* USER CODE BEGIN Private defines */ diff --git a/Core/Inc/spi.h b/Core/Inc/spi.h index 6a5279d..5d4e747 100644 --- a/Core/Inc/spi.h +++ b/Core/Inc/spi.h @@ -32,13 +32,13 @@ extern "C" { /* USER CODE END Includes */ -extern SPI_HandleTypeDef hspi1; +extern SPI_HandleTypeDef hspi2; /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ -void MX_SPI1_Init(void); +void MX_SPI2_Init(void); /* USER CODE BEGIN Prototypes */ diff --git a/Core/Src/freertos.c b/Core/Src/freertos.c index 1a4c1c8..921d197 100644 --- a/Core/Src/freertos.c +++ b/Core/Src/freertos.c @@ -25,7 +25,7 @@ /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ - +#include "u8g2_stm32_spi.h" /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ @@ -50,16 +50,16 @@ /* Definitions for defaultTask */ osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes = { - .name = "defaultTask", - .stack_size = 128 * 4, - .priority = (osPriority_t) osPriorityNormal, + .name = "defaultTask", + .stack_size = 128 * 4, + .priority = (osPriority_t) osPriorityNormal, }; /* Definitions for u8g2Task */ osThreadId_t u8g2TaskHandle; const osThreadAttr_t u8g2Task_attributes = { - .name = "u8g2Task", - .stack_size = 128 * 4, - .priority = (osPriority_t) osPriorityNormal, + .name = "u8g2Task", + .stack_size = 128 * 4, + .priority = (osPriority_t) osPriorityNormal, }; /* Private function prototypes -----------------------------------------------*/ @@ -68,6 +68,7 @@ const osThreadAttr_t u8g2Task_attributes = { /* USER CODE END FunctionPrototypes */ void StartDefaultTask(void *argument); + void U8g2Task(void *argument); void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ @@ -78,40 +79,40 @@ void MX_FREERTOS_Init(void); /* (MISRA C 2004 rule 8.1) */ * @retval None */ void MX_FREERTOS_Init(void) { - /* USER CODE BEGIN Init */ + /* USER CODE BEGIN Init */ - /* USER CODE END Init */ + /* USER CODE END Init */ - /* USER CODE BEGIN RTOS_MUTEX */ + /* USER CODE BEGIN RTOS_MUTEX */ /* add mutexes, ... */ - /* USER CODE END RTOS_MUTEX */ + /* USER CODE END RTOS_MUTEX */ - /* USER CODE BEGIN RTOS_SEMAPHORES */ + /* USER CODE BEGIN RTOS_SEMAPHORES */ /* add semaphores, ... */ - /* USER CODE END RTOS_SEMAPHORES */ + /* USER CODE END RTOS_SEMAPHORES */ - /* USER CODE BEGIN RTOS_TIMERS */ + /* USER CODE BEGIN RTOS_TIMERS */ /* start timers, add new ones, ... */ - /* USER CODE END RTOS_TIMERS */ + /* USER CODE END RTOS_TIMERS */ - /* USER CODE BEGIN RTOS_QUEUES */ + /* USER CODE BEGIN RTOS_QUEUES */ /* add queues, ... */ - /* USER CODE END RTOS_QUEUES */ + /* USER CODE END RTOS_QUEUES */ - /* Create the thread(s) */ - /* creation of defaultTask */ - defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); + /* Create the thread(s) */ + /* creation of defaultTask */ + defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes); - /* creation of u8g2Task */ - u8g2TaskHandle = osThreadNew(U8g2Task, NULL, &u8g2Task_attributes); + /* creation of u8g2Task */ + u8g2TaskHandle = osThreadNew(U8g2Task, NULL, &u8g2Task_attributes); - /* USER CODE BEGIN RTOS_THREADS */ + /* USER CODE BEGIN RTOS_THREADS */ /* add threads, ... */ - /* USER CODE END RTOS_THREADS */ + /* USER CODE END RTOS_THREADS */ - /* USER CODE BEGIN RTOS_EVENTS */ + /* USER CODE BEGIN RTOS_EVENTS */ /* add events, ... */ - /* USER CODE END RTOS_EVENTS */ + /* USER CODE END RTOS_EVENTS */ } @@ -122,17 +123,16 @@ void MX_FREERTOS_Init(void) { * @retval None */ /* USER CODE END Header_StartDefaultTask */ -void StartDefaultTask(void *argument) -{ - /* USER CODE BEGIN StartDefaultTask */ +void StartDefaultTask(void *argument) { + /* USER CODE BEGIN StartDefaultTask */ /* Infinite loop */ for (;;) { - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_SET); + HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_SET); osDelay(1000); - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET); osDelay(1000); } - /* USER CODE END StartDefaultTask */ + /* USER CODE END StartDefaultTask */ } /* USER CODE BEGIN Header_U8g2Task */ @@ -142,14 +142,24 @@ void StartDefaultTask(void *argument) * @retval None */ /* USER CODE END Header_U8g2Task */ -void U8g2Task(void *argument) -{ - /* USER CODE BEGIN U8g2Task */ +void U8g2Task(void *argument) { + /* USER CODE BEGIN U8g2Task */ + u8g2_Setup_uc1701_mini12864_f(&u8g2, U8G2_R0, u8g2_byte_sw_spi_stm32, u8x8_gpio_and_delay_stm32); + u8g2_InitDisplay(&u8g2); //初始化显示 + u8g2_SetPowerSave(&u8g2, 0); //开启显示 /* Infinite loop */ + u8g2_FirstPage(&u8g2); + + // 循环绘制演示页面 + // 通过调用drawDemo函数绘制页面内容,每次绘制后检查是否需要绘制下一页 + // 使用u8g2_NextPage函数来确定是否继续绘制下一页,直到没有更多页面需要绘制 + do { + drawDemo(); + } while (u8g2_NextPage(&u8g2)); for (;;) { osDelay(1); } - /* USER CODE END U8g2Task */ + /* USER CODE END U8g2Task */ } /* Private application code --------------------------------------------------*/ diff --git a/Core/Src/gpio.c b/Core/Src/gpio.c index 787b35d..9c0ffdd 100644 --- a/Core/Src/gpio.c +++ b/Core/Src/gpio.c @@ -46,20 +46,37 @@ void MX_GPIO_Init(void) /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOH_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOB, GPIO_PIN_2, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED0_GPIO_Port, LED0_Pin, GPIO_PIN_RESET); - /*Configure GPIO pin : PB2 */ - GPIO_InitStruct.Pin = GPIO_PIN_2; + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOE, SPI2_CS_Pin|SPI2_RS_Pin|SPI2_RST_Pin, GPIO_PIN_RESET); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = LED0_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + HAL_GPIO_Init(LED0_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pin : PtPin */ + GPIO_InitStruct.Pin = SPI2_CS_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + HAL_GPIO_Init(SPI2_CS_GPIO_Port, &GPIO_InitStruct); + + /*Configure GPIO pins : PEPin PEPin */ + GPIO_InitStruct.Pin = SPI2_RS_Pin|SPI2_RST_Pin; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); } diff --git a/Core/Src/main.c b/Core/Src/main.c index 06c4a1e..d2d2584 100644 --- a/Core/Src/main.c +++ b/Core/Src/main.c @@ -92,8 +92,8 @@ int main(void) /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_SDIO_SD_Init(); - MX_SPI1_Init(); MX_FATFS_Init(); + MX_SPI2_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ diff --git a/Core/Src/spi.c b/Core/Src/spi.c index de55487..651fa86 100644 --- a/Core/Src/spi.c +++ b/Core/Src/spi.c @@ -24,38 +24,38 @@ /* USER CODE END 0 */ -SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi2; -/* SPI1 init function */ -void MX_SPI1_Init(void) +/* SPI2 init function */ +void MX_SPI2_Init(void) { - /* USER CODE BEGIN SPI1_Init 0 */ + /* USER CODE BEGIN SPI2_Init 0 */ - /* USER CODE END SPI1_Init 0 */ + /* USER CODE END SPI2_Init 0 */ - /* USER CODE BEGIN SPI1_Init 1 */ + /* USER CODE BEGIN SPI2_Init 1 */ - /* USER CODE END SPI1_Init 1 */ - 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_2; - 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) + /* USER CODE END SPI2_Init 1 */ + hspi2.Instance = SPI2; + hspi2.Init.Mode = SPI_MODE_MASTER; + hspi2.Init.Direction = SPI_DIRECTION_1LINE; + hspi2.Init.DataSize = SPI_DATASIZE_8BIT; + hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi2.Init.NSS = SPI_NSS_SOFT; + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; + hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi2.Init.TIMode = SPI_TIMODE_DISABLE; + hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi2.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi2) != HAL_OK) { Error_Handler(); } - /* USER CODE BEGIN SPI1_Init 2 */ + /* USER CODE BEGIN SPI2_Init 2 */ - /* USER CODE END SPI1_Init 2 */ + /* USER CODE END SPI2_Init 2 */ } @@ -63,54 +63,62 @@ void HAL_SPI_MspInit(SPI_HandleTypeDef* spiHandle) { GPIO_InitTypeDef GPIO_InitStruct = {0}; - if(spiHandle->Instance==SPI1) + if(spiHandle->Instance==SPI2) { - /* USER CODE BEGIN SPI1_MspInit 0 */ + /* USER CODE BEGIN SPI2_MspInit 0 */ - /* USER CODE END SPI1_MspInit 0 */ - /* SPI1 clock enable */ - __HAL_RCC_SPI1_CLK_ENABLE(); + /* USER CODE END SPI2_MspInit 0 */ + /* SPI2 clock enable */ + __HAL_RCC_SPI2_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - /**SPI1 GPIO Configuration - PA5 ------> SPI1_SCK - PA6 ------> SPI1_MISO - PA7 ------> SPI1_MOSI + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI2 GPIO Configuration + PC3 ------> SPI2_MOSI + PB10 ------> SPI2_SCK */ - GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Pin = GPIO_PIN_3; 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); + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); - /* USER CODE BEGIN SPI1_MspInit 1 */ + GPIO_InitStruct.Pin = 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_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); - /* USER CODE END SPI1_MspInit 1 */ + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ } } void HAL_SPI_MspDeInit(SPI_HandleTypeDef* spiHandle) { - if(spiHandle->Instance==SPI1) + if(spiHandle->Instance==SPI2) { - /* USER CODE BEGIN SPI1_MspDeInit 0 */ + /* USER CODE BEGIN SPI2_MspDeInit 0 */ - /* USER CODE END SPI1_MspDeInit 0 */ + /* USER CODE END SPI2_MspDeInit 0 */ /* Peripheral clock disable */ - __HAL_RCC_SPI1_CLK_DISABLE(); + __HAL_RCC_SPI2_CLK_DISABLE(); - /**SPI1 GPIO Configuration - PA5 ------> SPI1_SCK - PA6 ------> SPI1_MISO - PA7 ------> SPI1_MOSI + /**SPI2 GPIO Configuration + PC3 ------> SPI2_MOSI + PB10 ------> SPI2_SCK */ - HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_3); - /* USER CODE BEGIN SPI1_MspDeInit 1 */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10); - /* USER CODE END SPI1_MspDeInit 1 */ + /* USER CODE BEGIN SPI2_MspDeInit 1 */ + + /* USER CODE END SPI2_MspDeInit 1 */ } } diff --git a/U8g2/mui_u8g2.c b/U8g2/mui_u8g2.c deleted file mode 100644 index 7da693e..0000000 --- a/U8g2/mui_u8g2.c +++ /dev/null @@ -1,2243 +0,0 @@ -/* - - mui_u8g2.c - - Monochrome minimal user interface: Glue code between mui and u8g2. - - Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/) - - Copyright (c) 2021, olikraus@gmail.com - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list - of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -*/ - -/* - - field function naming convention - - action - draw_text: (rename from draw label) - draw_str: - btn_jmp button jump to: a button which jumps to a specific form - btn_exit button leave: a button which leaves the form and places an exit code into a uint8 variable - u8_value_0_9 - u8_chkbox - u8_radio - u8_opt_line edit value options in the same line - u8_opt_parent edit value options parent - u8_opt_child edit value options child - - - field width (not for draw text/str) - wm minimum width - wa width can be provided via FDS argument - w1 full display width - w2 half display size (minus some pixel) - w3 one/third of the dispay width (minus some pixel) - - edit mode (not for draw text/str, buttons and checkbox) - mse select: select event will increment the value or activate the field (buttons) - mud up/down: select will enter the up/down edit mode. Next/prev event will increment/decrement the value - - styles (not for draw text/str) - unselected selected up/down edit postfix Use for - plain invers invers + gap + frame pi input elements - frame invers+frame frame fi buttons - - plain frame invers + frame pf input elements - invers frame invers + frame if buttons - - - mui_u8g2_[action]_[field_width]_[edit_mode]_[style] - - mui _label_u8g2 --> mui_u8g2_draw_text - mui _goto_frame_button_invers_select_u8g2 --> mui_u8g2_btn_goto_wm_fi - mui _goto_half_width_frame_button_invers_select_u8g2 --> mui_u8g2_btn_goto_w2_fi - mui _goto_line_button_invers_select_u8g2 --> mui_u8g2_btn_goto_w1_fi - mui _leave_menu_frame_button_invers_select_u8g2 --> mui_u8g2_btn_exit_wm_fi - - mui _input_uint8_invers_select_u8g2 --> mui_u8g2_u8_value_0_9_wm_mse_pi - mui _single_line_option_invers_select_u8g2 --> mui_u8g2_u8_opt_line_wa_mse_pi - mui _select_options_parent_invers_select_u8g2 --> mui_u8g2_u8_opt_parent_wa_mse_pi - mui _select_options_child_invers_select_u8g2 --> mui_u8g2_u8_opt_child_wm_pi - - mui _checkbox_invers_select_u8g2 --> mui_u8g2_u8_chkbox_wm_pi - mui _radio_invers_select_u8g2 --> mui_u8g2_u8_radio_wm_pi - - mui _input_char_invers_select_u8g2 --> mui_u8g2_u8_char_wm_mud_pi - - - - 2 Buttons - Only use "mse", don't use "mud" - - Button Call Description - 1 mui_SendSelect() Activate elements & change values - 2 mui_NextField() Goto next field - - 3 Buttons - Use "mse" or "mud" - Button Call Description - 1 mui_SendSelect() Activate elements / change values (mse) / enter "mud" mode (mud) - 2 mui_NextField() Goto next field, increment value (mud) - 3 mui_PrevField() Goto prev field, decrement value (mud) - - 4 Buttons - Prefer "mse" - Button Call Description - 1 mui_SendValueIncrement() Activate elements / increment values (mse) - 2 mui_SendValueDecrement() Activate elements / decrement values (mse) - 3 mui_NextField() Goto next field - 4 mui_PrevField() Goto prev field - - 5 Buttons - Prefer "mse", use the MUIF_EXECUTE_ON_SELECT_BUTTON on forms to finish the form with the "form select" button 5 - Button Call Description - 1 mui_SendValueIncrement() Activate elements / increment values (mse) - 2 mui_SendValueDecrement() Activate elements / decrement values (mse) - 3 mui_NextField() Goto next field - 4 mui_PrevField() Goto prev field - 5 mui_SendSelectWithExecuteOnSelectFieldSearch() Execute the MUIF_EXECUTE_ON_SELECT_BUTTON button or activate the current element if there is no EOS button - - rotary encoder, push&release - Prefer "mud" - Button Call Description - encoder button mui_SendSelect() Activate elements / change values (mse) / enter "mud" mode (mud) - encoder CW mui_NextField() Goto next field, increment value (mud) - encoder CCW mui_PrevField() Goto prev field, decrement value (mud) - - rotary encoder, push&rotate - Prefer "mse" - Button Call Description - encoder CW mui_SendValueIncrement() Activate elements / increment values (mse) - encoder CCW mui_SendValueDecrement() Activate elements / decrement values (mse) - encoder CW+button press mui_NextField() Goto next field - encoder CCW+button press mui_PrevField() Goto prev field - - -*/ - - - -#include "mui.h" -#include "u8g2.h" -#include "mui_u8g2.h" - -/* - -uint8_t mui_template(mui_t *ui, uint8_t msg) -{ - //u8g2_t *u8g2 = mui_get_U8g2(ui); - //ui->dflags MUIF_DFLAG_IS_CURSOR_FOCUS MUIF_DFLAG_IS_TOUCH_FOCUS - //muif_get_cflags(ui->uif) MUIF_CFLAG_IS_CURSOR_SELECTABLE - //muif_get_data(ui->uif) - switch(msg) - { - case MUIF_MSG_DRAW: - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_VALUE_INCREMENT: - break; - case MUIF_MSG_VALUE_DECREMENT: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} -*/ - -/*=========================================================================*/ -#define MUI_U8G2_V_PADDING 1 - -/*=========================================================================*/ -/* extra u8g2 drawing functions */ - -static void u8g2_DrawCheckbox(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t is_checked) MUI_NOINLINE; -static void u8g2_DrawCheckbox(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w, u8g2_uint_t is_checked) -{ - u8g2_DrawFrame(u8g2, x, y-w, w, w); - if ( is_checked ) - { - w-=4; - u8g2_DrawBox(u8g2, x+2, y-w-2, w, w); - } -} - -static void u8g2_DrawValueMark(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t w) -{ - u8g2_DrawBox(u8g2, x, y-w, w, w); -} - - -/*=========================================================================*/ -/* helper function */ - -u8g2_uint_t mui_get_x(mui_t *ui) MUI_NOINLINE; -u8g2_uint_t mui_get_x(mui_t *ui) -{ - if ( u8g2_GetDisplayWidth(mui_get_U8g2(ui)) >= 255 ) - return ui->x * 2; - return ui->x; -} - -u8g2_uint_t mui_get_y(mui_t *ui) -{ - return ui->y; -} - -u8g2_t *mui_get_U8g2(mui_t *ui) -{ - return (u8g2_t *)(ui->graphics_data); -} - -//void u8g2_DrawButtonUTF8(u8g2_t *u8g2, u8g2_uint_t x, u8g2_uint_t y, u8g2_uint_t flags, u8g2_uint_t width, u8g2_uint_t padding_h, u8g2_uint_t padding_v, const char *text); -void mui_u8g2_draw_button_utf(mui_t *ui, u8g2_uint_t flags, u8g2_uint_t width, u8g2_uint_t padding_h, u8g2_uint_t padding_v, const char *text) -{ - if ( text==NULL) - text = ""; - u8g2_DrawButtonUTF8(mui_get_U8g2(ui), mui_get_x(ui), mui_get_y(ui), flags, width, padding_h, padding_v, text); -} - -u8g2_uint_t mui_u8g2_get_pi_flags(mui_t *ui) -{ - u8g2_uint_t flags = 0; - if ( mui_IsCursorFocus(ui) ) - { - flags |= U8G2_BTN_INV; - if ( ui->is_mud ) - { - flags |= U8G2_BTN_XFRAME; - } - } - return flags; -} - - -void mui_u8g2_draw_button_pi(mui_t *ui, u8g2_uint_t width, u8g2_uint_t padding_h, const char *text) -{ - mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), width, padding_h , MUI_U8G2_V_PADDING, text); -} - - -u8g2_uint_t mui_u8g2_get_fi_flags(mui_t *ui) -{ - u8g2_uint_t flags = 1; - if ( mui_IsCursorFocus(ui) ) - { - flags |= U8G2_BTN_INV; - if ( ui->is_mud ) - { - flags = 1; // undo INV - } - } - return flags; -} - -void mui_u8g2_draw_button_fi(mui_t *ui, u8g2_uint_t width, u8g2_uint_t padding_h, const char *text) -{ - mui_u8g2_draw_button_utf(ui, mui_u8g2_get_fi_flags(ui), width, padding_h , MUI_U8G2_V_PADDING, text); -} - - -u8g2_uint_t mui_u8g2_get_pf_flags(mui_t *ui) -{ - u8g2_uint_t flags = 0; - if ( mui_IsCursorFocus(ui) ) - { - flags |= 1; - if ( ui->is_mud ) - { - flags |= U8G2_BTN_INV; - } - } - return flags; -} - -void mui_u8g2_draw_button_pf(mui_t *ui, u8g2_uint_t width, u8g2_uint_t padding_h, const char *text) -{ - mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pf_flags(ui), width, padding_h , MUI_U8G2_V_PADDING, text); -} - - -u8g2_uint_t mui_u8g2_get_if_flags(mui_t *ui) -{ - u8g2_uint_t flags = 0; - if ( mui_IsCursorFocus(ui) ) - { - if ( ui->is_mud ) - { - flags |= 1; - flags |= U8G2_BTN_INV; - } - else - { - flags |= 1; - } - } - else - { - flags |= U8G2_BTN_INV; - } - return flags; -} - -void mui_u8g2_draw_button_if(mui_t *ui, u8g2_uint_t width, u8g2_uint_t padding_h, const char *text) -{ - mui_u8g2_draw_button_utf(ui, mui_u8g2_get_if_flags(ui), width, padding_h , MUI_U8G2_V_PADDING, text); -} - - -static uint8_t mui_u8g2_handle_scroll_next_prev_events(mui_t *ui, uint8_t msg) MUI_NOINLINE; -static uint8_t mui_u8g2_handle_scroll_next_prev_events(mui_t *ui, uint8_t msg) -{ - uint8_t arg = ui->arg; - switch(msg) - { - case MUIF_MSG_CURSOR_ENTER: - if ( (arg > 0) && (ui->form_scroll_top + arg >= ui->form_scroll_total) ) - return 255; - break; - case MUIF_MSG_EVENT_NEXT: - if ( arg+1 == ui->form_scroll_visible ) - { - if ( ui->form_scroll_visible + ui->form_scroll_top < ui->form_scroll_total ) - { - ui->form_scroll_top++; - return 1; - } - else - { - ui->form_scroll_top = 0; - } - } - break; - case MUIF_MSG_EVENT_PREV: - if ( arg == 0 ) - { - if ( ui->form_scroll_top > 0 ) - { - ui->form_scroll_top--; - return 1; - } - else - { - if ( ui->form_scroll_total > ui->form_scroll_visible ) - { - ui->form_scroll_top = ui->form_scroll_total - ui->form_scroll_visible; - } - else - { - ui->form_scroll_top = 0; - } - } - } - break; - } - return 0; -} - -/*=========================================================================*/ -/* simplified style function */ - -/* -Used for MUIF_U8G2_FONT_STYLE(n,font) -*/ - -uint8_t mui_u8g2_set_font_style_function(mui_t *ui, uint8_t msg) -{ - if ( msg == MUIF_MSG_DRAW ) - { - u8g2_SetFont(mui_get_U8g2(ui), (uint8_t *)muif_get_data(ui->uif)); - } - return 0; -} - - - -/*=========================================================================*/ -/* field functions */ - -/* - xy: yes, arg: no, text: yes -*/ - -uint8_t mui_u8g2_draw_text(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - u8g2_DrawUTF8(mui_get_U8g2(ui), mui_get_x(ui), mui_get_y(ui), ui->text); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - break; - case MUIF_MSG_VALUE_INCREMENT: - break; - case MUIF_MSG_VALUE_DECREMENT: - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - - -/* - - uint8_t mui_u8g2_btn_goto_wm_fi(mui_t *ui, uint8_t msg) - - Description: - A button with size equal to button text plus one pixel padding - The button has a one pixel frame around the text. - If the selected, then the form will change to the specified form number. - - Message Handling: DRAW, CURSOR_SELECT - - Style - No Selection: Text + Frame - Cursor Selection: Inverted text + Frame - - User interface field list (muif): - flags: MUIF_CFLAG_IS_CURSOR_SELECTABLE - data: not used - - Field definition string (fds): - xy: Left position of the text (required) - arg: Form numner (required) - text: Button label - -*/ -uint8_t mui_u8g2_btn_goto_wm_fi(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_draw_button_utf(ui, U8G2_BTN_HCENTER |mui_u8g2_get_fi_flags(ui), 0, 1, MUI_U8G2_V_PADDING, ui->text); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - //return mui_GotoForm(ui, ui->arg, 0); - return mui_GotoFormAutoCursorPosition(ui, ui->arg); - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - - } - return 0; -} - -uint8_t mui_u8g2_btn_goto_wm_if(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_draw_button_utf(ui, U8G2_BTN_HCENTER |mui_u8g2_get_if_flags(ui), 0, 1, MUI_U8G2_V_PADDING, ui->text); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - //return mui_GotoForm(ui, ui->arg, 0); - return mui_GotoFormAutoCursorPosition(ui, ui->arg); - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - - } - return 0; -} - -uint8_t mui_u8g2_btn_goto_w2_fi(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_draw_button_utf(ui, U8G2_BTN_HCENTER | mui_u8g2_get_fi_flags(ui), u8g2_GetDisplayWidth(u8g2)/2 - 10, 0, MUI_U8G2_V_PADDING, ui->text); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - //return mui_GotoForm(ui, ui->arg, 0); - return mui_GotoFormAutoCursorPosition(ui, ui->arg); - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - -uint8_t mui_u8g2_btn_goto_w2_if(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_draw_button_utf(ui, U8G2_BTN_HCENTER | mui_u8g2_get_if_flags(ui), u8g2_GetDisplayWidth(u8g2)/2 - 10, 0, MUI_U8G2_V_PADDING, ui->text); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - //return mui_GotoForm(ui, ui->arg, 0); - return mui_GotoFormAutoCursorPosition(ui, ui->arg); - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - -/* - - uint8_t mui_u8g2_btn_exit_wm_fi(mui_t *ui, uint8_t msg) - - Description: - A button with size equal to button text plus one pixel padding - The button has a one pixel frame around the text. - If selected, then the menu system will be closed. - The arg value will be stored at the specified data location (if not NULL). - The arg value can be used as an exit value of the button. - - Message Handling: DRAW, CURSOR_SELECT - - Style - No Selection: Text + Frame - Cursor Selection: Inverted text + Frame - - User interface field list (muif): - flags: MUIF_CFLAG_IS_CURSOR_SELECTABLE - data: Optionally points to uint8_t value which will receive the arg value of the field. - - Field definition string (fds): - xy: Left position of the text (required) - arg: Value which will be stored at *data (optional) - text: Button label - -*/ -uint8_t mui_u8g2_btn_exit_wm_fi(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_draw_button_utf(ui, U8G2_BTN_HCENTER |mui_u8g2_get_fi_flags(ui), 0, 1, MUI_U8G2_V_PADDING, ui->text); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - { - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - if ( value != NULL ) - *value = ui->arg; - } - mui_SaveForm(ui); // store the current form and position so that the child can jump back - mui_LeaveForm(ui); - return 1; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - - -uint8_t mui_u8g2_btn_goto_w1_pi(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_draw_button_pi(ui, u8g2_GetDisplayWidth(u8g2)-mui_get_x(ui)*2, mui_get_x(ui) , ui->text); - //mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), u8g2_GetDisplayWidth(u8g2)-mui_get_x(ui)*2, mui_get_x(ui) , MUI_U8G2_V_PADDING, ui->text); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - //return mui_GotoForm(ui, ui->arg, 0); - return mui_GotoFormAutoCursorPosition(ui, ui->arg); - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - - -uint8_t mui_u8g2_btn_goto_w1_fi(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_draw_button_fi(ui, u8g2_GetDisplayWidth(u8g2)-mui_get_x(ui)*2, mui_get_x(ui)-1 , ui->text); - //mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), u8g2_GetDisplayWidth(u8g2)-mui_get_x(ui)*2, mui_get_x(ui) , MUI_U8G2_V_PADDING, ui->text); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - //return mui_GotoForm(ui, ui->arg, 0); - return mui_GotoFormAutoCursorPosition(ui, ui->arg); - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - -/*===============================================================================*/ - -static void mui_u8g2_u8_vmm_draw_wm_pi(mui_t *ui) MUI_NOINLINE; -static void mui_u8g2_u8_vmm_draw_wm_pi(mui_t *ui) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - mui_u8g2_u8_min_max_t *vmm= (mui_u8g2_u8_min_max_t *)muif_get_data(ui->uif); - char buf[4] = "999"; - char *s = buf; - uint8_t *value = mui_u8g2_u8mm_get_valptr(vmm); - uint8_t min = mui_u8g2_u8mm_get_min(vmm); - uint8_t max = mui_u8g2_u8mm_get_max(vmm); - uint8_t cnt = 3; - - if ( *value > max ) - *value = max; - if ( *value <= min ) - *value = min; - if ( max < 100 ) - { - s++; - cnt--; - } - if ( max < 10 ) - { - s++; - cnt--; - } - //mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), u8g2_GetStrWidth(u8g2, s)+1, 1, MUI_U8G2_V_PADDING, u8x8_u8toa(*value, cnt)); - mui_u8g2_draw_button_pi(ui, u8g2_GetStrWidth(u8g2, s)+1, 1, u8x8_u8toa(*value, cnt)); -} - - -uint8_t mui_u8g2_u8_min_max_wm_mse_pi(mui_t *ui, uint8_t msg) -{ - mui_u8g2_u8_min_max_t *vmm= (mui_u8g2_u8_min_max_t *)muif_get_data(ui->uif); - uint8_t *value = mui_u8g2_u8mm_get_valptr(vmm); - uint8_t min = mui_u8g2_u8mm_get_min(vmm); - uint8_t max = mui_u8g2_u8mm_get_max(vmm); - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_vmm_draw_wm_pi(ui); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - (*value)++; - if ( *value > max ) *value = min; - break; - case MUIF_MSG_VALUE_DECREMENT: - if ( *value > min ) (*value)--; else *value = max; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - -uint8_t mui_u8g2_u8_min_max_wm_mud_pi(mui_t *ui, uint8_t msg) -{ - mui_u8g2_u8_min_max_t *vmm= (mui_u8g2_u8_min_max_t *)muif_get_data(ui->uif); - uint8_t *value = mui_u8g2_u8mm_get_valptr(vmm); - uint8_t min = mui_u8g2_u8mm_get_min(vmm); - uint8_t max = mui_u8g2_u8mm_get_max(vmm); - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_vmm_draw_wm_pi(ui); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - /* toggle between normal mode and capture next/prev mode */ - ui->is_mud = !ui->is_mud; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - case MUIF_MSG_EVENT_NEXT: - if ( ui->is_mud ) - { - (*value)++; - if ( *value > max ) - *value = min; - return 1; - } - break; - case MUIF_MSG_EVENT_PREV: - if ( ui->is_mud ) - { - if ( *value <= min ) - *value = max; - else - (*value)--; - return 1; - } - break; - } - return 0; -} - - - -static void mui_u8g2_u8_vmm_draw_wm_pf(mui_t *ui) MUI_NOINLINE; -static void mui_u8g2_u8_vmm_draw_wm_pf(mui_t *ui) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - mui_u8g2_u8_min_max_t *vmm= (mui_u8g2_u8_min_max_t *)muif_get_data(ui->uif); - char buf[4] = "999"; - char *s = buf; - uint8_t *value = mui_u8g2_u8mm_get_valptr(vmm); - uint8_t min = mui_u8g2_u8mm_get_min(vmm); - uint8_t max = mui_u8g2_u8mm_get_max(vmm); - uint8_t cnt = 3; - - if ( *value > max ) - *value = max; - if ( *value <= min ) - *value = min; - if ( max < 100 ) - { - s++; - cnt--; - } - if ( max < 10 ) - { - s++; - cnt--; - } - //mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), u8g2_GetStrWidth(u8g2, s)+1, 1, MUI_U8G2_V_PADDING, u8x8_u8toa(*value, cnt)); - mui_u8g2_draw_button_pf(ui, u8g2_GetStrWidth(u8g2, s)+1, 1, u8x8_u8toa(*value, cnt)); -} - - -uint8_t mui_u8g2_u8_min_max_wm_mse_pf(mui_t *ui, uint8_t msg) -{ - mui_u8g2_u8_min_max_t *vmm= (mui_u8g2_u8_min_max_t *)muif_get_data(ui->uif); - uint8_t *value = mui_u8g2_u8mm_get_valptr(vmm); - uint8_t min = mui_u8g2_u8mm_get_min(vmm); - uint8_t max = mui_u8g2_u8mm_get_max(vmm); - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_vmm_draw_wm_pf(ui); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - (*value)++; - if ( *value > max ) *value = min; - break; - case MUIF_MSG_VALUE_DECREMENT: - if ( *value > min ) (*value)--; else *value = max; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - -uint8_t mui_u8g2_u8_min_max_wm_mud_pf(mui_t *ui, uint8_t msg) -{ - mui_u8g2_u8_min_max_t *vmm= (mui_u8g2_u8_min_max_t *)muif_get_data(ui->uif); - uint8_t *value = mui_u8g2_u8mm_get_valptr(vmm); - uint8_t min = mui_u8g2_u8mm_get_min(vmm); - uint8_t max = mui_u8g2_u8mm_get_max(vmm); - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_vmm_draw_wm_pf(ui); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - /* toggle between normal mode and capture next/prev mode */ - ui->is_mud = !ui->is_mud; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - case MUIF_MSG_EVENT_NEXT: - if ( ui->is_mud ) - { - (*value)++; - if ( *value > max ) - *value = min; - return 1; - } - break; - case MUIF_MSG_EVENT_PREV: - if ( ui->is_mud ) - { - if ( *value <= min ) - *value = max; - else - (*value)--; - return 1; - } - break; - } - return 0; -} - - -/*===============================================================================*/ - -static uint8_t mui_u8g2_u8_bar_mse_msg_handler(mui_t *ui, uint8_t msg) MUI_NOINLINE; -static uint8_t mui_u8g2_u8_bar_mse_msg_handler(mui_t *ui, uint8_t msg) -{ - mui_u8g2_u8_min_max_step_t *vmms= (mui_u8g2_u8_min_max_step_t *)muif_get_data(ui->uif); - uint8_t *value = mui_u8g2_u8mms_get_valptr(vmms); - uint8_t min = mui_u8g2_u8mms_get_min(vmms); - uint8_t max = mui_u8g2_u8mms_get_max(vmms); - uint8_t step = mui_u8g2_u8mms_get_step(vmms); - uint8_t flags = mui_u8g2_u8mms_get_flags(vmms); - - switch(msg) - { - case MUIF_MSG_DRAW: - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - (*value)+=step; - if ( *value > max ) - { - if ( flags & MUI_MMS_NO_WRAP ) - *value = max; - else - *value = min; - } - break; - case MUIF_MSG_VALUE_DECREMENT: - if ( *value >= min+step ) - (*value)-=step; - else - { - if ( flags & MUI_MMS_NO_WRAP ) - *value = min; - else - *value = max; - } - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - -static uint8_t mui_u8g2_u8_bar_mud_msg_handler(mui_t *ui, uint8_t msg) MUI_NOINLINE; -static uint8_t mui_u8g2_u8_bar_mud_msg_handler(mui_t *ui, uint8_t msg) -{ - mui_u8g2_u8_min_max_step_t *vmms= (mui_u8g2_u8_min_max_step_t *)muif_get_data(ui->uif); - uint8_t *value = mui_u8g2_u8mms_get_valptr(vmms); - uint8_t min = mui_u8g2_u8mms_get_min(vmms); - uint8_t max = mui_u8g2_u8mms_get_max(vmms); - uint8_t step = mui_u8g2_u8mms_get_step(vmms); - uint8_t flags = mui_u8g2_u8mms_get_flags(vmms); - switch(msg) - { - case MUIF_MSG_DRAW: - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - /* toggle between normal mode and capture next/prev mode */ - ui->is_mud = !ui->is_mud; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - case MUIF_MSG_EVENT_NEXT: - if ( ui->is_mud ) - { - (*value)+=step; - if ( *value > max ) - { - if ( flags & MUI_MMS_NO_WRAP ) - *value = max; - else - *value = min; - } - return 1; - } - break; - case MUIF_MSG_EVENT_PREV: - if ( ui->is_mud ) - { - if ( *value <= min || *value > max) - { - if ( flags & MUI_MMS_NO_WRAP ) - *value = min; - else - *value = max; - } - else - (*value)-=step; - return 1; - } - break; - } - return 0; -} - - - -static void mui_u8g2_u8_bar_draw_wm(mui_t *ui, uint8_t flags, uint8_t is_fixed_width) MUI_NOINLINE; -static void mui_u8g2_u8_bar_draw_wm(mui_t *ui, uint8_t flags, uint8_t is_fixed_width) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - mui_u8g2_u8_min_max_step_t *vmms= (mui_u8g2_u8_min_max_step_t *)muif_get_data(ui->uif); - char buf[4] = "999"; - char *s = buf; - uint8_t *value = mui_u8g2_u8mms_get_valptr(vmms); - uint8_t min = mui_u8g2_u8mms_get_min(vmms); - uint8_t max = mui_u8g2_u8mms_get_max(vmms); - uint8_t scale = 0; - //uint8_t step = mui_u8g2_u8mms_get_step(vmms); - uint8_t mms_flags = mui_u8g2_u8mms_get_flags(vmms); - uint8_t cnt = 3; - uint8_t height = u8g2_GetAscent(u8g2); - int8_t backup_descent; - u8g2_uint_t x = mui_get_x(ui); - u8g2_uint_t w = 0; - u8g2_uint_t v; // the calculated pixel value - - if ( mms_flags & MUI_MMS_2X_BAR ) - scale |= 1; - if ( mms_flags & MUI_MMS_4X_BAR ) - scale |= 2; - - if ( *value > max ) - *value = max; - if ( *value <= min ) - *value = min; - if ( max < 100 ) - { - s++; - cnt--; - } - if ( max < 10 ) - { - s++; - cnt--; - } - - if ( is_fixed_width == 0 ) - { - w += (max<font_ref_descent; - u8g2->font_ref_descent = 0; /* hmm... that's a low level hack so that DrawButtonFrame ignores the descent value of the font */ - u8g2_DrawButtonFrame(u8g2, x, mui_get_y(ui), flags, w, 1, 1); - u8g2->font_ref_descent = backup_descent; -} - -// #define MUIF_U8G2_U8_MIN_MAX_STEP(id, valptr, min, max, step, flags, muif) - -uint8_t mui_u8g2_u8_bar_wm_mse_pi(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_bar_draw_wm(ui, mui_u8g2_get_pi_flags(ui), 0); - break; - default: - return mui_u8g2_u8_bar_mse_msg_handler(ui, msg); - } - return 0; -} - - -uint8_t mui_u8g2_u8_bar_wm_mud_pi(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_bar_draw_wm(ui, mui_u8g2_get_pi_flags(ui), 0); - break; - default: - return mui_u8g2_u8_bar_mud_msg_handler(ui, msg); - } - return 0; -} - -uint8_t mui_u8g2_u8_bar_wm_mse_pf(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_bar_draw_wm(ui, mui_u8g2_get_pf_flags(ui), 0); - break; - default: - return mui_u8g2_u8_bar_mse_msg_handler(ui, msg); - } - return 0; -} - -uint8_t mui_u8g2_u8_bar_wm_mud_pf(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_bar_draw_wm(ui, mui_u8g2_get_pf_flags(ui), 0); - break; - default: - return mui_u8g2_u8_bar_mud_msg_handler(ui, msg); - } - return 0; -} - - - -// #define MUIF_U8G2_U8_MIN_MAX_STEP_WIDTH(id, valptr, min, max, step, width, flags, muif) - - -uint8_t mui_u8g2_u8_fixed_width_bar_wm_mse_pi(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_bar_draw_wm(ui, mui_u8g2_get_pi_flags(ui), 1); - break; - default: - return mui_u8g2_u8_bar_mse_msg_handler(ui, msg); - } - return 0; -} - - -uint8_t mui_u8g2_u8_fixed_width_bar_wm_mud_pi(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_bar_draw_wm(ui, mui_u8g2_get_pi_flags(ui), 1); - break; - default: - return mui_u8g2_u8_bar_mud_msg_handler(ui, msg); - } - return 0; -} - -uint8_t mui_u8g2_u8_fixed_width_bar_wm_mse_pf(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_bar_draw_wm(ui, mui_u8g2_get_pf_flags(ui), 1); - break; - default: - return mui_u8g2_u8_bar_mse_msg_handler(ui, msg); - } - return 0; -} - -uint8_t mui_u8g2_u8_fixed_width_bar_wm_mud_pf(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_u8_bar_draw_wm(ui, mui_u8g2_get_pf_flags(ui), 1); - break; - default: - return mui_u8g2_u8_bar_mud_msg_handler(ui, msg); - } - return 0; -} - - - -/*===============================================================================*/ - -static uint8_t mui_is_valid_char(uint8_t c) MUI_NOINLINE; -uint8_t mui_is_valid_char(uint8_t c) -{ - if ( c == 32 ) - return 1; - if ( c >= 'A' && c <= 'Z' ) - return 1; - if ( c >= 'a' && c <= 'z' ) - return 1; - if ( c >= '0' && c <= '9' ) - return 1; - return 0; -} - - - -uint8_t mui_u8g2_u8_char_wm_mud_pi(mui_t *ui, uint8_t msg) -{ - //ui->dflags MUIF_DFLAG_IS_CURSOR_FOCUS MUIF_DFLAG_IS_TOUCH_FOCUS - //mui_get_cflags(ui->uif) MUIF_CFLAG_IS_CURSOR_SELECTABLE - u8g2_t *u8g2 = mui_get_U8g2(ui); - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - char buf[6]; - switch(msg) - { - case MUIF_MSG_DRAW: - while( mui_is_valid_char(*value) == 0 ) - (*value)++; - buf[0] = *value; - buf[1] = '\0'; - mui_u8g2_draw_button_pi(ui, u8g2_GetMaxCharWidth(u8g2), 1, buf); - //mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), u8g2_GetMaxCharWidth(u8g2), 1, MUI_U8G2_V_PADDING, buf); - //u8g2_DrawButtonUTF8(u8g2, mui_get_x(ui), mui_get_y(ui), mui_u8g2_get_pi_flags(ui), u8g2_GetMaxCharWidth(u8g2), 1, MUI_U8G2_V_PADDING, buf); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - /* toggle between normal mode and capture next/prev mode */ - ui->is_mud = !ui->is_mud; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - case MUIF_MSG_EVENT_NEXT: - if ( ui->is_mud ) - { - do { - (*value)++; - } while( mui_is_valid_char(*value) == 0 ); - return 1; - } - break; - case MUIF_MSG_EVENT_PREV: - if ( ui->is_mud ) - { - do { - (*value)--; - } while( mui_is_valid_char(*value) == 0 ); - return 1; - } - break; - } - return 0; -} - - - - - -/* - - uint8_t mui_u8g2_u8_opt_line_wa_mse_pi(mui_t *ui, uint8_t msg) - - Description: - Select one of several options. First option has value 0. - Only one option is visible. - The visible option is automatically the selected option. - - Message Handling: DRAW, SELECT - - Style - No Selection: Text only - Cursor Selection: Inverted text - - User interface field list (muif): - flags: MUIF_CFLAG_IS_CURSOR_SELECTABLE - data: uint8_t *, pointer to a uint8_t variable, which contains the selected option - - Field definition string (fds): - xy: Left position of the text (required) - arg: total width of the selectable option (optional), - text: '|' separated list of options - -*/ -uint8_t mui_u8g2_u8_opt_line_wa_mse_pi(mui_t *ui, uint8_t msg) -{ - //u8g2_t *u8g2 = mui_get_U8g2(ui); - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - switch(msg) - { - case MUIF_MSG_DRAW: - if ( mui_fds_get_nth_token(ui, *value) == 0 ) - { - *value = 0; - mui_fds_get_nth_token(ui, *value); - } - mui_u8g2_draw_button_pi(ui, ui->arg, 1, ui->text); - //mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), ui->arg, 1, MUI_U8G2_V_PADDING, ui->text); - //u8g2_DrawButtonUTF8(u8g2, mui_get_x(ui), mui_get_y(ui), mui_u8g2_get_pi_flags(ui), ui->arg, 1, MUI_U8G2_V_PADDING, ui->text); - - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - (*value)++; - if ( mui_fds_get_nth_token(ui, *value) == 0 ) - *value = 0; - break; - case MUIF_MSG_VALUE_DECREMENT: - if ( *value > 0 ) - (*value)--; - else - (*value) = mui_fds_get_token_cnt(ui)-1; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - -uint8_t mui_u8g2_u8_opt_line_wa_mse_pf(mui_t *ui, uint8_t msg) -{ - //u8g2_t *u8g2 = mui_get_U8g2(ui); - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - switch(msg) - { - case MUIF_MSG_DRAW: - if ( mui_fds_get_nth_token(ui, *value) == 0 ) - { - *value = 0; - mui_fds_get_nth_token(ui, *value); - } - mui_u8g2_draw_button_pf(ui, ui->arg, 1, ui->text); - - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - (*value)++; - if ( mui_fds_get_nth_token(ui, *value) == 0 ) - *value = 0; - break; - case MUIF_MSG_VALUE_DECREMENT: - if ( *value > 0 ) - (*value)--; - else - (*value) = mui_fds_get_token_cnt(ui)-1; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - -uint8_t mui_u8g2_u8_opt_line_wa_mud_pi(mui_t *ui, uint8_t msg) -{ - //u8g2_t *u8g2 = mui_get_U8g2(ui); - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - switch(msg) - { - case MUIF_MSG_DRAW: - if ( mui_fds_get_nth_token(ui, *value) == 0 ) - { - *value = 0; - mui_fds_get_nth_token(ui, *value); - } - mui_u8g2_draw_button_pi(ui, ui->arg, 1, ui->text); - - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - /* toggle between normal mode and capture next/prev mode */ - ui->is_mud = !ui->is_mud; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - case MUIF_MSG_EVENT_NEXT: - if ( ui->is_mud ) - { - (*value)++; - if ( mui_fds_get_nth_token(ui, *value) == 0 ) - *value = 0; - return 1; - } - break; - case MUIF_MSG_EVENT_PREV: - if ( ui->is_mud ) - { - if ( *value == 0 ) - *value = mui_fds_get_token_cnt(ui); - (*value)--; - return 1; - } - break; - } - return 0; -} - -uint8_t mui_u8g2_u8_opt_line_wa_mud_pf(mui_t *ui, uint8_t msg) -{ - //u8g2_t *u8g2 = mui_get_U8g2(ui); - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - switch(msg) - { - case MUIF_MSG_DRAW: - if ( mui_fds_get_nth_token(ui, *value) == 0 ) - { - *value = 0; - mui_fds_get_nth_token(ui, *value); - } - mui_u8g2_draw_button_pf(ui, ui->arg, 1, ui->text); - - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - /* toggle between normal mode and capture next/prev mode */ - ui->is_mud = !ui->is_mud; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - case MUIF_MSG_EVENT_NEXT: - if ( ui->is_mud ) - { - (*value)++; - if ( mui_fds_get_nth_token(ui, *value) == 0 ) - *value = 0; - return 1; - } - break; - case MUIF_MSG_EVENT_PREV: - if ( ui->is_mud ) - { - if ( *value == 0 ) - *value = mui_fds_get_token_cnt(ui); - (*value)--; - return 1; - } - break; - } - return 0; -} - - - -/* - - uint8_t mui_u8g2_u8_chkbox_wm_pi(mui_t *ui, uint8_t msg) - - Description: - Checkbox with the values 0 (not selected) and 1 (selected). - - Message Handling: DRAW, SELECT - - Style - No Selection: Plain checkbox and text - Cursor Selection: Checkbox and text is inverted - - User interface field list (muif): - flags: MUIF_CFLAG_IS_CURSOR_SELECTABLE - data: uint8_t *, pointer to a uint8_t variable, which contains the values 0 or 1 - - Field definition string (fds): - xy: Left position of the text (required) - arg: not used - text: Optional: Text will be printed after the checkbox with a small gap - -*/ - -uint8_t mui_u8g2_u8_chkbox_wm_pi(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - u8g2_uint_t flags = 0; - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - switch(msg) - { - case MUIF_MSG_DRAW: - if ( *value > 1 ) *value = 1; - if ( mui_IsCursorFocus(ui) ) - { - flags |= U8G2_BTN_INV; - } - - { - u8g2_uint_t w = 0; - u8g2_uint_t a = u8g2_GetAscent(u8g2); - if ( *value ) - u8g2_DrawCheckbox(u8g2, mui_get_x(ui), mui_get_y(ui), a, 1); - else - u8g2_DrawCheckbox(u8g2, mui_get_x(ui), mui_get_y(ui), a, 0); - - if ( ui->text[0] != '\0' ) - { - w = u8g2_GetUTF8Width(u8g2, ui->text); - //u8g2_SetFontMode(u8g2, 1); - a += 2; /* add gap between the checkbox and the text area */ - u8g2_DrawUTF8(u8g2, mui_get_x(ui)+a, mui_get_y(ui), ui->text); - } - - u8g2_DrawButtonFrame(u8g2, mui_get_x(ui), mui_get_y(ui), flags, w+a, 1, MUI_U8G2_V_PADDING); - } - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - (*value)++; - if ( *value > 1 ) *value = 0; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - -/* - radio button style, arg is assigned as value -*/ -uint8_t mui_u8g2_u8_radio_wm_pi(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - u8g2_uint_t flags = 0; - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - switch(msg) - { - case MUIF_MSG_DRAW: - if ( mui_IsCursorFocus(ui) ) - { - flags |= U8G2_BTN_INV; - } - - { - u8g2_uint_t w = 0; - u8g2_uint_t a = u8g2_GetAscent(u8g2); - if ( *value == ui->arg ) - u8g2_DrawCheckbox(u8g2, mui_get_x(ui), mui_get_y(ui), a, 1); - else - u8g2_DrawCheckbox(u8g2, mui_get_x(ui), mui_get_y(ui), a, 0); - - if ( ui->text[0] != '\0' ) - { - w = u8g2_GetUTF8Width(u8g2, ui->text); - //u8g2_SetFontMode(u8g2, 1); - a += 2; /* add gap between the checkbox and the text area */ - u8g2_DrawUTF8(u8g2, mui_get_x(ui)+a, mui_get_y(ui), ui->text); - } - - u8g2_DrawButtonFrame(u8g2, mui_get_x(ui), mui_get_y(ui), flags, w+a, 1, MUI_U8G2_V_PADDING); - } - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - *value = ui->arg; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - - -uint8_t mui_u8g2_u8_opt_parent_wm_pi(mui_t *ui, uint8_t msg) -{ - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - switch(msg) - { - case MUIF_MSG_DRAW: - if ( mui_fds_get_nth_token(ui, *value) == 0 ) - { - *value = 0; - mui_fds_get_nth_token(ui, *value); - } - mui_u8g2_draw_button_pi(ui, 0, 1, ui->text); - //mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), 0, 1, MUI_U8G2_V_PADDING, ui->text); - - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - mui_SaveForm(ui); // store the current form and position so that the child can jump back - mui_GotoForm(ui, ui->arg, *value); // assumes that the selectable values are at the beginning of the form definition - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - - -static uint8_t mui_u8g2_u8_opt_child_mse_common(mui_t *ui, uint8_t msg) -{ - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - uint8_t arg = ui->arg; // remember the arg value, because it might be overwritten - - switch(msg) - { - case MUIF_MSG_DRAW: - /* done by the calling function */ - break; - case MUIF_MSG_FORM_START: - /* we can assume that the list starts at the top. It will be adjisted by cursor down events later */ - /* ui->form_scroll_top = 0 and all other form_scroll values are set to 0 if a new form is entered in mui_EnterForm() */ - if ( ui->form_scroll_visible <= arg ) - ui->form_scroll_visible = arg+1; - if ( ui->form_scroll_total == 0 ) - ui->form_scroll_total = mui_GetSelectableFieldOptionCnt(ui, ui->last_form_fds); - //printf("MUIF_MSG_FORM_START: arg=%d visible=%d top=%d total=%d\n", arg, ui->form_scroll_visible, ui->form_scroll_top, ui->form_scroll_total); - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - return mui_u8g2_handle_scroll_next_prev_events(ui, msg); - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - if ( value != NULL ) - *value = ui->form_scroll_top + arg; - mui_RestoreForm(ui); - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - case MUIF_MSG_EVENT_NEXT: - return mui_u8g2_handle_scroll_next_prev_events(ui, msg); - case MUIF_MSG_EVENT_PREV: - return mui_u8g2_handle_scroll_next_prev_events(ui, msg); - } - return 0; -} - - -uint8_t mui_u8g2_u8_opt_radio_child_wm_pi(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - uint8_t arg = ui->arg; // remember the arg value, because it might be overwritten - - switch(msg) - { - case MUIF_MSG_DRAW: - { - u8g2_uint_t w = 0; - u8g2_uint_t a = u8g2_GetAscent(u8g2) - 2; - u8g2_uint_t x = mui_get_x(ui); // if mui_GetSelectableFieldTextOption is called, then field vars are overwritten, so get the value - u8g2_uint_t y = mui_get_y(ui); // if mui_GetSelectableFieldTextOption is called, then field vars are overwritten, so get the value - uint8_t is_focus = mui_IsCursorFocus(ui); - if ( *value == arg + ui->form_scroll_top ) - u8g2_DrawValueMark(u8g2, x, y, a); - - if ( ui->text[0] == '\0' ) - { - /* if the text is not provided, then try to get the text from the previous (saved) element, assuming that this contains the selection */ - /* this will overwrite all ui member functions, so we must not access any ui members (except ui->text) any more */ - mui_GetSelectableFieldTextOption(ui, ui->last_form_fds, arg + ui->form_scroll_top); - } - - if ( ui->text[0] != '\0' ) - { - w = u8g2_GetUTF8Width(u8g2, ui->text); - //u8g2_SetFontMode(u8g2, 1); - a += 2; /* add gap between the checkbox and the text area */ - u8g2_DrawUTF8(u8g2, x+a, y, ui->text); - } - if ( is_focus ) - { - u8g2_DrawButtonFrame(u8g2, x, y, U8G2_BTN_INV, w+a, 1, MUI_U8G2_V_PADDING); - } - } - break; - default: - return mui_u8g2_u8_opt_child_mse_common(ui, msg); - } - return 0; -} - - -uint8_t mui_u8g2_u8_opt_radio_child_w1_pi(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - uint8_t arg = ui->arg; // remember the arg value, because it might be overwritten - - switch(msg) - { - case MUIF_MSG_DRAW: - { - //u8g2_uint_t w = 0; - u8g2_uint_t a = u8g2_GetAscent(u8g2) - 2; - u8g2_uint_t x = mui_get_x(ui); // if mui_GetSelectableFieldTextOption is called, then field vars are overwritten, so get the value - u8g2_uint_t y = mui_get_y(ui); // if mui_GetSelectableFieldTextOption is called, then field vars are overwritten, so get the value - uint8_t is_focus = mui_IsCursorFocus(ui); - - if ( *value == arg + ui->form_scroll_top ) - u8g2_DrawValueMark(u8g2, x, y, a); - - if ( ui->text[0] == '\0' ) - { - /* if the text is not provided, then try to get the text from the previous (saved) element, assuming that this contains the selection */ - /* this will overwrite all ui member functions, so we must not access any ui members (except ui->text) any more */ - mui_GetSelectableFieldTextOption(ui, ui->last_form_fds, arg + ui->form_scroll_top); - } - - if ( ui->text[0] != '\0' ) - { - //w = u8g2_GetUTF8Width(u8g2, ui->text); - //u8g2_SetFontMode(u8g2, 1); - a += 2; /* add gap between the checkbox and the text area */ - u8g2_DrawUTF8(u8g2, x+a, y, ui->text); - } - if ( is_focus ) - { - u8g2_DrawButtonFrame(u8g2, 0, y, U8G2_BTN_INV, u8g2_GetDisplayWidth(u8g2), 0, MUI_U8G2_V_PADDING); - } - } - break; - default: - return mui_u8g2_u8_opt_child_mse_common(ui, msg); - } - return 0; -} - - -uint8_t mui_u8g2_u8_opt_child_wm_pi(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - //uint8_t *value = (uint8_t *)muif_get_data(ui->uif); - uint8_t arg = ui->arg; // remember the arg value, because it might be overwritten - - switch(msg) - { - case MUIF_MSG_DRAW: - { - //u8g2_uint_t w = 0; - u8g2_uint_t x = mui_get_x(ui); // if mui_GetSelectableFieldTextOption is called, then field vars are overwritten, so get the value - u8g2_uint_t y = mui_get_y(ui); // if mui_GetSelectableFieldTextOption is called, then field vars are overwritten, so get the value - uint8_t flags = mui_u8g2_get_pi_flags(ui); - //if ( mui_IsCursorFocus(ui) ) - //{ - // flags = U8G2_BTN_INV; - //} - - if ( ui->text[0] == '\0' ) - { - /* if the text is not provided, then try to get the text from the previous (saved) element, assuming that this contains the selection */ - /* this will overwrite all ui member functions, so we must not access any ui members (except ui->text) any more */ - mui_GetSelectableFieldTextOption(ui, ui->last_form_fds, arg + ui->form_scroll_top); - } - if ( ui->text[0] != '\0' ) - { - u8g2_DrawButtonUTF8(u8g2, x, y, flags, 0, 1, MUI_U8G2_V_PADDING, ui->text); - } - } - break; - default: - return mui_u8g2_u8_opt_child_mse_common(ui, msg); - } - return 0; -} - -/* - an invisible field (which will not show anything). It should also not be selectable - it just provides the menu entries, see "mui_u8g2_u8_opt_child_mse_common" and friends - as a consequence it does not have width, input mode and style - - MUIF: MUIF_RO() - FDS: MUI_DATA() - - mui_u8g2_goto_parent --> mui_u8g2_goto_data - - Used together with mui_u8g2_goto_form_w1_pi - -*/ -uint8_t mui_u8g2_goto_data(mui_t *ui, uint8_t msg) -{ - switch(msg) - { - case MUIF_MSG_DRAW: - break; - case MUIF_MSG_FORM_START: - // store the field (and the corresponding elements) in the last_form_fds variable. - // last_form_fds is later used to access the elements (see mui_u8g2_u8_opt_child_mse_common and friends) - ui->last_form_fds = ui->fds; - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - - -/* -mui_u8g2_goto_child_w1_mse_pi --> mui_u8g2_goto_form_w1_pi -*/ -uint8_t mui_u8g2_goto_form_w1_pi(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - uint8_t arg = ui->arg; // remember the arg value, because it might be overwritten - switch(msg) - { - case MUIF_MSG_DRAW: - if ( mui_GetSelectableFieldTextOption(ui, ui->last_form_fds, arg + ui->form_scroll_top) ) - mui_u8g2_draw_button_pi(ui, u8g2_GetDisplayWidth(u8g2)-mui_get_x(ui)*2, mui_get_x(ui), ui->text+1); - break; - case MUIF_MSG_CURSOR_SELECT: - if ( mui_GetSelectableFieldTextOption(ui, ui->last_form_fds, ui->arg + ui->form_scroll_top) ) - { - mui_SaveCursorPosition(ui, ui->arg + ui->form_scroll_top); // store the current cursor position, so that the user can jump back to the corresponding cursor position - return mui_GotoFormAutoCursorPosition(ui, (uint8_t)ui->text[0]); - } - break; - default: - return mui_u8g2_u8_opt_child_mse_common(ui, msg); - } - return 0; -} - -uint8_t mui_u8g2_goto_form_w1_pf(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - uint8_t arg = ui->arg; // remember the arg value, because it might be overwritten - switch(msg) - { - case MUIF_MSG_DRAW: - if ( mui_GetSelectableFieldTextOption(ui, ui->last_form_fds, arg + ui->form_scroll_top) ) - mui_u8g2_draw_button_pf(ui, u8g2_GetDisplayWidth(u8g2)-mui_get_x(ui)*2, mui_get_x(ui)-1, ui->text+1); - break; - case MUIF_MSG_CURSOR_SELECT: - if ( mui_GetSelectableFieldTextOption(ui, ui->last_form_fds, ui->arg + ui->form_scroll_top) ) - { - mui_SaveCursorPosition(ui, ui->arg + ui->form_scroll_top); // store the current cursor position, so that the user can jump back to the corresponding cursor position - return mui_GotoFormAutoCursorPosition(ui, (uint8_t)ui->text[0]); - } - break; - default: - return mui_u8g2_u8_opt_child_mse_common(ui, msg); - } - return 0; -} - - -/* - data: mui_u8g2_list_t * -*/ -uint8_t mui_u8g2_u16_list_line_wa_mse_pi(mui_t *ui, uint8_t msg) -{ - //u8g2_t *u8g2 = mui_get_U8g2(ui); - mui_u8g2_list_t *list = (mui_u8g2_list_t *)muif_get_data(ui->uif); - uint16_t *selection = mui_u8g2_list_get_selection_ptr(list); - void *data = mui_u8g2_list_get_data_ptr(list); - mui_u8g2_get_list_element_cb element_cb = mui_u8g2_list_get_element_cb(list); - mui_u8g2_get_list_count_cb count_cb = mui_u8g2_list_get_count_cb(list); - - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_draw_button_pi(ui, ui->arg, 1, element_cb(data, *selection)); - //mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), ui->arg, 1, MUI_U8G2_V_PADDING, element_cb(data, *selection)); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - (*selection)++; - if ( *selection >= count_cb(data) ) - *selection = 0; - break; - case MUIF_MSG_VALUE_DECREMENT: - if ( *selection > 0 ) - (*selection)--; - else - (*selection) = count_cb(data)-1; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - -uint8_t mui_u8g2_u16_list_line_wa_mud_pi(mui_t *ui, uint8_t msg) -{ - //u8g2_t *u8g2 = mui_get_U8g2(ui); - mui_u8g2_list_t *list = (mui_u8g2_list_t *)muif_get_data(ui->uif); - uint16_t *selection = mui_u8g2_list_get_selection_ptr(list); - void *data = mui_u8g2_list_get_data_ptr(list); - mui_u8g2_get_list_element_cb element_cb = mui_u8g2_list_get_element_cb(list); - mui_u8g2_get_list_count_cb count_cb = mui_u8g2_list_get_count_cb(list); - - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_draw_button_pi(ui, ui->arg, 1, element_cb(data, *selection)); - //mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), ui->arg, 1, MUI_U8G2_V_PADDING, element_cb(data, *selection)); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - /* toggle between normal mode and capture next/prev mode */ - ui->is_mud = !ui->is_mud; - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - case MUIF_MSG_EVENT_NEXT: - if ( ui->is_mud ) - { - (*selection)++; - if ( *selection >= count_cb(data) ) - *selection = 0; - return 1; - } - break; - case MUIF_MSG_EVENT_PREV: - if ( ui->is_mud ) - { - if ( *selection == 0 ) - *selection = count_cb(data); - (*selection)--; - return 1; - } - break; - } - return 0; -} - -/* - MUIF: MUIF_U8G2_U16_LIST - FDS: MUI_XYA, arg=form id - data: mui_u8g2_list_t * -*/ -uint8_t mui_u8g2_u16_list_parent_wm_pi(mui_t *ui, uint8_t msg) -{ - //u8g2_t *u8g2 = mui_get_U8g2(ui); - mui_u8g2_list_t *list = (mui_u8g2_list_t *)muif_get_data(ui->uif); - uint16_t *selection = mui_u8g2_list_get_selection_ptr(list); - void *data = mui_u8g2_list_get_data_ptr(list); - mui_u8g2_get_list_element_cb element_cb = mui_u8g2_list_get_element_cb(list); - //mui_u8g2_get_list_count_cb count_cb = mui_u8g2_list_get_count_cb(list); - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_draw_button_pi(ui, 0, 1, element_cb(data, *selection)); - //mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), ui->arg, 1, MUI_U8G2_V_PADDING, element_cb(data, *selection)); - break; - case MUIF_MSG_FORM_START: - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - mui_SaveForm(ui); // store the current form and position so that the child can jump back - mui_GotoForm(ui, ui->arg, *selection); // assumes that the selectable values are at the beginning of the form definition - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - } - return 0; -} - -static uint8_t mui_u8g2_u16_list_child_mse_common(mui_t *ui, uint8_t msg) -{ - mui_u8g2_list_t *list = (mui_u8g2_list_t *)muif_get_data(ui->uif); - uint16_t *selection = mui_u8g2_list_get_selection_ptr(list); - void *data = mui_u8g2_list_get_data_ptr(list); - //mui_u8g2_get_list_element_cb element_cb = mui_u8g2_list_get_element_cb(list); - mui_u8g2_get_list_count_cb count_cb = mui_u8g2_list_get_count_cb(list); - - uint8_t arg = ui->arg; // remember the arg value, because it might be overwritten - - switch(msg) - { - case MUIF_MSG_DRAW: - /* done by the calling function */ - break; - case MUIF_MSG_FORM_START: - /* we can assume that the list starts at the top. It will be adjisted by cursor down events later */ - ui->form_scroll_top = 0; - if ( ui->form_scroll_visible <= arg ) - ui->form_scroll_visible = arg+1; - if ( ui->form_scroll_total == 0 ) - ui->form_scroll_total = count_cb(data); - break; - case MUIF_MSG_FORM_END: - break; - case MUIF_MSG_CURSOR_ENTER: - return mui_u8g2_handle_scroll_next_prev_events(ui, msg); - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - if ( selection != NULL ) - *selection = ui->form_scroll_top + arg; - mui_RestoreForm(ui); - break; - case MUIF_MSG_CURSOR_LEAVE: - break; - case MUIF_MSG_TOUCH_DOWN: - break; - case MUIF_MSG_TOUCH_UP: - break; - case MUIF_MSG_EVENT_NEXT: - return mui_u8g2_handle_scroll_next_prev_events(ui, msg); - case MUIF_MSG_EVENT_PREV: - return mui_u8g2_handle_scroll_next_prev_events(ui, msg); - } - return 0; -} - -uint8_t mui_u8g2_u16_list_child_w1_pi(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - mui_u8g2_list_t *list = (mui_u8g2_list_t *)muif_get_data(ui->uif); - uint16_t *selection = mui_u8g2_list_get_selection_ptr(list); - void *data = mui_u8g2_list_get_data_ptr(list); - mui_u8g2_get_list_element_cb element_cb = mui_u8g2_list_get_element_cb(list); - mui_u8g2_get_list_count_cb count_cb = mui_u8g2_list_get_count_cb(list); - uint16_t pos = ui->arg; // remember the arg value, because it might be overwritten - switch(msg) - { - case MUIF_MSG_DRAW: - { - //u8g2_uint_t w = 0; - u8g2_uint_t a = u8g2_GetAscent(u8g2) - 2; - u8g2_uint_t x = mui_get_x(ui); // if mui_GetSelectableFieldTextOption is called, then field vars are overwritten, so get the value - u8g2_uint_t y = mui_get_y(ui); // if mui_GetSelectableFieldTextOption is called, then field vars are overwritten, so get the value - uint8_t is_focus = mui_IsCursorFocus(ui); - - pos += ui->form_scroll_top; - - if ( *selection == pos ) - u8g2_DrawValueMark(u8g2, x, y, a); - - //u8g2_SetFontMode(u8g2, 1); - a += 2; /* add gap between the checkbox and the text area */ - if ( pos < count_cb(data) ) - u8g2_DrawUTF8(u8g2, x+a, y, element_cb(data, pos)); - if ( is_focus ) - { - u8g2_DrawButtonFrame(u8g2, 0, y, U8G2_BTN_INV, u8g2_GetDisplayWidth(u8g2), 0, MUI_U8G2_V_PADDING); - } - } - break; - default: - return mui_u8g2_u16_list_child_mse_common(ui, msg); - } - return 0; -} - -uint8_t mui_u8g2_u16_list_goto_w1_pi(mui_t *ui, uint8_t msg) -{ - u8g2_t *u8g2 = mui_get_U8g2(ui); - mui_u8g2_list_t *list = (mui_u8g2_list_t *)muif_get_data(ui->uif); - uint16_t *selection = mui_u8g2_list_get_selection_ptr(list); - void *data = mui_u8g2_list_get_data_ptr(list); - mui_u8g2_get_list_element_cb element_cb = mui_u8g2_list_get_element_cb(list); - //mui_u8g2_get_list_count_cb count_cb = mui_u8g2_list_get_count_cb(list); - - uint16_t pos = ui->arg; // remember the arg value, because it might be overwritten - pos += ui->form_scroll_top; - - switch(msg) - { - case MUIF_MSG_DRAW: - mui_u8g2_draw_button_pi(ui, u8g2_GetDisplayWidth(u8g2)-mui_get_x(ui)*2, mui_get_x(ui), element_cb(data, pos)+1); - //mui_u8g2_draw_button_utf(ui, mui_u8g2_get_pi_flags(ui), u8g2_GetDisplayWidth(u8g2)-mui_get_x(ui)*2, mui_get_x(ui), MUI_U8G2_V_PADDING, element_cb(data, pos)+1); - break; - case MUIF_MSG_CURSOR_SELECT: - case MUIF_MSG_VALUE_INCREMENT: - case MUIF_MSG_VALUE_DECREMENT: - if ( selection != NULL ) - *selection = pos; - mui_SaveCursorPosition(ui, pos >= 255 ? 0 : pos); // store the current cursor position, so that the user can jump back to the corresponding cursor position - mui_GotoFormAutoCursorPosition(ui, (uint8_t)element_cb(data, pos)[0]); - break; - default: - return mui_u8g2_u16_list_child_mse_common(ui, msg); - } - return 0; -} diff --git a/U8g2/mui_u8g2.h b/U8g2/mui_u8g2.h deleted file mode 100644 index e4a17e3..0000000 --- a/U8g2/mui_u8g2.h +++ /dev/null @@ -1,308 +0,0 @@ -/* - - mui_u8g2.h - - Monochrome minimal user interface: Glue code between mui and u8g2. - - Universal 8bit Graphics Library (https://github.com/olikraus/u8g2/) - - Copyright (c) 2021, olikraus@gmail.com - All rights reserved. - - Redistribution and use in source and binary forms, with or without modification, - are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright notice, this list - of conditions and the following disclaimer. - - * Redistributions in binary form must reproduce the above copyright notice, this - list of conditions and the following disclaimer in the documentation and/or other - materials provided with the distribution. - - THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND - CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE - DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR - CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT - NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; - LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER - CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, - STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - - Reference Manual: - https://github.com/olikraus/u8g2/wiki/muiref - - MUIF_U8G2_LABEL() - replacement for MUIF_LABEL(mui_u8g2_draw_text), - used by MUI_LABEL(x,y,"text") - Supports UTF8 - - MUIF_U8G2_FONT_STYLE(n, font) - A special u8g2 style function, which replaces MUIF_STYLE, but restricts the style change to the - specific font argument (however, this should be good enough in most cases). - As usual, the style "n" can be activated with MUI_STYLE(n) in FDS. - Example: - muif_t muif_list[] MUI_PROGMEM = { - MUIF_U8G2_LABEL(), - MUIF_U8G2_FONT_STYLE(0, u8g2_font_5x8_tr) - }; - fds_t fds[] MUI_PROGMEM = - MUI_FORM(1) - MUI_STYLE(0) - MUI_LABEL(5,12, "5x8 Font") - ; - - - - - -*/ - -#ifndef MUI_U8G2_H -#define MUI_U8G2_H - -#include "u8g2.h" -#include "mui.h" - -/*==========================================*/ -/* C++ compatible */ - -#ifdef __cplusplus -extern "C" { -#endif - - -#define MUI_U8G2_COMMA , - -typedef const char * (*mui_u8g2_get_list_element_cb)(void *data, uint16_t index); -typedef uint16_t (*mui_u8g2_get_list_count_cb)(void *data); - -struct mui_u8g2_list_struct -{ - uint16_t *selection; - void *data; - mui_u8g2_get_list_element_cb get_list_element; - mui_u8g2_get_list_count_cb get_list_count; -} MUI_PROGMEM; - -typedef const struct mui_u8g2_list_struct mui_u8g2_list_t; - -#if defined(__GNUC__) && defined(__AVR__) -# define mui_u8g2_list_get_selection_ptr(list) ((uint16_t *)mui_pgm_wread(&((list)->selection))) -# define mui_u8g2_list_get_data_ptr(list) ((void *)mui_pgm_wread(&((list)->data))) -# define mui_u8g2_list_get_element_cb(list) ((mui_u8g2_get_list_element_cb)mui_pgm_wread(&((list)->get_list_element))) -# define mui_u8g2_list_get_count_cb(list) ((mui_u8g2_get_list_count_cb)mui_pgm_wread(&((list)->get_list_count))) -#else -# define mui_u8g2_list_get_selection_ptr(list) ((list)->selection) -# define mui_u8g2_list_get_data_ptr(list) ((list)->data) -# define mui_u8g2_list_get_element_cb(list) ((list)->get_list_element) -# define mui_u8g2_list_get_count_cb(list) ((list)->get_list_count) -#endif - - -struct mui_u8g2_u8_min_max_struct -{ - uint8_t *value; - uint8_t min; - uint8_t max; -} MUI_PROGMEM; - -typedef const struct mui_u8g2_u8_min_max_struct mui_u8g2_u8_min_max_t; - -#if defined(__GNUC__) && defined(__AVR__) -# define mui_u8g2_u8mm_get_min(u8mm) mui_pgm_read(&((u8mm)->min)) -# define mui_u8g2_u8mm_get_max(u8mm) mui_pgm_read(&((u8mm)->max)) -# define mui_u8g2_u8mm_get_valptr(u8mm) ((uint8_t *)mui_pgm_wread(&((u8mm)->value))) -#else -# define mui_u8g2_u8mm_get_min(u8mm) ((u8mm)->min) -# define mui_u8g2_u8mm_get_max(u8mm) ((u8mm)->max) -# define mui_u8g2_u8mm_get_valptr(u8mm) ((u8mm)->value) -#endif - - -struct mui_u8g2_u8_min_max_step_struct -{ - uint8_t *value; - uint8_t min; - uint8_t max; - uint8_t step; - uint8_t flags; - uint8_t width; // added with issue 2200, might not be used by all bar graph functions -} MUI_PROGMEM; - -typedef const struct mui_u8g2_u8_min_max_step_struct mui_u8g2_u8_min_max_step_t; - -/* list of bit values for the "flags" variable */ -#define MUI_MMS_2X_BAR 0x01 -#define MUI_MMS_4X_BAR 0x02 -#define MUI_MMS_SHOW_VALUE 0x04 -#define MUI_MMS_NO_WRAP 0x08 - -#if defined(__GNUC__) && defined(__AVR__) -# define mui_u8g2_u8mms_get_width(u8mm) mui_pgm_read(&((u8mm)->width)) -# define mui_u8g2_u8mms_get_step(u8mm) mui_pgm_read(&((u8mm)->step)) -# define mui_u8g2_u8mms_get_flags(u8mm) mui_pgm_read(&((u8mm)->flags)) -# define mui_u8g2_u8mms_get_min(u8mm) mui_pgm_read(&((u8mm)->min)) -# define mui_u8g2_u8mms_get_max(u8mm) mui_pgm_read(&((u8mm)->max)) -# define mui_u8g2_u8mms_get_valptr(u8mm) ((uint8_t *)mui_pgm_wread(&((u8mm)->value))) -#else -# define mui_u8g2_u8mms_get_width(u8mm) ((u8mm)->width) -# define mui_u8g2_u8mms_get_step(u8mm) ((u8mm)->step) -# define mui_u8g2_u8mms_get_flags(u8mm) ((u8mm)->flags) -# define mui_u8g2_u8mms_get_min(u8mm) ((u8mm)->min) -# define mui_u8g2_u8mms_get_max(u8mm) ((u8mm)->max) -# define mui_u8g2_u8mms_get_valptr(u8mm) ((u8mm)->value) -#endif - - - - -/* helper functions */ - -u8g2_uint_t mui_get_x(mui_t *ui); -u8g2_uint_t mui_get_y(mui_t *ui); -u8g2_t *mui_get_U8g2(mui_t *ui); - -void mui_u8g2_draw_button_utf(mui_t *ui, u8g2_uint_t flags, u8g2_uint_t width, u8g2_uint_t padding_h, u8g2_uint_t padding_v, const char *text); -u8g2_uint_t mui_u8g2_get_pi_flags(mui_t *ui); -void mui_u8g2_draw_button_pi(mui_t *ui, u8g2_uint_t width, u8g2_uint_t padding_h, const char *text); -u8g2_uint_t mui_u8g2_get_fi_flags(mui_t *ui); -void mui_u8g2_draw_button_fi(mui_t *ui, u8g2_uint_t width, u8g2_uint_t padding_h, const char *text); -u8g2_uint_t mui_u8g2_get_pf_flags(mui_t *ui); -void mui_u8g2_draw_button_pf(mui_t *ui, u8g2_uint_t width, u8g2_uint_t padding_h, const char *text); -u8g2_uint_t mui_u8g2_get_if_flags(mui_t *ui); -void mui_u8g2_draw_button_if(mui_t *ui, u8g2_uint_t width, u8g2_uint_t padding_h, const char *text); - - - -/* ready to use field functions */ - -uint8_t mui_u8g2_draw_text(mui_t *ui, uint8_t msg); -uint8_t mui_u8g2_btn_goto_wm_fi(mui_t *ui, uint8_t msg); /* GIF */ -uint8_t mui_u8g2_btn_goto_wm_if(mui_t *ui, uint8_t msg); -uint8_t mui_u8g2_btn_goto_w2_fi(mui_t *ui, uint8_t msg); /* GIF */ -uint8_t mui_u8g2_btn_goto_w2_if(mui_t *ui, uint8_t msg); - -uint8_t mui_u8g2_btn_goto_w1_pi(mui_t *ui, uint8_t msg); /* GIF */ -uint8_t mui_u8g2_btn_goto_w1_fi(mui_t *ui, uint8_t msg); /* GIF */ - -uint8_t mui_u8g2_btn_exit_wm_fi(mui_t *ui, uint8_t msg); /* similar to 'mui_u8g2_btn_goto_wm_fi' but will exit the menu system */ - -uint8_t mui_u8g2_u8_chkbox_wm_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_VARIABLE, MUI_XY */ -uint8_t mui_u8g2_u8_radio_wm_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_VARIABLE,MUI_XYAT */ - - - -uint8_t mui_u8g2_u8_opt_line_wa_mse_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_VARIABLE,MUI_XYAT */ -uint8_t mui_u8g2_u8_opt_line_wa_mse_pf(mui_t *ui, uint8_t msg); /* GIF, MUIF_VARIABLE,MUI_XYAT */ -uint8_t mui_u8g2_u8_opt_line_wa_mud_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_VARIABLE,MUI_XYAT */ -uint8_t mui_u8g2_u8_opt_line_wa_mud_pf(mui_t *ui, uint8_t msg); /* GIF, MUIF_VARIABLE,MUI_XYAT */ - -/* dropdown list / combo box */ -/* The text part of the parent defines a '|' separated list of elements, which can be selected by the child. */ -/* Argument is a form number where the child element is placed multiple times */ -/* The child form does not require the ok button, because the child function will return to the parent with the select element */ -uint8_t mui_u8g2_u8_opt_parent_wm_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_VARIABLE, MUI_XYAT */ -uint8_t mui_u8g2_u8_opt_radio_child_wm_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_VARIABLE, MUI_XYA */ -uint8_t mui_u8g2_u8_opt_radio_child_w1_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_VARIABLE, MUI_XYA */ -uint8_t mui_u8g2_u8_opt_child_wm_pi(mui_t *ui, uint8_t msg); /* MUIF_VARIABLE, MUI_XYA */ -/* Note: there is no opt_child_goto muif, because this can be done with mui_u8g2_goto_form_w1_pi */ - -/* (scrollable) jump menu */ -/* The text part of the parent defines a '|' separated list of elements, which can be selected goto_form functions. */ -/* Each '|' separated element must be prefixed with the form number (MUI_x) */ -uint8_t mui_u8g2_goto_data(mui_t *ui, uint8_t msg); /* REF, MUIF_RO, MUI_DATA (WARNING: Must appear only once per form!!! */ -uint8_t mui_u8g2_goto_form_w1_pi(mui_t *ui, uint8_t msg); /* REF, MUIF_BUTTON, MUI_XYA */ -uint8_t mui_u8g2_goto_form_w1_pf(mui_t *ui, uint8_t msg); /* REF, MUIF_BUTTON, MUI_XYA */ - - -/* character input */ -uint8_t mui_u8g2_u8_char_wm_mud_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_VARIABLE,MUI_XY, usually requires a monospaced font line profont12 */ - - -/*===== MUIF U8g2 Label =====*/ - -#define MUIF_U8G2_LABEL() MUIF_LABEL(mui_u8g2_draw_text) - - -/*===== data = u8g2 font data =====*/ - -//#define MUIF_U8G2_FONT_STYLE(n,font) MUIF("S" #n, 0, (void *)(font), mui_u8g2_set_font_style_function) -#define MUIF_U8G2_FONT_STYLE(n, font) { 'S', #n[0], 0, 0, (void *)(font), mui_u8g2_set_font_style_function} - - -uint8_t mui_u8g2_set_font_style_function(mui_t *ui, uint8_t msg); - - -/*===== data = mui_u8g2_u8_min_max_t* =====*/ - -/* gcc note: the macro uses array compound literals to extend the lifetime in C++, see last section in https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html */ -#define MUIF_U8G2_U8_MIN_MAX(id, valptr, min, max, muif) \ - MUIF(id, MUIF_CFLAG_IS_CURSOR_SELECTABLE, \ - (void *)((mui_u8g2_u8_min_max_t [] ) {{ (valptr) MUI_U8G2_COMMA (min) MUI_U8G2_COMMA (max)}}), \ - (muif)) - -uint8_t mui_u8g2_u8_min_max_wm_mse_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_U8G2_U8_MIN_MAX, MUI_XY */ -uint8_t mui_u8g2_u8_min_max_wm_mud_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_U8G2_U8_MIN_MAX, MUI_XY */ - -uint8_t mui_u8g2_u8_min_max_wm_mse_pf(mui_t *ui, uint8_t msg); /* GIF, MUIF_U8G2_U8_MIN_MAX, MUI_XY */ -uint8_t mui_u8g2_u8_min_max_wm_mud_pf(mui_t *ui, uint8_t msg); /* GIF, MUIF_U8G2_U8_MIN_MAX, MUI_XY */ - -/*===== data = mui_u8g2_u8_min_max_step_t* =====*/ - -/* gcc note: the macro uses array compound literals to extend the lifetime in C++, see last section in https://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html */ -#define MUIF_U8G2_U8_MIN_MAX_STEP(id, valptr, min, max, step, flags, muif) \ - MUIF(id, MUIF_CFLAG_IS_CURSOR_SELECTABLE, \ - (void *)((mui_u8g2_u8_min_max_step_t [] ) {{ (valptr) MUI_U8G2_COMMA (min) MUI_U8G2_COMMA (max) MUI_U8G2_COMMA (step) MUI_U8G2_COMMA (flags) MUI_U8G2_COMMA (0) }}), \ - (muif)) - - -uint8_t mui_u8g2_u8_bar_wm_mse_pi(mui_t *ui, uint8_t msg); -uint8_t mui_u8g2_u8_bar_wm_mud_pi(mui_t *ui, uint8_t msg); -uint8_t mui_u8g2_u8_bar_wm_mse_pf(mui_t *ui, uint8_t msg); -uint8_t mui_u8g2_u8_bar_wm_mud_pf(mui_t *ui, uint8_t msg); - - -#define MUIF_U8G2_U8_MIN_MAX_STEP_WIDTH(id, valptr, min, max, step, width, flags, muif) \ - MUIF(id, MUIF_CFLAG_IS_CURSOR_SELECTABLE, \ - (void *)((mui_u8g2_u8_min_max_step_t [] ) {{ (valptr) MUI_U8G2_COMMA (min) MUI_U8G2_COMMA (max) MUI_U8G2_COMMA (step) MUI_U8G2_COMMA (flags) MUI_U8G2_COMMA (width) }}), \ - (muif)) - - -uint8_t mui_u8g2_u8_fixed_width_bar_wm_mse_pi(mui_t *ui, uint8_t msg); -uint8_t mui_u8g2_u8_fixed_width_bar_wm_mud_pi(mui_t *ui, uint8_t msg); -uint8_t mui_u8g2_u8_fixed_width_bar_wm_mse_pf(mui_t *ui, uint8_t msg); -uint8_t mui_u8g2_u8_fixed_width_bar_wm_mud_pf(mui_t *ui, uint8_t msg); - - - -/*===== data = mui_u8g2_list_t* =====*/ -/* similar to mui_u8g2_u8_opt_line, but u16 and dynamic list */ - - -#define MUIF_U8G2_U16_LIST(id, valptr, dataptr, getcb, cntcb, muif) \ - MUIF(id, MUIF_CFLAG_IS_CURSOR_SELECTABLE, \ - (void *)((mui_u8g2_list_t [] ) {{ (valptr) MUI_U8G2_COMMA (dataptr) MUI_U8G2_COMMA (getcb) MUI_U8G2_COMMA (cntcb)}}), \ - (muif)) - -uint8_t mui_u8g2_u16_list_line_wa_mse_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_U8G2_U16_LIST, MUI_XYA, arg=pixel fieldsize */ -uint8_t mui_u8g2_u16_list_line_wa_mud_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_U8G2_U16_LIST, MUI_XYA, arg=pixel fieldsize */ - - -/* dropdown list / combo box with 16 size and callback functions for MUIF_U8G2_U16_LIST */ -uint8_t mui_u8g2_u16_list_parent_wm_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_U8G2_U16_LIST, MUI_XYA, arg=subform */ -uint8_t mui_u8g2_u16_list_child_w1_pi(mui_t *ui, uint8_t msg); /* GIF, MUIF_U8G2_U16_LIST, MUI_XYA, arg=sub element number */ -uint8_t mui_u8g2_u16_list_goto_w1_pi(mui_t *ui, uint8_t msg); /* REF, MUIF_U8G2_U16_LIST first char of the string denotes the target form */ - - -#ifdef __cplusplus -} -#endif - - -#endif /* MUI_U8G2_H */ - diff --git a/U8g2/u8g2_stm32_spi.c b/U8g2/u8g2_stm32_spi.c new file mode 100644 index 0000000..bd64afc --- /dev/null +++ b/U8g2/u8g2_stm32_spi.c @@ -0,0 +1,83 @@ +// +// Created by wuqiyang on 24-8-18. +// + +#include "u8g2_stm32_spi.h" + +u8g2_t u8g2; + +#include "u8g2.h" + +uint8_t u8g2_byte_sw_spi_stm32(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr) { + switch (msg) { + case U8X8_MSG_BYTE_SEND: /*通过SPI发送arg_int个字节数据*/ +// HAL_SPI_Transmit_DMA(&hspi1, (uint8_t *)arg_ptr, arg_int);while(hspi1.TxXferCount); + /*配置了DMA取消上一行注释即可*/ + HAL_SPI_Transmit(&hspi2, (uint8_t *) arg_ptr, arg_int, 200); + /*这是CubeMX生成的初始化*/ + break; + case U8X8_MSG_BYTE_INIT: /*初始化函数*/ + break; + case U8X8_MSG_BYTE_SET_DC: /*设AS引脚,表明发送的是数据还是命令*/ + HAL_GPIO_WritePin(SPI2_RS_GPIO_Port, SPI2_RS_Pin, (GPIO_PinState) arg_int); + break; + case U8X8_MSG_BYTE_START_TRANSFER: + u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_enable_level); + u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->post_chip_enable_wait_ns, NULL); + break; + case U8X8_MSG_BYTE_END_TRANSFER: + u8x8->gpio_and_delay_cb(u8x8, U8X8_MSG_DELAY_NANO, u8x8->display_info->pre_chip_disable_wait_ns, NULL); + u8x8_gpio_SetCS(u8x8, u8x8->display_info->chip_disable_level); + break; + default: + return 0; + } + return 1; +} + +uint8_t u8x8_gpio_and_delay_stm32(U8X8_UNUSED u8x8_t *u8x8, + U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, + U8X8_UNUSED void *arg_ptr) { + switch (msg) { + case U8X8_MSG_GPIO_AND_DELAY_INIT: /*delay和GPIO的初始化,在main中已经初始化完成了*/ + break; + case U8X8_MSG_DELAY_MILLI: /*延时函数*/ + HAL_Delay(arg_int); //调用谁stm32系统延时函数 + break; + case U8X8_MSG_GPIO_CS: /*片选信号*/ //由于只有一个SPI设备,所以片选信号在初始化时已经设置为常有效 + HAL_GPIO_WritePin(SPI2_CS_GPIO_Port, SPI2_CS_Pin, (GPIO_PinState) arg_int); + break; + case U8X8_MSG_GPIO_DC: /*设置RS引脚,表明发送的是数据还是命令*/ + HAL_GPIO_WritePin(SPI2_RS_GPIO_Port, SPI2_RS_Pin, (GPIO_PinState) arg_int); + break; + case U8X8_MSG_GPIO_RESET: + HAL_GPIO_WritePin(SPI2_RST_GPIO_Port, SPI2_RST_Pin, (GPIO_PinState) arg_int); + break; + } + return 1; +} + +/*官方logo的Demo*/ +void drawDemo() { + u8g2_SetFontMode(&u8g2, 1); /*字体模式选择*/ + u8g2_SetFontDirection(&u8g2, 0); /*字体方向选择*/ + u8g2_SetFont(&u8g2, u8g2_font_inb24_mf); /*字库选择*/ + u8g2_DrawStr(&u8g2, 0, 20, "U"); + + u8g2_SetFontDirection(&u8g2, 1); + u8g2_SetFont(&u8g2, u8g2_font_inb30_mn); + u8g2_DrawStr(&u8g2, 21, 8, "8"); + + u8g2_SetFontDirection(&u8g2, 0); + u8g2_SetFont(&u8g2, u8g2_font_inb24_mf); + u8g2_DrawStr(&u8g2, 51, 30, "g"); + u8g2_DrawStr(&u8g2, 67, 30, "\xb2"); + + u8g2_DrawHLine(&u8g2, 2, 35, 47); + u8g2_DrawHLine(&u8g2, 3, 36, 47); + u8g2_DrawVLine(&u8g2, 45, 32, 12); + u8g2_DrawVLine(&u8g2, 46, 33, 12); + + u8g2_SetFont(&u8g2, u8g2_font_4x6_tr); + u8g2_DrawStr(&u8g2, 1, 54, "github.com/olikraus/u8g2"); +} \ No newline at end of file diff --git a/U8g2/u8g2_stm32_spi.h b/U8g2/u8g2_stm32_spi.h new file mode 100644 index 0000000..9a72940 --- /dev/null +++ b/U8g2/u8g2_stm32_spi.h @@ -0,0 +1,23 @@ +// +// Created by wuqiyang on 24-8-18. +// + +#ifndef STM32UI_U8G2_STM32_SPI_H +#define STM32UI_U8G2_STM32_SPI_H + +#include "main.h" +#include "u8g2.h" +#include "spi.h" + +extern u8g2_t u8g2; + + +uint8_t u8g2_byte_sw_spi_stm32(u8x8_t *u8x8, uint8_t msg, uint8_t arg_int, void *arg_ptr); + +uint8_t u8x8_gpio_and_delay_stm32(U8X8_UNUSED u8x8_t *u8x8, + U8X8_UNUSED uint8_t msg, U8X8_UNUSED uint8_t arg_int, + U8X8_UNUSED void *arg_ptr); + +void drawDemo(); + +#endif //STM32UI_U8G2_STM32_SPI_H diff --git a/stm32ui.ioc b/stm32ui.ioc index f78714d..02016fe 100644 --- a/stm32ui.ioc +++ b/stm32ui.ioc @@ -7,7 +7,7 @@ FREERTOS.IPParameters=Tasks01,configUSE_NEWLIB_REENTRANT,FootprintOK FREERTOS.Tasks01=defaultTask,24,128,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;u8g2Task,24,128,U8g2Task,Default,NULL,Dynamic,NULL,NULL FREERTOS.configUSE_NEWLIB_REENTRANT=1 File.Version=6 -GPIO.groupedBy= +GPIO.groupedBy=Group By Peripherals KeepUserPlacement=false Mcu.CPN=STM32F407VGT6 Mcu.Family=STM32F4 @@ -16,27 +16,29 @@ Mcu.IP1=FREERTOS Mcu.IP2=NVIC Mcu.IP3=RCC Mcu.IP4=SDIO -Mcu.IP5=SPI1 +Mcu.IP5=SPI2 Mcu.IP6=SYS Mcu.IPNb=7 Mcu.Name=STM32F407V(E-G)Tx Mcu.Package=LQFP100 Mcu.Pin0=PH0-OSC_IN Mcu.Pin1=PH1-OSC_OUT -Mcu.Pin10=PC12 -Mcu.Pin11=PD2 -Mcu.Pin12=VP_FATFS_VS_SDIO -Mcu.Pin13=VP_FREERTOS_VS_CMSIS_V2 -Mcu.Pin14=VP_SYS_VS_tim1 -Mcu.Pin2=PA5 -Mcu.Pin3=PA6 -Mcu.Pin4=PA7 -Mcu.Pin5=PB2 -Mcu.Pin6=PC8 -Mcu.Pin7=PC9 -Mcu.Pin8=PC10 -Mcu.Pin9=PC11 -Mcu.PinsNb=15 +Mcu.Pin10=PC10 +Mcu.Pin11=PC11 +Mcu.Pin12=PC12 +Mcu.Pin13=PD2 +Mcu.Pin14=VP_FATFS_VS_SDIO +Mcu.Pin15=VP_FREERTOS_VS_CMSIS_V2 +Mcu.Pin16=VP_SYS_VS_tim1 +Mcu.Pin2=PC3 +Mcu.Pin3=PB2 +Mcu.Pin4=PE7 +Mcu.Pin5=PE8 +Mcu.Pin6=PE9 +Mcu.Pin7=PB10 +Mcu.Pin8=PC8 +Mcu.Pin9=PC9 +Mcu.PinsNb=17 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32F407VGTx @@ -59,12 +61,10 @@ NVIC.TIM1_UP_TIM10_IRQn=true\:15\:0\:false\:false\:true\:false\:false\:true\:tru NVIC.TimeBase=TIM1_UP_TIM10_IRQn NVIC.TimeBaseIP=TIM1 NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false -PA5.Mode=Full_Duplex_Master -PA5.Signal=SPI1_SCK -PA6.Mode=Full_Duplex_Master -PA6.Signal=SPI1_MISO -PA7.Mode=Full_Duplex_Master -PA7.Signal=SPI1_MOSI +PB10.Mode=Simplex_Bidirectional_Master +PB10.Signal=SPI2_SCK +PB2.GPIOParameters=GPIO_Label +PB2.GPIO_Label=LED0 PB2.Locked=true PB2.Signal=GPIO_Output PC10.Mode=SD_4_bits_Wide_bus @@ -73,12 +73,27 @@ PC11.Mode=SD_4_bits_Wide_bus PC11.Signal=SDIO_D3 PC12.Mode=SD_4_bits_Wide_bus PC12.Signal=SDIO_CK +PC3.Mode=Simplex_Bidirectional_Master +PC3.Signal=SPI2_MOSI PC8.Mode=SD_4_bits_Wide_bus PC8.Signal=SDIO_D0 PC9.Mode=SD_4_bits_Wide_bus PC9.Signal=SDIO_D1 PD2.Mode=SD_4_bits_Wide_bus PD2.Signal=SDIO_CMD +PE7.GPIOParameters=GPIO_Speed,GPIO_Label +PE7.GPIO_Label=SPI2_CS +PE7.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PE7.Locked=true +PE7.Signal=GPIO_Output +PE8.GPIOParameters=GPIO_Label +PE8.GPIO_Label=SPI2_RS +PE8.Locked=true +PE8.Signal=GPIO_Output +PE9.GPIOParameters=GPIO_Label +PE9.GPIO_Label=SPI2_RST +PE9.Locked=true +PE9.Signal=GPIO_Output PH0-OSC_IN.Mode=HSE-External-Oscillator PH0-OSC_IN.Signal=RCC_OSC_IN PH1-OSC_OUT.Mode=HSE-External-Oscillator @@ -114,7 +129,7 @@ ProjectManager.ToolChainLocation= ProjectManager.UAScriptAfterPath= ProjectManager.UAScriptBeforePath= ProjectManager.UnderRoot=true -ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_SDIO_SD_Init-SDIO-false-HAL-true,4-MX_SPI1_Init-SPI1-false-HAL-true,5-MX_FATFS_Init-FATFS-false-HAL-false +ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_SDIO_SD_Init-SDIO-false-HAL-true,4-MX_FATFS_Init-FATFS-false-HAL-false,5-MX_SPI2_Init-SPI2-false-HAL-true RCC.48MHZClocksFreq_Value=42000000 RCC.AHBFreq_Value=168000000 RCC.APB1CLKDivider=RCC_HCLK_DIV4 @@ -148,14 +163,13 @@ RCC.VCOI2SOutputFreq_Value=384000000 RCC.VCOInputFreq_Value=2000000 RCC.VCOOutputFreq_Value=336000000 RCC.VcooutputI2S=192000000 -SPI1.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_2 -SPI1.CRCCalculation=SPI_CRCCALCULATION_DISABLE -SPI1.CalculateBaudRate=42.0 MBits/s -SPI1.DataSize=SPI_DATASIZE_8BIT -SPI1.Direction=SPI_DIRECTION_2LINES -SPI1.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,BaudRatePrescaler,CRCCalculation -SPI1.Mode=SPI_MODE_MASTER -SPI1.VirtualType=VM_MASTER +SPI2.BaudRatePrescaler=SPI_BAUDRATEPRESCALER_4 +SPI2.CalculateBaudRate=10.5 MBits/s +SPI2.DataSize=SPI_DATASIZE_8BIT +SPI2.Direction=SPI_DIRECTION_1LINE +SPI2.IPParameters=VirtualType,Mode,Direction,CalculateBaudRate,DataSize,BaudRatePrescaler +SPI2.Mode=SPI_MODE_MASTER +SPI2.VirtualType=VM_MASTER VP_FATFS_VS_SDIO.Mode=SDIO VP_FATFS_VS_SDIO.Signal=FATFS_VS_SDIO VP_FREERTOS_VS_CMSIS_V2.Mode=CMSIS_V2