?? hmi.c
字號:
temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
{
sta_LCD_Graphic_BUF[temp_i][temp_n] = ((sta_LCD_Graphic_BUF[temp_i][temp_n] >> tempRowRemain_End) << tempRowRemain_End) |
((sta_LCD_Graphic_BUF[temp_i][temp_n - 1] << (HMI_ROW_WIDTH - tempRowRemain_End)) >> (HMI_ROW_WIDTH - tempRowRemain_End));
}
}
sta_LCD_Graphic_BUF[temp_i][temp_n] = (sta_LCD_Graphic_BUF[temp_i][temp_n] >> tempRowRemain_End) << tempRowRemain_End;
}
else
{
if (IMAGE_SHIFT_LEFT == ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->direction)
{
memcpy((sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX),
(sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX + 1),
temp_width - 1);
}
else
{
for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX;
temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
{
sta_LCD_Graphic_BUF[temp_i][temp_n] = sta_LCD_Graphic_BUF[temp_i][temp_n - 1];
}
}
sta_LCD_Graphic_BUF[temp_i][temp_n] = 0;
}
}
else
{ // In this way, every row need to manipulate
// First Row
temp_i = tempStartRowIndex;
if (IMAGE_SHIFT_LEFT == ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->direction)
{
for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX;
temp_n < ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX; temp_n++)
{
sta_LCD_Graphic_BUF[temp_i][temp_n] = ((sta_LCD_Graphic_BUF[temp_i][temp_n] << (HMI_ROW_WIDTH - tempRowRemain_Start)) >> (HMI_ROW_WIDTH - tempRowRemain_Start)) |
((sta_LCD_Graphic_BUF[temp_i][temp_n + 1] >> tempRowRemain_Start) << tempRowRemain_Start);
}
}
else
{
for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX;
temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
{
sta_LCD_Graphic_BUF[temp_i][temp_n] = ((sta_LCD_Graphic_BUF[temp_i][temp_n] << (HMI_ROW_WIDTH - tempRowRemain_Start)) >> (HMI_ROW_WIDTH - tempRowRemain_Start)) |
((sta_LCD_Graphic_BUF[temp_i][temp_n - 1] >> tempRowRemain_Start) << tempRowRemain_Start);
}
}
sta_LCD_Graphic_BUF[temp_i][temp_n] = (sta_LCD_Graphic_BUF[temp_i][temp_n] << (HMI_ROW_WIDTH - tempRowRemain_Start)) >> (HMI_ROW_WIDTH - tempRowRemain_Start);
// Middle rows, if it has
if (tempRowNUM > 2)
{
for (temp_i = tempStartRowIndex + 1; temp_i < tempLastRowIndex; temp_i++)
{
if (IMAGE_SHIFT_LEFT == ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->direction)
{
memcpy((sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX),
(sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX + 1),
temp_width - 1);
}
else
{
for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX;
temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
{
sta_LCD_Graphic_BUF[temp_i][temp_n] = sta_LCD_Graphic_BUF[temp_i][temp_n - 1];
}
}
sta_LCD_Graphic_BUF[temp_i][temp_n] = 0;
}
}
// Last Row, if it has
if (0 != tempRowRemain_End)
{
if (IMAGE_SHIFT_LEFT == ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->direction)
{
for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX;
temp_n < ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX; temp_n++)
{
sta_LCD_Graphic_BUF[temp_i][temp_n] = ((sta_LCD_Graphic_BUF[temp_i][temp_n] >> tempRowRemain_End) << tempRowRemain_End) |
((sta_LCD_Graphic_BUF[temp_i][temp_n + 1] << (HMI_ROW_WIDTH - tempRowRemain_End)) >> (HMI_ROW_WIDTH - tempRowRemain_End));
}
}
else
{
for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX;
temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
{
sta_LCD_Graphic_BUF[temp_i][temp_n] = ((sta_LCD_Graphic_BUF[temp_i][temp_n] >> tempRowRemain_End) << tempRowRemain_End) |
((sta_LCD_Graphic_BUF[temp_i][temp_n - 1] << (HMI_ROW_WIDTH - tempRowRemain_End)) >> (HMI_ROW_WIDTH - tempRowRemain_End));
}
}
sta_LCD_Graphic_BUF[temp_i][temp_n] = (sta_LCD_Graphic_BUF[temp_i][temp_n] >> tempRowRemain_End) << tempRowRemain_End;
}
else
{
if (IMAGE_SHIFT_LEFT == ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->direction)
{
memcpy((sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX),
(sta_LCD_Graphic_BUF[temp_i] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX + 1),
temp_width - 1);
}
else
{
for (temp_n = ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->endX;
temp_n > ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX; temp_n--)
{
sta_LCD_Graphic_BUF[temp_i][temp_n] = sta_LCD_Graphic_BUF[temp_i][temp_n - 1];
}
}
sta_LCD_Graphic_BUF[temp_i][temp_n] = 0;
}
}
HMI_Data_TX(sta_LCD_Graphic_BUF[tempStartRowIndex] + ((struct_HMI_Draw_Para_Image_Shift *)HMI_Draw_Para)->startX,
(tempRowNUM - 1) * HMI_WIDTH_PIX + temp_width);
return FINISHED;
}
ErrorStatus HMI_Draw_Image_Shift(uint8_t startX, uint8_t startY, uint8_t endX, uint8_t endY, ImageShiftDirect direction)
{
struct_HMI_Queue *foundQueueSlot_CMD = NULL;
struct_HMI_Queue *foundQueueSlot_Data = NULL;
struct_HMI_Draw_Para_Image_Shift *HMI_Draw_Para = NULL;
struct_HMI_CMD_Para *HMI_CMD_Para = NULL;
uint8_t *HMI_CMD_Stream = NULL;
// Prepare to get all necessary space
foundQueueSlot_CMD = HMI_Find_Queue_Slot(HMI_TASK_TYPE_BUS);
if ((foundQueueSlot_CMD != NULL))
{
foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_CMD_STREAM;
}
else
{
FLAG_HMI_QUEUE_FULL = SET;
return ERROR;
}
foundQueueSlot_Data = HMI_Find_Queue_Slot(HMI_TASK_TYPE_BUS);
if (foundQueueSlot_Data != NULL)
{
foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_DRAW_IMAGE_SHIFT_DATA;
}
else
{
foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
FLAG_HMI_QUEUE_FULL = SET;
return ERROR;
}
// To here queue slots are available and occupied
HMI_CMD_Stream = malloc(HMI_LOCATE_CMD_STREAM_SIZE);
if (NULL == HMI_CMD_Stream)
{
foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
FLAG_HEAP_FULL = SET;
return ERROR;
}
HMI_CMD_Para = malloc(sizeof(struct_HMI_CMD_Para));
if (NULL == HMI_CMD_Para)
{
foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
free(HMI_CMD_Stream);
FLAG_HEAP_FULL = SET;
return ERROR;
}
HMI_Draw_Para = malloc(sizeof(struct_HMI_Draw_Para_Image_Shift));
if (NULL == HMI_Draw_Para)
{
foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
free(HMI_CMD_Stream);
free(HMI_CMD_Para);
FLAG_HEAP_FULL = SET;
return ERROR;
}
// All conditions are OK, we can start to work
*HMI_CMD_Stream = startX | X_COORDINATE_MASK;
*(HMI_CMD_Stream + 1)= (startY / HMI_ROW_WIDTH) | Y_COORDINATE_MASK;
HMI_CMD_Para->DataLen = HMI_LOCATE_CMD_STREAM_SIZE;
HMI_CMD_Para->DataList = HMI_CMD_Stream;
HMI_Draw_Para->endX = endX;
HMI_Draw_Para->endY = endY;
HMI_Draw_Para->startX = startX;
HMI_Draw_Para->startY = startY;
HMI_Draw_Para->direction = direction;
foundQueueSlot_CMD->HMI_Func_Para = HMI_CMD_Para;
foundQueueSlot_Data->HMI_Func_Para = HMI_Draw_Para;
return SUCCESS;
}
ErrorStatus HMI_Display_Blank(void)
{
struct_HMI_Queue *foundQueueSlot;
// Fill in the HMI to do list queue with configuration task
foundQueueSlot = HMI_Find_Queue_Slot(HMI_TASK_TYPE_BUS);
if (foundQueueSlot != NULL)
{
// sta_QueueIndex = foundQueueSlot - gHMI_Queue; // sta_QueueIndex should start at gHMI_Queue (0), but ...
foundQueueSlot->HMI_Func_Para = malloc(sizeof(struct_HMI_CMD_Para));
if (NULL != foundQueueSlot->HMI_Func_Para)
{
foundQueueSlot->HMI_Function_Index = ENUM_HMI_CMD_STREAM;
((struct_HMI_CMD_Para *)(foundQueueSlot->HMI_Func_Para))->DataList = (uint8_t *)const_HMI_Display_Blank;
((struct_HMI_CMD_Para *)(foundQueueSlot->HMI_Func_Para))->DataLen = sizeof(const_HMI_Display_Blank); //HMI_STARTUP_CONFIG_LEN;
}
else
{
foundQueueSlot->HMI_Function_Index = ENUM_HMI_NULL;
FLAG_HEAP_FULL = SET;
return ERROR;
}
}
else
{
FLAG_HMI_QUEUE_FULL = SET;
return ERROR;
}
return SUCCESS;
}
ErrorStatus HMI_StartUp_Logo(void)
{
// And finally a logo task
return HMI_Draw_Pic(HMI_STARTUP_LOGO_ID, 0, 0, HMI_WIDTH_PIX, HMI_HEIGHT_PIX);
}
ErrorStatus newBLBlink(uint16_t blinkInterval, uint16_t blinkNumber)
{
struct_HMI_Queue *foundQueueSlot;
// Add back light blink test task
foundQueueSlot = HMI_Find_Queue_Slot(HMI_TASK_TYPE_NO_BUS);
if (NULL == foundQueueSlot)
{
return ERROR;
}
foundQueueSlot->HMI_Func_Para = malloc(sizeof(struct_HMI_BL_Test));
if (NULL != foundQueueSlot->HMI_Func_Para)
{
foundQueueSlot->HMI_Function_Index = ENUM_BL_BLINK;
((struct_HMI_BL_Test *)(foundQueueSlot->HMI_Func_Para))->Interval = blinkInterval;
((struct_HMI_BL_Test *)(foundQueueSlot->HMI_Func_Para))->Number = blinkNumber;
HMI_BL_Test_Stage = 0;
}
else
{
FLAG_HEAP_FULL = SET;
return ERROR;
}
return SUCCESS;
}
ErrorStatus HMI_StartUp_BL_Test(void)
{
return newBLBlink(MAX_BL_TEST_BLINK_INTER, MAX_BL_TEST_BLINK_NUM);
}
WorkingStatus HMI_BL_Blink(void *HMI_Draw_Para)
{
static uint32_t sta_LastTime;
if (0 == HMI_BL_Test_Stage)
{
sta_LastTime = gSystem_1ms_CNT;
LCD_BACKLIGHT_ON;
HMI_BL_Test_Stage++;
}
else
{
if (((uint32_t)(gSystem_1ms_CNT - sta_LastTime)) > (((struct_HMI_BL_Test *)HMI_Draw_Para)->Interval))
{
sta_LastTime = gSystem_1ms_CNT;
if (LSB_MASK & HMI_BL_Test_Stage)
{
LCD_BACKLIGHT_OFF;
}
else
{
LCD_BACKLIGHT_ON;
}
HMI_BL_Test_Stage++;
}
}
if (HMI_BL_Test_Stage > (((struct_HMI_BL_Test *)HMI_Draw_Para)->Number))
{
LCD_BACKLIGHT_OFF;
return FINISHED;
}
else
{
return WORKING;
}
}
ErrorStatus HMI_Set_Color_Type(char *const_HMI_Color_Type_CMD)
{
struct_HMI_Queue *foundQueueSlot;
foundQueueSlot = HMI_Find_Queue_Slot(HMI_TASK_TYPE_BUS);
if (NULL == foundQueueSlot)
{
return ERROR;
}
foundQueueSlot->HMI_Func_Para = malloc(sizeof(struct_HMI_CMD_Para));
if (NULL != foundQueueSlot->HMI_Func_Para)
{
foundQueueSlot->HMI_Function_Index = ENUM_HMI_CMD_STREAM;
((struct_HMI_CMD_Para *)(foundQueueSlot->HMI_Func_Para))->DataList = (uint8_t *)const_HMI_Color_Type_CMD;
((struct_HMI_CMD_Para *)(foundQueueSlot->HMI_Func_Para))->DataLen = strlen(const_HMI_Color_Type_CMD); //HMI_STARTUP_CONFIG_LEN;
}
else
{
foundQueueSlot->HMI_Function_Index = ENUM_HMI_NULL;
FLAG_HEAP_FULL = SET;
return ERROR;
}
return SUCCESS;
}
// The one end with ex will NOT clear GRAM in STM32
// One task
void ClearScreen(HMIDrawColor style)
{
memset(sta_LCD_Graphic_BUF[0], (style == HMI_COLOR_WHITE ? NULL : 0xFF), MAX_DISPLAY_BUF);
HMI_Display_Blank();
}
void HMI_Initial(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
uint8_t temp_QueueIndex;
// Pull up RST Pin
GPIO_SetBits(LCD_RST_PORT, LCD_RST_PIN);
// Empty the HMI to do list queue
sta_QueueIndex = 0;
sta_QueueIndex_NoBus = 0;
Flag_HMI_General_G01 = 0;
FLAG_HMI_QUE
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -