feat: refine remote states and PRTS LCD refresh

- add remote NOT_READY/READY/PROTECT state flow and matching LED/status display

- speed up TFT hardware SPI DMA flush path and larger LVGL partial refresh buffer

- reduce page/menu redraw artifacts and center the PRTS status title
This commit is contained in:
TuxMonkey
2026-07-21 00:40:01 +08:00
parent 8671f84139
commit dc57b5152e
10 changed files with 230 additions and 67 deletions

View File

@@ -102,6 +102,49 @@ static uint8_t SBusEndByteIsValid(uint8_t value)
return value == SBUS_END || value == 0x04u || value == 0x14u || value == 0x24u || value == 0x34u;
}
static uint8_t RemoteControlAllSwitchesDown(const RC_ctrl_t *rc)
{
return rc != NULL && switch_is_down(rc->sw_a) && switch_is_down(rc->sw_b) && switch_is_down(rc->sw_c) &&
switch_is_down(rc->sw_d);
}
static void RemoteControlSetMode(RobotMode_t mode)
{
if (RobotMode != SYS_ERROR_OCCURRED)
RobotMode = mode;
}
static void RemoteControlUpdateMode(const RC_ctrl_t *rc)
{
if (rc == NULL || RobotMode == SYS_ERROR_OCCURRED)
return;
switch (RobotMode)
{
case REMOTE_NOT_CONNECTED:
RemoteControlSetMode(REMOTE_NOT_READY);
break;
case REMOTE_NOT_READY:
if (RemoteControlAllSwitchesDown(rc))
RemoteControlSetMode(REMOTE_READY);
break;
case REMOTE_READY:
if (switch_is_up(rc->sw_d))
RemoteControlSetMode(NORMAL_MODE);
break;
case NORMAL_MODE:
if (switch_is_down(rc->sw_d))
RemoteControlSetMode(REMOTE_PROTECT);
break;
case REMOTE_PROTECT:
if (switch_is_up(rc->sw_d))
RemoteControlSetMode(NORMAL_MODE);
break;
default:
break;
}
}
#ifdef REMOTE_DJI_DT7
/**
@@ -364,8 +407,7 @@ static void RemoteControlPublishOffline(uint8_t force)
{
rc_data_valid = 0;
memset(rc_ctrl, 0, sizeof(rc_ctrl));
if (RobotMode != SYS_ERROR_OCCURRED)
RobotMode = REMOTE_NOT_CONNECTED;
RemoteControlSetMode(REMOTE_NOT_CONNECTED);
}
__set_PRIMASK(primask);
@@ -396,8 +438,7 @@ static void RemoteControlRxCallback(USART_Instance *instance, const uint8_t *rec
rc_valid_frame_count++;
rc_data_valid = 1;
DaemonReload(rc_daemon_instance);
if (RobotMode == REMOTE_NOT_CONNECTED)
RobotMode = REMOTE_CONNECTED;
RemoteControlUpdateMode(&rc_ctrl[TEMP]);
}
/**

View File

@@ -28,6 +28,9 @@ typedef enum
static bool tft_initialized = false;
static bool tft_transfer_ok = true;
static volatile bool tft_dma_active = false;
static TFT_TransferDoneCallback tft_dma_callback = NULL;
static void *tft_dma_context = NULL;
static const uint8_t tft_font5x7[][TFT_FONT_H] = {
{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, /* space */
@@ -107,6 +110,31 @@ static void tft_backlight_on(void)
HAL_GPIO_WritePin(TFT_BLK_GPIO_Port, TFT_BLK_Pin, GPIO_PIN_SET);
}
static void tft_dma_finish(bool ok)
{
TFT_TransferDoneCallback callback = tft_dma_callback;
void *context = tft_dma_context;
if (!tft_dma_active)
{
return;
}
tft_dma_active = false;
tft_dma_callback = NULL;
tft_dma_context = NULL;
if (!ok)
{
tft_transfer_ok = false;
}
tft_cs_high();
if (callback != NULL)
{
callback(context, ok);
}
}
static void tft_bus_init(void)
{
#if TFT_USE_SOFT_SPI
@@ -278,6 +306,51 @@ void TFT_WriteColorData(const uint8_t *data, uint32_t len)
tft_cs_high();
}
bool TFT_WriteColorDataDMA(const uint8_t *data,
uint32_t len,
TFT_TransferDoneCallback callback,
void *context)
{
if (data == NULL || len == 0U || len > UINT16_MAX || tft_dma_active || TFT_SPI_UNIT.hdmatx == NULL)
{
return false;
}
tft_cs_low();
tft_dc_data();
tft_dma_callback = callback;
tft_dma_context = context;
tft_dma_active = true;
if (HAL_SPI_Transmit_DMA(&TFT_SPI_UNIT, (uint8_t *) data, (uint16_t) len) != HAL_OK)
{
tft_dma_active = false;
tft_dma_callback = NULL;
tft_dma_context = NULL;
tft_transfer_ok = false;
tft_cs_high();
return false;
}
return true;
}
void HAL_SPI_TxCpltCallback(SPI_HandleTypeDef *hspi)
{
if (hspi == &TFT_SPI_UNIT)
{
tft_dma_finish(true);
}
}
void HAL_SPI_ErrorCallback(SPI_HandleTypeDef *hspi)
{
if (hspi == &TFT_SPI_UNIT)
{
tft_dma_finish(false);
}
}
bool TFT_IsReady(void)
{
return tft_initialized && tft_transfer_ok;
@@ -599,8 +672,12 @@ const char *TFT_RobotModeText(RobotMode_t mode)
return "ERROR";
case REMOTE_NOT_CONNECTED:
return "REMOTE OFF";
case REMOTE_CONNECTED:
return "REMOTE ON";
case REMOTE_NOT_READY:
return "NOT READY";
case REMOTE_READY:
return "READY";
case REMOTE_PROTECT:
return "PROTECT";
case AUTO_SHOOTING_MODE:
return "AUTO SHOOT";
case IMU_CALIBERATION_MODE:
@@ -619,7 +696,11 @@ static uint16_t tft_mode_color(RobotMode_t mode)
case SYS_ERROR_OCCURRED:
case REMOTE_NOT_CONNECTED:
return TFT_COLOR_RED;
case REMOTE_CONNECTED:
case REMOTE_NOT_READY:
return TFT_COLOR_WHITE;
case REMOTE_READY:
return TFT_COLOR_MAGENTA;
case REMOTE_PROTECT:
return TFT_COLOR_YELLOW;
case AUTO_SHOOTING_MODE:
return TFT_COLOR_CYAN;

View File

@@ -11,6 +11,8 @@
extern "C" {
#endif
typedef void (*TFT_TransferDoneCallback)(void *context, bool ok);
#define TFT_USE_HORIZONTAL 2U
#define TFT_USE_SOFT_SPI 0U
#define TFT_HW_SPI_BYTE_MODE 0U
@@ -91,6 +93,10 @@ void TFT_DrawString(uint16_t x, uint16_t y, const char *text, uint16_t fc, uint1
void TFT_ShowStatus(float temperature_c, RobotMode_t mode);
bool TFT_IsReady(void);
void TFT_WriteColorData(const uint8_t *data, uint32_t len);
bool TFT_WriteColorDataDMA(const uint8_t *data,
uint32_t len,
TFT_TransferDoneCallback callback,
void *context);
const char *TFT_RobotModeText(RobotMode_t mode);
void LCD_Init(void);