Select missions with right encoder

This commit is contained in:
Jasper Blanckenburg 2023-03-07 20:13:28 +01:00
parent 7476e09fed
commit 38d3d765ad
53 changed files with 29689 additions and 39549 deletions

View File

@ -21,15 +21,15 @@
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "app_azure_rtos.h" #include "app_azure_rtos.h"
#include "app_touchgfx.h"
#include "stm32h7xx.h" #include "stm32h7xx.h"
/* Private includes ----------------------------------------------------------*/ /* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */ /* USER CODE BEGIN Includes */
#include "app.h" #include "app.h"
#include "graphics.h"
#include "main.h" #include "main.h"
#include "tx_api.h" #include "tx_api.h"
#include "tx_port.h"
#include "ui.h"
/* USER CODE END Includes */ /* USER CODE END Includes */
@ -63,7 +63,8 @@ static TX_BYTE_POOL tx_app_byte_pool;
/* USER CODE BEGIN PV */ /* USER CODE BEGIN PV */
TX_THREAD app_thread; TX_THREAD app_thread;
TX_THREAD graphics_thread; TX_THREAD ui_thread;
TX_QUEUE ui_queue;
/* USER CODE END PV */ /* USER CODE END PV */
/* Private function prototypes -----------------------------------------------*/ /* Private function prototypes -----------------------------------------------*/
@ -157,12 +158,22 @@ VOID tx_application_define(VOID *first_unused_memory) {
Error_Handler(); Error_Handler();
} }
void *graphics_thread_stack = mem; void *ui_queue_start = mem;
ULONG ui_queue_msg_size = sizeof(UIMessage) / sizeof(ULONG);
if (ui_queue_msg_size % sizeof(ULONG) != 0) {
ui_queue_msg_size++;
}
mem += UI_QUEUE_SIZE * ui_queue_msg_size;
if (tx_queue_create(&ui_queue, "UI Queue", ui_queue_msg_size, ui_queue_start,
UI_QUEUE_SIZE * ui_queue_msg_size) != TX_SUCCESS) {
Error_Handler();
}
void *ui_thread_stack = mem;
mem += THREAD_STACK_SIZE; mem += THREAD_STACK_SIZE;
if (tx_thread_create(&graphics_thread, "Graphics Thread", if (tx_thread_create(&ui_thread, "UI Thread", ui_thread_entry, 0,
graphics_thread_entry, 0, graphics_thread_stack, ui_thread_stack, THREAD_STACK_SIZE, THREAD_PRIO_UI,
THREAD_STACK_SIZE, THREAD_PRIO_GRAPHICS, THREAD_PRIO_UI, TX_NO_TIME_SLICE,
THREAD_PRIO_GRAPHICS, TX_NO_TIME_SLICE,
TX_AUTO_START) != TX_SUCCESS) { TX_AUTO_START) != TX_SUCCESS) {
Error_Handler(); Error_Handler();
} }

View File

@ -44,8 +44,8 @@ extern "C" {
#define THREAD_STACK_SIZE 4096 #define THREAD_STACK_SIZE 4096
#define THREAD_PRIO_APP 10 #define THREAD_PRIO_APP 10
#define THREAD_PRIO_GRAPHICS 20 #define THREAD_PRIO_UI 6
#define THREAD_PRIO_UI 5 #define UI_QUEUE_SIZE 10
/* USER CODE END EC */ /* USER CODE END EC */
/* Exported macro ------------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/

View File

@ -1,8 +0,0 @@
#ifndef __INC_GRAPHICS_H
#define __INC_GRAPHICS_H
#include "tx_port.h"
void graphics_thread_entry(ULONG _);
#endif // __INC_GRAPHICS_H

View File

@ -4,9 +4,17 @@
#include <stddef.h> #include <stddef.h>
#include <stdint.h> #include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
void HX8357D_WriteData(uint8_t *data, size_t data_len); void HX8357D_WriteData(uint8_t *data, size_t data_len);
void HX8357D_WriteReg(uint8_t addr, uint8_t *data, size_t data_len); void HX8357D_WriteReg(uint8_t addr, uint8_t *data, size_t data_len);
void HX8357D_Init(); void HX8357D_Init();
void HX8357D_Mode_RGB666(); void HX8357D_Mode_RGB666();
#ifdef __cplusplus
}
#endif
#endif // __HX8357D_H #endif // __HX8357D_H

View File

@ -31,7 +31,7 @@ extern "C" {
/* Private includes ----------------------------------------------------------*/ /* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */ /* USER CODE BEGIN Includes */
#include "tx_api.h"
/* USER CODE END Includes */ /* USER CODE END Includes */
/* Exported types ------------------------------------------------------------*/ /* Exported types ------------------------------------------------------------*/
@ -42,6 +42,7 @@ extern "C" {
/* Exported constants --------------------------------------------------------*/ /* Exported constants --------------------------------------------------------*/
/* USER CODE BEGIN EC */ /* USER CODE BEGIN EC */
extern volatile int ltdc_cb_triggered; extern volatile int ltdc_cb_triggered;
extern TX_QUEUE ui_queue;
/* USER CODE END EC */ /* USER CODE END EC */
/* Exported macro ------------------------------------------------------------*/ /* Exported macro ------------------------------------------------------------*/
@ -61,12 +62,16 @@ void Error_Handler(void);
/* Private defines -----------------------------------------------------------*/ /* Private defines -----------------------------------------------------------*/
#define ENC1A_Pin GPIO_PIN_3 #define ENC1A_Pin GPIO_PIN_3
#define ENC1A_GPIO_Port GPIOE #define ENC1A_GPIO_Port GPIOE
#define ENC1A_EXTI_IRQn EXTI3_IRQn
#define ENC1B_Pin GPIO_PIN_4 #define ENC1B_Pin GPIO_PIN_4
#define ENC1B_GPIO_Port GPIOE #define ENC1B_GPIO_Port GPIOE
#define ENC1B_EXTI_IRQn EXTI4_IRQn
#define ENC2A_Pin GPIO_PIN_5 #define ENC2A_Pin GPIO_PIN_5
#define ENC2A_GPIO_Port GPIOE #define ENC2A_GPIO_Port GPIOE
#define ENC2A_EXTI_IRQn EXTI9_5_IRQn
#define ENC2B_Pin GPIO_PIN_6 #define ENC2B_Pin GPIO_PIN_6
#define ENC2B_GPIO_Port GPIOE #define ENC2B_GPIO_Port GPIOE
#define ENC2B_EXTI_IRQn EXTI9_5_IRQn
#define BTN1_Pin GPIO_PIN_0 #define BTN1_Pin GPIO_PIN_0
#define BTN1_GPIO_Port GPIOF #define BTN1_GPIO_Port GPIOF
#define BTN2_Pin GPIO_PIN_1 #define BTN2_Pin GPIO_PIN_1

View File

@ -52,6 +52,9 @@ void MemManage_Handler(void);
void BusFault_Handler(void); void BusFault_Handler(void);
void UsageFault_Handler(void); void UsageFault_Handler(void);
void DebugMon_Handler(void); void DebugMon_Handler(void);
void EXTI3_IRQHandler(void);
void EXTI4_IRQHandler(void);
void EXTI9_5_IRQHandler(void);
void TIM6_DAC_IRQHandler(void); void TIM6_DAC_IRQHandler(void);
void LTDC_IRQHandler(void); void LTDC_IRQHandler(void);
/* USER CODE BEGIN EFP */ /* USER CODE BEGIN EFP */

View File

@ -2,5 +2,15 @@
#define __INC_STW_DEFINES_H #define __INC_STW_DEFINES_H
#define NUM_MISSIONS 7 #define NUM_MISSIONS 7
typedef enum {
MISSION_NONE = 0,
MISSION_ACCEL = 1,
MISSION_SKIDPAD = 2,
MISSION_AUTOX = 3,
MISSION_TRACKDRIVE = 4,
MISSION_EBS = 5,
MISSION_INSPECTION = 6,
MISSION_MANUAL = 7
} Mission;
#endif // __INC_STW_DEFINES_H #endif // __INC_STW_DEFINES_H

28
Core/Inc/ui.h Normal file
View File

@ -0,0 +1,28 @@
#ifndef __INC_ui_H
#define __INC_ui_H
#include "tx_port.h"
#ifdef __cplusplus
extern "C" {
#endif
#define NUM_BUTTONS 6
#define NUM_ENCS 2
#define BUTTON_MIN_PRESS_TIME 50 // ms
#define ENC_MAX_PHASE 50 // ms
typedef enum { UMK_BTN_RELEASED, UMK_ENC_CW, UMK_ENC_CCW } UIMessageKind;
typedef struct {
UIMessageKind kind;
int number;
} UIMessage;
void ui_thread_entry(ULONG _);
#ifdef __cplusplus
}
#endif
#endif // __INC_ui_H

View File

@ -1,17 +0,0 @@
#include "graphics.h"
#include "stm32h7xx_hal.h"
#include "tx_api.h"
#include "hx8357d.h"
#include "main.h"
void graphics_thread_entry(ULONG _) {
HX8357D_Init();
HX8357D_Mode_RGB666();
while (1) {
HAL_GPIO_TogglePin(STATUS2_GPIO_Port, STATUS2_Pin);
tx_thread_sleep(100);
}
}

View File

@ -135,6 +135,8 @@ int main(void) {
Error_Handler(); Error_Handler();
} }
HX8357D_Init();
HX8357D_Mode_RGB666();
/* USER CODE END 2 */ /* USER CODE END 2 */
MX_ThreadX_Init(); MX_ThreadX_Init();
@ -395,8 +397,7 @@ static void MX_LTDC_Init(void) {
pLayerCfg.Alpha0 = 0; pLayerCfg.Alpha0 = 0;
pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA; pLayerCfg.BlendingFactor1 = LTDC_BLENDING_FACTOR1_CA;
pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA; pLayerCfg.BlendingFactor2 = LTDC_BLENDING_FACTOR2_CA;
// pLayerCfg.FBStartAdress = (uint32_t)&image_data_ft_logo_rainbow_rgb565; pLayerCfg.FBStartAdress = 0;
pLayerCfg.FBStartAdress = (uint32_t)0x24040000;
pLayerCfg.ImageWidth = 320; pLayerCfg.ImageWidth = 320;
pLayerCfg.ImageHeight = 480; pLayerCfg.ImageHeight = 480;
pLayerCfg.Backcolor.Blue = 0; pLayerCfg.Backcolor.Blue = 0;
@ -717,7 +718,7 @@ static void MX_GPIO_Init(void) {
/*Configure GPIO pins : ENC1A_Pin ENC1B_Pin ENC2A_Pin ENC2B_Pin */ /*Configure GPIO pins : ENC1A_Pin ENC1B_Pin ENC2A_Pin ENC2B_Pin */
GPIO_InitStruct.Pin = ENC1A_Pin | ENC1B_Pin | ENC2A_Pin | ENC2B_Pin; GPIO_InitStruct.Pin = ENC1A_Pin | ENC1B_Pin | ENC2A_Pin | ENC2B_Pin;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT; GPIO_InitStruct.Mode = GPIO_MODE_IT_RISING_FALLING;
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); HAL_GPIO_Init(GPIOE, &GPIO_InitStruct);
@ -758,6 +759,16 @@ static void MX_GPIO_Init(void) {
GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
HAL_GPIO_Init(BOOT0_SET_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_Init(BOOT0_SET_GPIO_Port, &GPIO_InitStruct);
/* EXTI interrupt init*/
HAL_NVIC_SetPriority(EXTI3_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI3_IRQn);
HAL_NVIC_SetPriority(EXTI4_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI4_IRQn);
HAL_NVIC_SetPriority(EXTI9_5_IRQn, 0, 0);
HAL_NVIC_EnableIRQ(EXTI9_5_IRQn);
} }
/* USER CODE BEGIN 4 */ /* USER CODE BEGIN 4 */

View File

@ -160,6 +160,49 @@ void DebugMon_Handler(void)
/* please refer to the startup file (startup_stm32h7xx.s). */ /* please refer to the startup file (startup_stm32h7xx.s). */
/******************************************************************************/ /******************************************************************************/
/**
* @brief This function handles EXTI line3 interrupt.
*/
void EXTI3_IRQHandler(void)
{
/* USER CODE BEGIN EXTI3_IRQn 0 */
/* USER CODE END EXTI3_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(ENC1A_Pin);
/* USER CODE BEGIN EXTI3_IRQn 1 */
/* USER CODE END EXTI3_IRQn 1 */
}
/**
* @brief This function handles EXTI line4 interrupt.
*/
void EXTI4_IRQHandler(void)
{
/* USER CODE BEGIN EXTI4_IRQn 0 */
/* USER CODE END EXTI4_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(ENC1B_Pin);
/* USER CODE BEGIN EXTI4_IRQn 1 */
/* USER CODE END EXTI4_IRQn 1 */
}
/**
* @brief This function handles EXTI line[9:5] interrupts.
*/
void EXTI9_5_IRQHandler(void)
{
/* USER CODE BEGIN EXTI9_5_IRQn 0 */
/* USER CODE END EXTI9_5_IRQn 0 */
HAL_GPIO_EXTI_IRQHandler(ENC2A_Pin);
HAL_GPIO_EXTI_IRQHandler(ENC2B_Pin);
/* USER CODE BEGIN EXTI9_5_IRQn 1 */
/* USER CODE END EXTI9_5_IRQn 1 */
}
/** /**
* @brief This function handles TIM6 global interrupt, DAC1_CH1 and DAC1_CH2 underrun error interrupts. * @brief This function handles TIM6 global interrupt, DAC1_CH1 and DAC1_CH2 underrun error interrupts.
*/ */

97
Core/Src/ui.c Normal file
View File

@ -0,0 +1,97 @@
#include "ui.h"
#include "stm32h7a3xx.h"
#include "stm32h7xx_hal.h"
#include "stm32h7xx_hal_gpio.h"
#include "tx_api.h"
#include "hx8357d.h"
#include "main.h"
#include <stdint.h>
void ui_thread_entry(ULONG _) {
GPIO_TypeDef *button_ports[NUM_BUTTONS] = {BTN1_GPIO_Port, BTN2_GPIO_Port,
BTN3_GPIO_Port, BTN4_GPIO_Port,
BTN5_GPIO_Port, BTN6_GPIO_Port};
uint16_t button_pins[NUM_BUTTONS] = {BTN1_Pin, BTN2_Pin, BTN3_Pin,
BTN4_Pin, BTN5_Pin, BTN6_Pin};
GPIO_PinState button_states[NUM_BUTTONS] = {GPIO_PIN_RESET};
uint32_t button_change_times[NUM_BUTTONS] = {HAL_GetTick()};
while (1) {
for (int i = 0; i < NUM_BUTTONS; i++) {
GPIO_PinState state = HAL_GPIO_ReadPin(button_ports[i], button_pins[i]);
if (state != button_states[i]) {
uint32_t now = HAL_GetTick();
if (state == GPIO_PIN_RESET && now - button_change_times[i]) {
// Button release event!
UIMessage msg = {.kind = UMK_BTN_RELEASED, .number = i};
tx_queue_send(&ui_queue, &msg, TX_NO_WAIT);
}
button_change_times[i] = now;
button_states[i] = state;
}
}
// Release so other threads can get scheduled
tx_thread_sleep(1);
}
}
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin) {
// This gets called when an edge on one of the encoder pins is detected.
static uint32_t last_change[NUM_ENCS * 2] = {0};
static GPIO_PinState last_state[NUM_ENCS * 2] = {GPIO_PIN_RESET};
if (GPIO_Pin == ENC2B_Pin) {
// ENC2A and ENC2B share an interrupt line, so the HAL calls this callback
// once with each pin. Since we already handled the interrupt once for
// ENC2A, we can just ignore it now.
}
uint32_t now = HAL_GetTick();
uint16_t pin_a, pin_b;
int idx_a, idx_b;
UIMessage msg;
if (GPIO_Pin == ENC1A_Pin || GPIO_Pin == ENC1B_Pin) {
pin_a = ENC1A_Pin;
pin_b = ENC1B_Pin;
idx_a = 0;
idx_b = 1;
msg.number = 0;
} else {
pin_a = ENC2A_Pin;
pin_b = ENC2B_Pin;
idx_a = 2;
idx_b = 3;
msg.number = 1;
}
// All encoder pins are on port E
GPIO_PinState state_a = HAL_GPIO_ReadPin(GPIOE, pin_a);
GPIO_PinState state_b = HAL_GPIO_ReadPin(GPIOE, pin_b);
int a_changed = state_a != last_state[idx_a];
int b_changed = state_b != last_state[idx_b];
last_state[idx_a] = state_a;
last_state[idx_b] = state_b;
if (state_a == GPIO_PIN_RESET && state_b == GPIO_PIN_RESET) {
// Second falling edge, direction depends on which pin changed last
if (a_changed && b_changed) {
// This shouldn't happen. Ignore this event.
last_change[idx_a] = now;
last_change[idx_b] = now;
return;
} else if (a_changed) {
last_change[idx_a] = now;
msg.kind = UMK_ENC_CCW;
} else if (b_changed) {
last_change[idx_b] = now;
msg.kind = UMK_ENC_CW;
} else {
// This shouldn't happen. Ignore this event.
return;
}
tx_queue_send(&ui_queue, &msg, TX_NO_WAIT);
}
}

View File

@ -160,7 +160,6 @@
*/ */
/* Includes ------------------------------------------------------------------*/ /* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32h7xx_hal.h" #include "stm32h7xx_hal.h"
/** @addtogroup STM32H7xx_HAL_Driver /** @addtogroup STM32H7xx_HAL_Driver
@ -631,8 +630,6 @@ HAL_StatusTypeDef HAL_LTDC_UnRegisterCallback(LTDC_HandleTypeDef *hltdc, HAL_LTD
*/ */
void HAL_LTDC_IRQHandler(LTDC_HandleTypeDef *hltdc) void HAL_LTDC_IRQHandler(LTDC_HandleTypeDef *hltdc)
{ {
ltdc_cb_triggered++;
uint32_t isrflags = READ_REG(hltdc->Instance->ISR); uint32_t isrflags = READ_REG(hltdc->Instance->ISR);
uint32_t itsources = READ_REG(hltdc->Instance->IER); uint32_t itsources = READ_REG(hltdc->Instance->IER);
@ -695,7 +692,6 @@ void HAL_LTDC_IRQHandler(LTDC_HandleTypeDef *hltdc)
/* Line Interrupt management ************************************************/ /* Line Interrupt management ************************************************/
if (((isrflags & LTDC_ISR_LIF) != 0U) && ((itsources & LTDC_IER_LIE) != 0U)) if (((isrflags & LTDC_ISR_LIF) != 0U) && ((itsources & LTDC_IER_LIE) != 0U))
{ {
ltdc_cb_triggered++;
/* Disable the Line interrupt */ /* Disable the Line interrupt */
__HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_LI); __HAL_LTDC_DISABLE_IT(hltdc, LTDC_IT_LI);

View File

@ -1,5 +1,5 @@
########################################################################################################################## ##########################################################################################################################
# File automatically-generated by tool: [projectgenerator] version: [3.18.0-B7] date: [Mon Mar 06 15:50:06 CET 2023] # File automatically-generated by tool: [projectgenerator] version: [3.18.0-B7] date: [Tue Mar 07 19:47:03 CET 2023]
########################################################################################################################## ##########################################################################################################################
# ------------------------------------------------ # ------------------------------------------------

View File

@ -39,12 +39,12 @@ C_SOURCES = \
AZURE_RTOS/App/app_azure_rtos.c \ AZURE_RTOS/App/app_azure_rtos.c \
Core/Src/app.c \ Core/Src/app.c \
Core/Src/app_threadx.c \ Core/Src/app_threadx.c \
Core/Src/graphics.c \
Core/Src/hx8357d.c \ Core/Src/hx8357d.c \
Core/Src/stm32h7xx_hal_msp.c \ Core/Src/stm32h7xx_hal_msp.c \
Core/Src/stm32h7xx_hal_timebase_tim.c \ Core/Src/stm32h7xx_hal_timebase_tim.c \
Core/Src/stm32h7xx_it.c \ Core/Src/stm32h7xx_it.c \
Core/Src/system_stm32h7xx.c \ Core/Src/system_stm32h7xx.c \
Core/Src/ui.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c \ Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.c \ Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_cortex.c \
Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_crc.c \ Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_hal_crc.c \
@ -347,6 +347,8 @@ TouchGFX/generated/images/src/image_Fasttube_Logo.cpp \
TouchGFX/generated/images/src/image_Fasttube_Logo_small.cpp \ TouchGFX/generated/images/src/image_Fasttube_Logo_small.cpp \
TouchGFX/generated/images/src/image_Fasttube_Logo_small_white.cpp \ TouchGFX/generated/images/src/image_Fasttube_Logo_small_white.cpp \
TouchGFX/generated/images/src/image_Fasttube_Logo_white.cpp \ TouchGFX/generated/images/src/image_Fasttube_Logo_white.cpp \
TouchGFX/generated/images/src/image_logo_dv_small.cpp \
TouchGFX/generated/images/src/image_logo_dv_small_white.cpp \
TouchGFX/generated/texts/src/LanguageGb.cpp \ TouchGFX/generated/texts/src/LanguageGb.cpp \
TouchGFX/generated/texts/src/Texts.cpp \ TouchGFX/generated/texts/src/Texts.cpp \
TouchGFX/generated/texts/src/TypedTextDatabase.cpp \ TouchGFX/generated/texts/src/TypedTextDatabase.cpp \

View File

@ -8,11 +8,14 @@
"section": "ExtFlashSection", "section": "ExtFlashSection",
"extra_section": "ExtFlashSection", "extra_section": "ExtFlashSection",
"images": { "images": {
"Fasttube_Logo.png": { "Fasttube_Logo_small_white.png": {
"format": "RGB565" "layout_rotation": "90"
}, },
"Fasttube_Logo_white.png": { "logo_dv_small.png": {
"format": "RGB565" "layout_rotation": "90"
},
"logo_dv_small_white.png": {
"layout_rotation": "90"
} }
} }
}, },

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -11,6 +11,8 @@
#include <touchgfx/widgets/TextArea.hpp> #include <touchgfx/widgets/TextArea.hpp>
#include <touchgfx/containers/ListLayout.hpp> #include <touchgfx/containers/ListLayout.hpp>
#include <gui/containers/MissionSelectElement.hpp> #include <gui/containers/MissionSelectElement.hpp>
#include <touchgfx/widgets/canvas/Line.hpp>
#include <touchgfx/widgets/canvas/PainterRGB565.hpp>
#include <touchgfx/widgets/Image.hpp> #include <touchgfx/widgets/Image.hpp>
class MissionSelectViewBase : public touchgfx::View<MissionSelectPresenter> class MissionSelectViewBase : public touchgfx::View<MissionSelectPresenter>
@ -38,7 +40,9 @@ protected:
MissionSelectElement ebs; MissionSelectElement ebs;
MissionSelectElement inspection; MissionSelectElement inspection;
MissionSelectElement manual; MissionSelectElement manual;
touchgfx::Image image1; touchgfx::Line lastLine;
touchgfx::PainterRGB565 lastLinePainter;
touchgfx::Image logo;
private: private:

View File

@ -38,11 +38,20 @@ MissionSelectViewBase::MissionSelectViewBase()
missionList.add(manual); missionList.add(manual);
lastLine.setPosition(0, 210, 480, 2);
lastLinePainter.setColor(touchgfx::Color::getColorFromRGB(170, 170, 170));
lastLine.setPainter(lastLinePainter);
lastLine.setStart(0, 0);
lastLine.setEnd(480, 0);
lastLine.setLineWidth(5);
lastLine.setLineEndingStyle(touchgfx::Line::ROUND_CAP_ENDING);
missionList.add(lastLine);
add(missionList); add(missionList);
image1.setXY(160, 263); logo.setXY(160, 263);
image1.setBitmap(touchgfx::Bitmap(BITMAP_FASTTUBE_LOGO_SMALL_WHITE_ID)); logo.setBitmap(touchgfx::Bitmap(BITMAP_LOGO_DV_SMALL_WHITE_ID));
add(image1); add(logo);
} }
MissionSelectViewBase::~MissionSelectViewBase() MissionSelectViewBase::~MissionSelectViewBase()

View File

@ -10,6 +10,8 @@ const uint16_t BITMAP_FASTTUBE_LOGO_ID = 0;
const uint16_t BITMAP_FASTTUBE_LOGO_SMALL_ID = 1; const uint16_t BITMAP_FASTTUBE_LOGO_SMALL_ID = 1;
const uint16_t BITMAP_FASTTUBE_LOGO_SMALL_WHITE_ID = 2; const uint16_t BITMAP_FASTTUBE_LOGO_SMALL_WHITE_ID = 2;
const uint16_t BITMAP_FASTTUBE_LOGO_WHITE_ID = 3; const uint16_t BITMAP_FASTTUBE_LOGO_WHITE_ID = 3;
const uint16_t BITMAP_LOGO_DV_SMALL_ID = 4;
const uint16_t BITMAP_LOGO_DV_SMALL_WHITE_ID = 5;
namespace BitmapDatabase namespace BitmapDatabase
{ {

View File

@ -1,21 +1,23 @@
// 4.21.2 0x29b80d2b // 4.21.2 0xf00b0e5c
// Generated by imageconverter. Please, do not edit! // Generated by imageconverter. Please, do not edit!
#include <images/BitmapDatabase.hpp> #include <images/BitmapDatabase.hpp>
#include <touchgfx/Bitmap.hpp> #include <touchgfx/Bitmap.hpp>
extern const unsigned char image_fasttube_logo[]; // BITMAP_FASTTUBE_LOGO_ID = 0, Size: 480x165 pixels extern const unsigned char image_fasttube_logo[]; // BITMAP_FASTTUBE_LOGO_ID = 0, Size: 480x165 pixels
extern const unsigned char image_fasttube_logo_extra_data[];
extern const unsigned char image_fasttube_logo_small[]; // BITMAP_FASTTUBE_LOGO_SMALL_ID = 1, Size: 160x55 pixels extern const unsigned char image_fasttube_logo_small[]; // BITMAP_FASTTUBE_LOGO_SMALL_ID = 1, Size: 160x55 pixels
extern const unsigned char image_fasttube_logo_small_white[]; // BITMAP_FASTTUBE_LOGO_SMALL_WHITE_ID = 2, Size: 160x55 pixels extern const unsigned char image_fasttube_logo_small_white[]; // BITMAP_FASTTUBE_LOGO_SMALL_WHITE_ID = 2, Size: 160x55 pixels
extern const unsigned char image_fasttube_logo_white[]; // BITMAP_FASTTUBE_LOGO_WHITE_ID = 3, Size: 480x165 pixels extern const unsigned char image_fasttube_logo_white[]; // BITMAP_FASTTUBE_LOGO_WHITE_ID = 3, Size: 480x165 pixels
extern const unsigned char image_fasttube_logo_white_extra_data[]; extern const unsigned char image_logo_dv_small[]; // BITMAP_LOGO_DV_SMALL_ID = 4, Size: 160x55 pixels
extern const unsigned char image_logo_dv_small_white[]; // BITMAP_LOGO_DV_SMALL_WHITE_ID = 5, Size: 160x55 pixels
const touchgfx::Bitmap::BitmapData bitmap_database[] = { const touchgfx::Bitmap::BitmapData bitmap_database[] = {
{ image_fasttube_logo, image_fasttube_logo_extra_data, 480, 165, 184, 124, 113, ((uint8_t)touchgfx::Bitmap::RGB565) >> 3, 9, ((uint8_t)touchgfx::Bitmap::RGB565) & 0x7 }, { image_fasttube_logo, 0, 480, 165, 0, 0, 480, ((uint8_t)touchgfx::Bitmap::RGB565) >> 3, 165, ((uint8_t)touchgfx::Bitmap::RGB565) & 0x7 },
{ image_fasttube_logo_small, 0, 160, 55, 62, 42, 36, ((uint8_t)touchgfx::Bitmap::ARGB8888) >> 3, 2, ((uint8_t)touchgfx::Bitmap::ARGB8888) & 0x7 }, { image_fasttube_logo_small, 0, 160, 55, 0, 0, 160, ((uint8_t)touchgfx::Bitmap::RGB565) >> 3, 55, ((uint8_t)touchgfx::Bitmap::RGB565) & 0x7 },
{ image_fasttube_logo_small_white, 0, 160, 55, 62, 42, 36, ((uint8_t)touchgfx::Bitmap::ARGB8888) >> 3, 2, ((uint8_t)touchgfx::Bitmap::ARGB8888) & 0x7 }, { image_fasttube_logo_small_white, 0, 160, 55, 0, 0, 160, ((uint8_t)touchgfx::Bitmap::RGB565) >> 3, 55, ((uint8_t)touchgfx::Bitmap::RGB565) & 0x7 },
{ image_fasttube_logo_white, image_fasttube_logo_white_extra_data, 480, 165, 184, 124, 113, ((uint8_t)touchgfx::Bitmap::RGB565) >> 3, 9, ((uint8_t)touchgfx::Bitmap::RGB565) & 0x7 } { image_fasttube_logo_white, 0, 480, 165, 0, 0, 480, ((uint8_t)touchgfx::Bitmap::RGB565) >> 3, 165, ((uint8_t)touchgfx::Bitmap::RGB565) & 0x7 },
{ image_logo_dv_small, 0, 160, 55, 62, 42, 37, ((uint8_t)touchgfx::Bitmap::ARGB8888) >> 3, 2, ((uint8_t)touchgfx::Bitmap::ARGB8888) & 0x7 },
{ image_logo_dv_small_white, 0, 160, 55, 62, 42, 37, ((uint8_t)touchgfx::Bitmap::ARGB8888) >> 3, 2, ((uint8_t)touchgfx::Bitmap::ARGB8888) & 0x7 }
}; };
namespace BitmapDatabase namespace BitmapDatabase

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -7,17 +7,16 @@ class FrontendHeap;
using namespace touchgfx; using namespace touchgfx;
class FrontendApplication : public FrontendApplicationBase class FrontendApplication : public FrontendApplicationBase {
{
public: public:
FrontendApplication(Model &m, FrontendHeap &heap); FrontendApplication(Model &m, FrontendHeap &heap);
virtual ~FrontendApplication() {} virtual ~FrontendApplication() {}
virtual void handleTickEvent() virtual void handleTickEvent() {
{
model.tick();
FrontendApplicationBase::handleTickEvent(); FrontendApplicationBase::handleTickEvent();
model.tick();
} }
private: private:
}; };

View File

@ -1,6 +1,7 @@
#ifndef MISSIONSELECTELEMENT_HPP #ifndef MISSIONSELECTELEMENT_HPP
#define MISSIONSELECTELEMENT_HPP #define MISSIONSELECTELEMENT_HPP
#include "touchgfx/hal/Types.hpp"
#include <gui_generated/containers/MissionSelectElementBase.hpp> #include <gui_generated/containers/MissionSelectElementBase.hpp>
#include <texts/TextKeysAndLanguages.hpp> #include <texts/TextKeysAndLanguages.hpp>
@ -12,8 +13,11 @@ public:
virtual void initialize(); virtual void initialize();
void setUp(uint32_t i, TEXTS label); void setUp(uint32_t i, TEXTS label);
void setSelected(bool selected);
protected: protected:
private:
touchgfx::colortype bgColor;
}; };
#endif // MISSIONSELECTELEMENT_HPP #endif // MISSIONSELECTELEMENT_HPP

View File

@ -8,25 +8,28 @@ using namespace touchgfx;
class MissionSelectView; class MissionSelectView;
class MissionSelectPresenter : public touchgfx::Presenter, public ModelListener class MissionSelectPresenter : public touchgfx::Presenter,
{ public ModelListener {
public: public:
MissionSelectPresenter(MissionSelectView &v); MissionSelectPresenter(MissionSelectView &v);
/** /**
* The activate function is called automatically when this screen is "switched in" * The activate function is called automatically when this screen is "switched
* (ie. made active). Initialization logic can be placed here. * in" (ie. made active). Initialization logic can be placed here.
*/ */
virtual void activate(); virtual void activate();
/** /**
* The deactivate function is called automatically when this screen is "switched out" * The deactivate function is called automatically when this screen is
* (ie. made inactive). Teardown functionality can be placed here. * "switched out" (ie. made inactive). Teardown functionality can be placed
* here.
*/ */
virtual void deactivate(); virtual void deactivate();
virtual ~MissionSelectPresenter(){}; virtual ~MissionSelectPresenter(){};
virtual void notifyMissionChanged(Mission mission) override;
private: private:
MissionSelectPresenter(); MissionSelectPresenter();

View File

@ -1,17 +1,22 @@
#ifndef MISSIONSELECTVIEW_HPP #ifndef MISSIONSELECTVIEW_HPP
#define MISSIONSELECTVIEW_HPP #define MISSIONSELECTVIEW_HPP
#include <gui_generated/missionselect_screen/MissionSelectViewBase.hpp> #include "gui/containers/MissionSelectElement.hpp"
#include <gui/missionselect_screen/MissionSelectPresenter.hpp> #include <gui/missionselect_screen/MissionSelectPresenter.hpp>
#include <gui_generated/missionselect_screen/MissionSelectViewBase.hpp>
class MissionSelectView : public MissionSelectViewBase class MissionSelectView : public MissionSelectViewBase {
{
public: public:
MissionSelectView(); MissionSelectView();
virtual ~MissionSelectView() {} virtual ~MissionSelectView() {}
virtual void setupScreen(); virtual void setupScreen();
virtual void tearDownScreen(); virtual void tearDownScreen();
void setSelectedMission(Mission mission);
protected: protected:
private:
MissionSelectElement *selected;
}; };
#endif // MISSIONSELECTVIEW_HPP #endif // MISSIONSELECTVIEW_HPP

View File

@ -1,21 +1,24 @@
#ifndef MODEL_HPP #ifndef MODEL_HPP
#define MODEL_HPP #define MODEL_HPP
#include "stw_defines.h"
class ModelListener; class ModelListener;
class Model class Model {
{
public: public:
Model(); Model();
void bind(ModelListener* listener) void bind(ModelListener *listener) { modelListener = listener; }
{
modelListener = listener;
}
void tick(); void tick();
Mission getCurrentMission() const { return mission; }
protected: protected:
ModelListener *modelListener; ModelListener *modelListener;
private:
Mission mission;
}; };
#endif // MODEL_HPP #endif // MODEL_HPP

View File

@ -3,17 +3,18 @@
#include <gui/model/Model.hpp> #include <gui/model/Model.hpp>
class ModelListener #include "stw_defines.h"
{
class ModelListener {
public: public:
ModelListener() : model(0) {} ModelListener() : model(0) {}
virtual ~ModelListener() {} virtual ~ModelListener() {}
void bind(Model* m) void bind(Model *m) { model = m; }
{
model = m; virtual void notifyMissionChanged(Mission newMission){};
}
protected: protected:
Model *model; Model *model;
}; };

View File

@ -11,11 +11,21 @@ void MissionSelectElement::initialize() {
void MissionSelectElement::setUp(uint32_t i, TEXTS label) { void MissionSelectElement::setUp(uint32_t i, TEXTS label) {
uint8_t val; uint8_t val;
if (i % 2 == 0) { if (i % 2 == 0) {
val = 0b1000;
} else {
val = 0b10000; val = 0b10000;
} else {
val = 0b11000;
} }
bg.setColor(touchgfx::Color::getColorFromRGB(val, val, val)); bgColor = touchgfx::Color::getColorFromRGB(val, val, val);
bg.setColor(bgColor);
text.setTypedText(TypedText(label)); text.setTypedText(TypedText(label));
} }
void MissionSelectElement::setSelected(bool selected) {
if (selected) {
bg.setColor(touchgfx::Color::getColorFromRGB(0xc5, 0x0e, 0x1f));
} else {
bg.setColor(bgColor);
}
bg.invalidate();
}

View File

@ -1,18 +1,13 @@
#include <gui/missionselect_screen/MissionSelectView.hpp>
#include <gui/missionselect_screen/MissionSelectPresenter.hpp> #include <gui/missionselect_screen/MissionSelectPresenter.hpp>
#include <gui/missionselect_screen/MissionSelectView.hpp>
MissionSelectPresenter::MissionSelectPresenter(MissionSelectView &v) MissionSelectPresenter::MissionSelectPresenter(MissionSelectView &v)
: view(v) : view(v) {}
{
}
void MissionSelectPresenter::activate()
{
}
void MissionSelectPresenter::deactivate()
{
void MissionSelectPresenter::activate() {}
void MissionSelectPresenter::deactivate() {}
void MissionSelectPresenter::notifyMissionChanged(Mission mission) {
view.setSelectedMission(mission);
} }

View File

@ -1,7 +1,7 @@
#include "texts/TextKeysAndLanguages.hpp" #include "texts/TextKeysAndLanguages.hpp"
#include <gui/missionselect_screen/MissionSelectView.hpp> #include <gui/missionselect_screen/MissionSelectView.hpp>
MissionSelectView::MissionSelectView() {} MissionSelectView::MissionSelectView() : selected{nullptr} {}
void MissionSelectView::setupScreen() { void MissionSelectView::setupScreen() {
MissionSelectViewBase::setupScreen(); MissionSelectViewBase::setupScreen();
@ -17,3 +17,36 @@ void MissionSelectView::setupScreen() {
void MissionSelectView::tearDownScreen() { void MissionSelectView::tearDownScreen() {
MissionSelectViewBase::tearDownScreen(); MissionSelectViewBase::tearDownScreen();
} }
void MissionSelectView::setSelectedMission(Mission mission) {
if (selected != nullptr) {
selected->setSelected(false);
}
switch (mission) {
case MISSION_NONE:
break;
case MISSION_ACCEL:
selected = &accel;
break;
case MISSION_SKIDPAD:
selected = &skidpad;
break;
case MISSION_AUTOX:
selected = &autox;
break;
case MISSION_TRACKDRIVE:
selected = &trackdrive;
break;
case MISSION_EBS:
selected = &ebs;
break;
case MISSION_INSPECTION:
selected = &inspection;
break;
case MISSION_MANUAL:
selected = &manual;
break;
}
selected->setSelected(true);
}

View File

@ -1,12 +1,43 @@
#include "main.h"
#include "stm32h7xx_hal_gpio.h"
#include "stw_defines.h"
#include "tx_api.h"
#include "ui.h"
#include <gui/model/Model.hpp> #include <gui/model/Model.hpp>
#include <gui/model/ModelListener.hpp> #include <gui/model/ModelListener.hpp>
Model::Model() : modelListener(0) Model::Model() : modelListener(0), mission{MISSION_NONE} {}
{
void Model::tick() {
UIMessage msg;
while (tx_queue_receive(&ui_queue, &msg, TX_NO_WAIT) == TX_SUCCESS) {
switch (msg.kind) {
case UMK_BTN_RELEASED:
// TODO: What do we do with this?
break;
case UMK_ENC_CW: {
int mission_int = static_cast<int>(mission);
mission_int++;
// mission_int = 0 is MISSION_NONE, which we don't want to select.
// NUM_MISSIONS is equal to the last mission, so check for strictly
// greater.
if (mission_int > NUM_MISSIONS) {
mission_int = 1;
}
mission = static_cast<Mission>(mission_int);
modelListener->notifyMissionChanged(mission);
break;
}
case UMK_ENC_CCW:
int mission_int = static_cast<int>(mission);
mission_int--;
if (mission_int <= 0) {
mission_int = NUM_MISSIONS;
}
mission = static_cast<Mission>(mission_int);
modelListener->notifyMissionChanged(mission);
break;
}
HAL_GPIO_TogglePin(STATUS2_GPIO_Port, STATUS2_Pin);
} }
void Model::tick()
{
} }

View File

@ -21,7 +21,7 @@ $(error Spaces not allowed in path)
else else
ADDITIONAL_SOURCES := ADDITIONAL_SOURCES :=
ADDITIONAL_INCLUDE_PATHS := ADDITIONAL_INCLUDE_PATHS := $(application_path)/../Core/Inc
ADDITIONAL_LIBRARY_PATHS := ADDITIONAL_LIBRARY_PATHS :=
ADDITIONAL_LIBRARIES := ADDITIONAL_LIBRARIES :=
export ADDITIONAL_SOURCES ADDITIONAL_INCLUDE_PATHS ADDITIONAL_LIBRARY_PATHS ADDITIONAL_LIBRARIES export ADDITIONAL_SOURCES ADDITIONAL_INCLUDE_PATHS ADDITIONAL_LIBRARY_PATHS ADDITIONAL_LIBRARIES

View File

@ -25,7 +25,7 @@
"Name": "missionList", "Name": "missionList",
"Y": 48, "Y": 48,
"Width": 480, "Width": 480,
"Height": 210, "Height": 212,
"Direction": "South", "Direction": "South",
"Components": [ "Components": [
{ {
@ -82,17 +82,32 @@
"Width": 480, "Width": 480,
"Height": 30, "Height": 30,
"CustomContainerDefinitionName": "MissionSelectElement" "CustomContainerDefinitionName": "MissionSelectElement"
},
{
"Type": "Line",
"Name": "lastLine",
"Y": 210,
"Width": 480,
"Height": 2,
"Color": {
"Red": 170,
"Green": 170,
"Blue": 170
},
"EndX": 480.0,
"LineWidth": 5.0,
"LineEndingStyle": "Round"
} }
] ]
}, },
{ {
"Type": "Image", "Type": "Image",
"Name": "image1", "Name": "logo",
"X": 160, "X": 160,
"Y": 263, "Y": 263,
"Width": 160, "Width": 160,
"Height": 55, "Height": 55,
"RelativeFilename": "Fasttube_Logo_small_white.png" "RelativeFilename": "logo_dv_small_white.png"
} }
], ],
"Interactions": [] "Interactions": []

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 6.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 22 KiB

BIN
assets/logo_dv.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

69
assets/logo_dv.svg Normal file
View File

@ -0,0 +1,69 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
version="1.0"
width="1600"
height="547"
viewBox="0 0 16000 5470"
preserveAspectRatio="xMidYMid"
id="svg75"
sodipodi:docname="logo_dv.svg"
inkscape:version="1.2.2 (b0a8486541, 2022-12-01)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs79" />
<sodipodi:namedview
id="namedview77"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.51584915"
inkscape:cx="772.51266"
inkscape:cy="215.17919"
inkscape:window-width="1676"
inkscape:window-height="991"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="layer101" />
<g
id="layer101"
fill="#000000"
stroke="none">
<path
d="m 0,5023 c 0,-511 6,-596 46,-678 48,-97 149,-173 276,-206 67,-18 121,-19 820,-19 h 748 v 170 170 H 1125 360 v 75 75 h 765 765 v 170 170 H 1125 360 v 260 260 H 180 0 Z"
id="path56" />
<path
d="m 2235,5455 c -121,-34 -234,-125 -287,-233 -32,-64 -33,-72 -33,-182 0,-107 2,-119 29,-175 40,-81 129,-168 208,-204 104,-47 160,-51 792,-51 h 586 v -75 -75 h -775 -775 v -170 -170 l 808,2 807,3 55,28 c 92,48 167,133 215,247 18,42 19,80 23,558 l 3,512 -803,-1 c -644,-1 -813,-3 -853,-14 z m 1295,-415 v -80 h -625 -625 v 80 80 h 625 625 z"
id="path58" />
<path
d="m 4062,5298 3,-173 828,-3 827,-2 v -74 -75 l -687,-3 c -622,-3 -692,-5 -733,-21 -136,-52 -231,-132 -282,-235 -59,-120 -50,-271 23,-378 39,-58 113,-121 181,-155 119,-60 98,-59 970,-59 h 798 v 170 170 h -815 -815 v 75 75 h 663 c 532,0 672,3 712,14 164,45 284,153 330,294 26,80 18,219 -16,293 -51,108 -161,200 -287,239 -62,19 -94,20 -883,20 h -819 z"
id="path60" />
<path
d="m 6890,4965 v -505 h -390 -390 v -170 -170 h 1905 1905 v 170 170 h -390 -390 v 505 505 h -180 -180 v -505 -505 h -765 -765 v 505 505 h -180 -180 z"
id="path62" />
<path
d="m 10253,5446 c -142,-53 -260,-192 -292,-344 -7,-35 -11,-214 -11,-517 v -465 h 180 180 v 500 500 h 630 630 v -500 -500 h 180 181 l -3,518 -3,517 -27,57 c -49,104 -162,204 -272,241 -44,15 -119,17 -680,16 h -631 z"
id="path64" />
<path
d="m 12030,4795 v -676 l 823,3 822,3 56,23 c 140,56 217,146 246,287 19,93 9,166 -37,280 l -28,70 28,50 c 80,143 91,277 33,396 -53,106 -153,185 -282,221 -61,17 -121,18 -863,18 h -798 z m 1600,250 v -75 h -625 -625 v 75 75 h 625 625 z m -20,-510 v -75 h -615 -615 v 75 75 h 615 615 z"
id="path66" />
<path
d="m 14415,5453 c -105,-32 -212,-118 -271,-218 l -29,-50 v -385 -385 l 29,-59 c 16,-33 49,-79 73,-104 51,-51 164,-107 245,-122 36,-7 265,-10 645,-8 l 588,3 59,30 c 118,60 199,158 231,280 11,45 15,115 15,297 v 238 h -770 -770 v 75 75 h 770 770 v 175 175 l -767,-1 c -655,-1 -775,-3 -818,-16 z m 1225,-918 v -75 h -590 -590 v 75 75 h 590 590 z"
id="path68" />
<path
d="m 0,3830 v -40 h 204 205 l 6,-47 c 36,-255 170,-590 317,-788 281,-379 688,-639 1128,-719 309,-56 547,-46 844,36 344,95 681,312 891,573 22,28 43,52 46,55 39,35 203,314 237,405 70,188 122,381 122,454 v 31 l 1872,-2 1871,-3 10,-30 c 19,-59 137,-352 175,-436 l 40,-86 -92,-6 c -50,-4 -145,-11 -211,-17 -66,-5 -203,-16 -305,-25 -248,-20 -566,-53 -720,-74 -36,-5 -105,-14 -155,-20 -248,-31 -658,-105 -915,-167 -743,-176 -1323,-428 -1730,-751 -47,-37 -137,-119 -201,-183 -95,-94 -117,-122 -123,-153 -15,-80 26,-134 121,-161 76,-22 153,-27 543,-36 372,-9 438,-16 474,-51 19,-18 20,-41 24,-804 l 5,-785 h 93 94 l -2,844 -3,844 -24,26 c -79,84 -235,108 -799,122 l -284,7 44,41 c 217,205 475,373 808,524 93,42 238,102 285,117 22,8 87,30 145,50 130,46 381,118 520,150 263,60 529,113 705,140 55,9 127,20 160,25 33,6 98,15 145,20 47,6 119,15 160,20 68,9 204,23 475,50 55,6 183,17 285,25 102,8 244,19 315,25 72,6 201,17 288,24 86,7 159,15 161,17 3,2 -19,51 -48,109 -84,170 -256,572 -256,601 0,5 349,8 893,7 l 892,-3 3,-25 c 5,-50 34,-186 49,-235 190,-625 654,-1059 1298,-1214 22,-6 94,-17 160,-26 453,-58 913,66 1285,349 99,75 277,260 353,366 77,109 182,314 227,444 27,80 57,201 75,309 l 6,37 h 1003 1003 l 53,-107 c 47,-96 67,-138 127,-271 24,-53 50,-135 57,-179 7,-36 4,-45 -24,-77 -63,-71 -249,-175 -530,-294 -215,-92 -696,-260 -1015,-357 -346,-104 -387,-115 -625,-179 -681,-181 -1406,-333 -1980,-415 -41,-6 -104,-16 -140,-21 -36,-6 -114,-17 -175,-25 -60,-8 -144,-19 -185,-25 -74,-10 -270,-32 -445,-51 -211,-22 -643,-49 -800,-49 -177,0 -320,17 -371,43 -30,15 -225,154 -234,166 -3,4 -21,19 -41,34 -33,25 -43,27 -125,26 -49,0 -107,-3 -129,-7 l -40,-7 45,-50 c 51,-56 134,-135 176,-167 16,-12 31,-25 34,-29 10,-14 166,-107 222,-132 129,-59 285,-73 643,-57 369,16 755,52 1200,110 560,73 1221,187 1625,281 47,10 123,28 170,39 419,95 889,216 1200,306 666,195 1182,392 1435,549 199,123 309,219 320,279 17,87 -32,229 -184,534 -33,68 -61,126 -61,128 0,2 133,4 295,4 h 295 v 40 40 H 7995 0 Z m 3805,-87 c -20,-136 -94,-357 -162,-483 -89,-163 -158,-256 -287,-386 -116,-116 -169,-158 -286,-230 -282,-175 -536,-247 -865,-247 -184,1 -315,19 -470,66 -284,87 -547,255 -737,472 -174,199 -308,454 -363,690 -30,130 -35,154 -35,159 0,3 723,6 1606,6 h 1606 z m 9190,25 c -44,-203 -70,-285 -126,-406 -36,-79 -133,-242 -170,-287 -214,-259 -411,-406 -694,-514 -395,-151 -857,-126 -1240,66 -434,219 -758,655 -831,1121 l -7,42 h 1537 1536 z"
id="path70" />
<path
d="m 8040,2320 c -612,-31 -1114,-101 -1440,-202 -456,-141 -725,-281 -811,-424 -62.6204,-107.1874 55.1349,-206.2168 209,-52 118,127 421,262 737,328 59,12 251,49 315,60 120,21 413,57 585,71 315,25 420,30 753,36 193,3 352,8 352,12 0,3 -10,17 -23,31 -12,14 -38,45 -57,70 -19,25 -42,53 -50,62 -13,16 -35,18 -220,16 -113,-1 -270,-4 -350,-8 z"
id="path72"
sodipodi:nodetypes="ccccccccscsccc" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 6.0 KiB

BIN
assets/logo_dv_small.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.0 KiB

View File

@ -133,6 +133,9 @@ MxDb.Version=DB.6.0.70
NRST.Locked=true NRST.Locked=true
NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.EXTI3_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true\:true
NVIC.EXTI4_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true\:true
NVIC.EXTI9_5_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true\:true
NVIC.ForceEnableDMAVector=true NVIC.ForceEnableDMAVector=true
NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:false\:false
NVIC.LTDC_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true\:true NVIC.LTDC_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true\:true
@ -291,48 +294,58 @@ PE13.Signal=S_TIM1_CH3
PE2.Locked=true PE2.Locked=true
PE2.Mode=OCTOSPI1_IOL_Port1L PE2.Mode=OCTOSPI1_IOL_Port1L
PE2.Signal=OCTOSPIM_P1_IO2 PE2.Signal=OCTOSPIM_P1_IO2
PE3.GPIOParameters=GPIO_Label PE3.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI
PE3.GPIO_Label=ENC1A PE3.GPIO_Label=ENC1A
PE3.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING
PE3.Locked=true PE3.Locked=true
PE3.Signal=GPIO_Input PE3.Signal=GPXTI3
PE4.GPIOParameters=GPIO_Label PE4.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI
PE4.GPIO_Label=ENC1B PE4.GPIO_Label=ENC1B
PE4.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING
PE4.Locked=true PE4.Locked=true
PE4.Signal=GPIO_Input PE4.Signal=GPXTI4
PE5.GPIOParameters=GPIO_Label PE5.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI
PE5.GPIO_Label=ENC2A PE5.GPIO_Label=ENC2A
PE5.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING
PE5.Locked=true PE5.Locked=true
PE5.Signal=GPIO_Input PE5.Signal=GPXTI5
PE6.GPIOParameters=GPIO_Label PE6.GPIOParameters=GPIO_Label,GPIO_ModeDefaultEXTI
PE6.GPIO_Label=ENC2B PE6.GPIO_Label=ENC2B
PE6.GPIO_ModeDefaultEXTI=GPIO_MODE_IT_RISING_FALLING
PE6.Locked=true PE6.Locked=true
PE6.Signal=GPIO_Input PE6.Signal=GPXTI6
PE9.GPIOParameters=GPIO_Label PE9.GPIOParameters=GPIO_Label
PE9.GPIO_Label=PWM_R PE9.GPIO_Label=PWM_R
PE9.Locked=true PE9.Locked=true
PE9.Signal=S_TIM1_CH1 PE9.Signal=S_TIM1_CH1
PF0.GPIOParameters=GPIO_Label PF0.GPIOParameters=GPIO_PuPd,GPIO_Label
PF0.GPIO_Label=BTN1 PF0.GPIO_Label=BTN1
PF0.GPIO_PuPd=GPIO_NOPULL
PF0.Locked=true PF0.Locked=true
PF0.Signal=GPIO_Input PF0.Signal=GPIO_Input
PF1.GPIOParameters=GPIO_Label PF1.GPIOParameters=GPIO_PuPd,GPIO_Label
PF1.GPIO_Label=BTN2 PF1.GPIO_Label=BTN2
PF1.GPIO_PuPd=GPIO_NOPULL
PF1.Locked=true PF1.Locked=true
PF1.Signal=GPIO_Input PF1.Signal=GPIO_Input
PF2.GPIOParameters=GPIO_Label PF2.GPIOParameters=GPIO_PuPd,GPIO_Label
PF2.GPIO_Label=BTN3 PF2.GPIO_Label=BTN3
PF2.GPIO_PuPd=GPIO_NOPULL
PF2.Locked=true PF2.Locked=true
PF2.Signal=GPIO_Input PF2.Signal=GPIO_Input
PF3.GPIOParameters=GPIO_Label PF3.GPIOParameters=GPIO_PuPd,GPIO_Label
PF3.GPIO_Label=BTN4 PF3.GPIO_Label=BTN4
PF3.GPIO_PuPd=GPIO_NOPULL
PF3.Locked=true PF3.Locked=true
PF3.Signal=GPIO_Input PF3.Signal=GPIO_Input
PF4.GPIOParameters=GPIO_Label PF4.GPIOParameters=GPIO_PuPd,GPIO_Label
PF4.GPIO_Label=BTN5 PF4.GPIO_Label=BTN5
PF4.GPIO_PuPd=GPIO_NOPULL
PF4.Locked=true PF4.Locked=true
PF4.Signal=GPIO_Input PF4.Signal=GPIO_Input
PF5.GPIOParameters=GPIO_Label PF5.GPIOParameters=GPIO_PuPd,GPIO_Label
PF5.GPIO_Label=BTN6 PF5.GPIO_Label=BTN6
PF5.GPIO_PuPd=GPIO_NOPULL
PF5.Locked=true PF5.Locked=true
PF5.Signal=GPIO_Input PF5.Signal=GPIO_Input
PF6.Locked=true PF6.Locked=true
@ -393,7 +406,7 @@ ProjectManager.StackSize=0x400
ProjectManager.TargetToolchain=Makefile ProjectManager.TargetToolchain=Makefile
ProjectManager.ToolChainLocation= ProjectManager.ToolChainLocation=
ProjectManager.UnderRoot=false ProjectManager.UnderRoot=false
ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA2D_Init-DMA2D-false-HAL-true,4-MX_FDCAN1_Init-FDCAN1-false-HAL-true,5-MX_LTDC_Init-LTDC-false-HAL-true,6-MX_JPEG_Init-JPEG-false-HAL-true,7-MX_OCTOSPI1_Init-OCTOSPI1-false-HAL-true,8-MX_SPI3_Init-SPI3-false-HAL-true,9-MX_TIM1_Init-TIM1-false-HAL-true,10-MX_TIM2_Init-TIM2-false-HAL-true,11-MX_TIM4_Init-TIM4-false-HAL-true,12-MX_CRC_Init-CRC-false-HAL-true,13-MX_TouchGFX_Init-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.2-false-HAL-false,14-MX_TouchGFX_Process-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.2-false-HAL-false,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true ProjectManager.functionlistsort=1-SystemClock_Config-RCC-false-HAL-false,2-MX_GPIO_Init-GPIO-false-HAL-true,3-MX_DMA2D_Init-DMA2D-false-HAL-true,4-MX_FDCAN1_Init-FDCAN1-false-HAL-true,5-MX_LTDC_Init-LTDC-false-HAL-true,6-MX_JPEG_Init-JPEG-false-HAL-true,7-MX_OCTOSPI1_Init-OCTOSPI1-false-HAL-true,8-MX_SPI3_Init-SPI3-false-HAL-true,9-MX_TIM1_Init-TIM1-false-HAL-true,10-MX_TIM2_Init-TIM2-false-HAL-true,11-MX_TIM4_Init-TIM4-false-HAL-true,12-MX_CRC_Init-CRC-false-HAL-true,14-MX_TouchGFX_Init-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.2-false-HAL-false,15-MX_TouchGFX_Process-STMicroelectronics.X-CUBE-TOUCHGFX.4.21.2-false-HAL-false,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true
RCC.ADCFreq_Value=129000000 RCC.ADCFreq_Value=129000000
RCC.AHB12Freq_Value=64000000 RCC.AHB12Freq_Value=64000000
RCC.AHB4Freq_Value=64000000 RCC.AHB4Freq_Value=64000000
@ -477,6 +490,14 @@ RCC.VCO3OutputFreq_Value=128000000
RCC.VCOInput1Freq_Value=16000000 RCC.VCOInput1Freq_Value=16000000
RCC.VCOInput2Freq_Value=2000000 RCC.VCOInput2Freq_Value=2000000
RCC.VCOInput3Freq_Value=16000000 RCC.VCOInput3Freq_Value=16000000
SH.GPXTI3.0=GPIO_EXTI3
SH.GPXTI3.ConfNb=1
SH.GPXTI4.0=GPIO_EXTI4
SH.GPXTI4.ConfNb=1
SH.GPXTI5.0=GPIO_EXTI5
SH.GPXTI5.ConfNb=1
SH.GPXTI6.0=GPIO_EXTI6
SH.GPXTI6.ConfNb=1
SH.S_TIM1_CH1.0=TIM1_CH1,PWM Generation1 CH1 SH.S_TIM1_CH1.0=TIM1_CH1,PWM Generation1 CH1
SH.S_TIM1_CH1.ConfNb=1 SH.S_TIM1_CH1.ConfNb=1
SH.S_TIM1_CH2.0=TIM1_CH2,PWM Generation2 CH2 SH.S_TIM1_CH2.0=TIM1_CH2,PWM Generation2 CH2