?? hmi.c
字號:
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_RECT_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_Rect));
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->color = color;
HMI_Draw_Para->startX = startX;
HMI_Draw_Para->startY = startY;
HMI_Draw_Para->endX = endX;
HMI_Draw_Para->endY = endY;
foundQueueSlot_CMD->HMI_Func_Para = HMI_CMD_Para;
foundQueueSlot_Data->HMI_Func_Para = HMI_Draw_Para;
return SUCCESS;
}
WorkingStatus HMI_Draw_Char_Data(void *HMI_Draw_Para)
{
uint8_t tempRowRemain_Start, tempStartRowIndex, tempRowNUM, temp_i;
uint8_t tempRow[ASCII5X8_CHAR_WIDTH];
// Robust Check, make sure no out border
if (((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + ASCII5X8_CHAR_WIDTH >= HMI_WIDTH_PIX)
{
((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX = 0;
}
if (((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startY + ASCII5X8_CHAR_HEIGHT >= HMI_HEIGHT_PIX)
{
((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startY = 0;
}
GPIO_SetBits(LCD_DC_PORT, LCD_DC_PIN); // Pull up D/_C to enter data mode
tempRowRemain_Start = ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startY % HMI_ROW_WIDTH;
tempStartRowIndex = ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startY / HMI_ROW_WIDTH;
if (0 == tempRowRemain_Start)
{
for (temp_i = 0; temp_i < ASCII5X8_CHAR_WIDTH; temp_i++)
{
if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->color)
{
sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i] =
~ASCII5x8Dot[*(((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->ASCIIChar) - ASCII5X8_CHAR_BIAS][temp_i];
}
else
{
sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i] =
ASCII5x8Dot[*(((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->ASCIIChar) - ASCII5X8_CHAR_BIAS][temp_i];
}
}
}
else
{
for (temp_i = 0; temp_i < ASCII5X8_CHAR_WIDTH; temp_i++)
{ // First Row
if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->color)
{
tempRow[temp_i] = GRAM_ByteAnd_Start(&(sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i]), 0,
~ASCII5x8Dot[*(((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->ASCIIChar) - ASCII5X8_CHAR_BIAS][temp_i], tempRowRemain_Start);
}
else
{
tempRow[temp_i] = GRAM_ByteOr_Start(&(sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i]), 0,
ASCII5x8Dot[*(((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->ASCIIChar) - ASCII5X8_CHAR_BIAS][temp_i], tempRowRemain_Start);
}
}
for (temp_i = 0; temp_i < ASCII5X8_CHAR_WIDTH; temp_i++)
{ // Second Row
if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->color)
{
GRAM_ByteAnd_End(&(sta_LCD_Graphic_BUF[tempStartRowIndex + 1][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i]), tempRow[temp_i],
0xFF, tempRowRemain_Start);
}
else
{
GRAM_ByteOr_End(&(sta_LCD_Graphic_BUF[tempStartRowIndex + 1][((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX + temp_i]), tempRow[temp_i],
0, tempRowRemain_Start);
}
}
}
tempRowNUM = (0 == tempRowRemain_Start ? 1 : 2);
HMI_Data_TX(sta_LCD_Graphic_BUF[tempStartRowIndex] + ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX,
(tempRowNUM - 1) * HMI_WIDTH_PIX + ASCII5X8_CHAR_WIDTH);
return FINISHED;
}
ErrorStatus HMI_Draw_Char(uint8_t startX, uint8_t startY, char ASCIIChar, HMIDrawColor color)
{
struct_HMI_Queue *foundQueueSlot_CMD = NULL;
struct_HMI_Queue *foundQueueSlot_Data = NULL;
struct_HMI_Draw_Para_Char *HMI_Draw_Para = NULL;
struct_HMI_CMD_Para *HMI_CMD_Para = NULL;
uint8_t *HMI_CMD_Stream = NULL;
char *HMI_Draw_Para_Char = 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_CHAR_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_Char));
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;
}
HMI_Draw_Para_Char = malloc(sizeof(char));
if (NULL == HMI_Draw_Para_Char)
{
foundQueueSlot_CMD->HMI_Function_Index = ENUM_HMI_NULL;
foundQueueSlot_Data->HMI_Function_Index = ENUM_HMI_NULL;
free(HMI_CMD_Stream);
free(HMI_CMD_Para);
free(HMI_Draw_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_Char = ASCIIChar;
HMI_Draw_Para->color = color;
HMI_Draw_Para->startX = startX;
HMI_Draw_Para->startY = startY;
HMI_Draw_Para->ASCIIChar = HMI_Draw_Para_Char;
foundQueueSlot_CMD->HMI_Func_Para = HMI_CMD_Para;
foundQueueSlot_Data->HMI_Func_Para = HMI_Draw_Para;
return SUCCESS;
}
WorkingStatus HMI_Draw_String_Data(void *HMI_Draw_Para)
{
uint8_t tempRowRemain_Start, tempStartRowIndex, tempRowNUM, temp_i, tempStringWidth;
uint8_t tempRow[HMI_WIDTH_PIX];
// Robust Check, make sure no out border
tempStringWidth = ASCII5X8_CHAR_WIDTH * strlen(((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->ASCIIString);
tempStringWidth = tempStringWidth > HMI_WIDTH_PIX ? HMI_WIDTH_PIX : tempStringWidth;
if (((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + tempStringWidth >= HMI_WIDTH_PIX)
{
((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX = 0;
}
if (((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startY + ASCII5X8_CHAR_HEIGHT >= HMI_HEIGHT_PIX)
{
((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startY = 0;
}
GPIO_SetBits(LCD_DC_PORT, LCD_DC_PIN); // Pull up D/_C to enter data mode
tempRowRemain_Start = ((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startY % HMI_ROW_WIDTH;
tempStartRowIndex = ((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startY / HMI_ROW_WIDTH;
if (0 == tempRowRemain_Start)
{
for (temp_i = 0; temp_i < tempStringWidth; temp_i++)
{
if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->color)
{
sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i] =
~ASCII5x8Dot[*(((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->ASCIIString + temp_i / ASCII5X8_CHAR_WIDTH) - ASCII5X8_CHAR_BIAS][temp_i % ASCII5X8_CHAR_WIDTH];
}
else
{
sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i] =
ASCII5x8Dot[*(((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->ASCIIString + temp_i / ASCII5X8_CHAR_WIDTH) - ASCII5X8_CHAR_BIAS][temp_i % ASCII5X8_CHAR_WIDTH];
}
}
}
else
{
for (temp_i = 0; temp_i < tempStringWidth; temp_i++)
{ // First Row
if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->color)
{
tempRow[temp_i] = GRAM_ByteAnd_Start(&(sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i]), 0,
~ASCII5x8Dot[*(((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->ASCIIString + temp_i / ASCII5X8_CHAR_WIDTH) - ASCII5X8_CHAR_BIAS][temp_i % ASCII5X8_CHAR_WIDTH],
tempRowRemain_Start);
}
else
{
tempRow[temp_i] = GRAM_ByteOr_Start(&(sta_LCD_Graphic_BUF[tempStartRowIndex][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i]), 0,
ASCII5x8Dot[*(((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->ASCIIString + temp_i / ASCII5X8_CHAR_WIDTH) - ASCII5X8_CHAR_BIAS][temp_i % ASCII5X8_CHAR_WIDTH],
tempRowRemain_Start);
}
}
for (temp_i = 0; temp_i < tempStringWidth; temp_i++)
{ // Second Row
if (HMI_COLOR_WHITE == ((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->color)
{
GRAM_ByteAnd_End(&(sta_LCD_Graphic_BUF[tempStartRowIndex + 1][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i]), tempRow[temp_i],
0xFF, tempRowRemain_Start);
}
else
{
GRAM_ByteOr_End(&(sta_LCD_Graphic_BUF[tempStartRowIndex + 1][((struct_HMI_Draw_Para_String *)HMI_Draw_Para)->startX + temp_i]), tempRow[temp_i],
0, tempRowRemain_Start);
}
}
}
tempRowNUM = (0 == tempRowRemain_Start ? 1 : 2);
HMI_Data_TX(sta_LCD_Graphic_BUF[tempStartRowIndex] + ((struct_HMI_Draw_Para_Char *)HMI_Draw_Para)->startX,
(tempRowNUM - 1) * HMI_WIDTH_PIX + tempStringWidth);
return FINISHED;
}
ErrorStatus HMI_Draw_String(uint8_t startX, uint8_t startY, char *ASCIIString, HMIDrawColor color)
{
struct_HMI_Queue *foundQueueSlot_CMD = NULL;
struct_HMI_Queue *foundQueueSlot_Data = NULL;
struct_HMI_Draw_Para_String *HMI_Draw_Para = NULL;
struct_HMI_CMD_Para *HMI_CMD_Para = NULL;
uint8_t *HMI_CMD_Stream = NULL;
char *HMI_Draw_Para_String = 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_STRING_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;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -