/** * @brief Show dialogue * @param titleString: A string which being shown as title of the dialogue subString0: First line of the passage subString1: Second Line of the passage */ void ShowDialogue(const char titleString[], const char subString0[], const char subString1[], bool titleCentered, bool stringCentered) { u8 titleAddr, subString0Addr, subString1Addr; xSemaphoreTake(OLEDRelatedMutex, portMAX_DELAY); OLED_DrawRect(0, 0, 127, 63, DRAW); OLED_DrawHorizonalLine(13, 0, 127, 1); if (titleCentered == true) { titleAddr = 63 - GetStringGraphicalLength(titleString) * 3; OLED_ShowAnyString(titleAddr, 1, titleString, NotOnSelect, 12); } else OLED_ShowAnyString(3, 1, titleString, NotOnSelect, 12); if (stringCentered == true) { subString0Addr = 63 - GetStringGraphicalLength(subString0) * 4; subString1Addr = 63 - GetStringGraphicalLength(subString1) * 4; OLED_ShowAnyString(subString0Addr, 16, subString0, NotOnSelect, 16); OLED_ShowAnyString(subString1Addr, 42, subString1, NotOnSelect, 16); } else { OLED_ShowAnyString(4, 16, subString0, NotOnSelect, 16); OLED_ShowAnyString(4, 42, subString1, NotOnSelect, 16); } OLED_InvertRect(1, 1, 126, 13); xSemaphoreGive(OLEDRelatedMutex); }
/** * @brief Show small dialogue * @param string: Passage time: Time of the dialoue that lasts occupyThread:Will ShowSmallDialogue() occupies thread until time is up */ void ShowSmallDialogue(const char string[], u16 time, bool occupyThread) { u8 startAddr, endAddr; u8 stringLength; stringLength = GetStringGraphicalLength(string); startAddr = 63 - stringLength * 4; endAddr = startAddr + stringLength * 8; xSemaphoreTake(OLEDRelatedMutex, portMAX_DELAY); OLED_Clear(); OLED_DrawRect(startAddr - 4, 20, endAddr + 4, 44, DRAW); OLED_ShowAnyString(startAddr, 24, string, NotOnSelect, 16); OLED_Refresh_Gram(); if (occupyThread) { vTaskDelay(time / portTICK_RATE_MS); } xSemaphoreGive(OLEDRelatedMutex); if (occupyThread) { xSemaphoreTake(OLEDRelatedMutex, portMAX_DELAY); OLED_Clear(); xSemaphoreGive(OLEDRelatedMutex); } }
void UI_ListView_Handler(void *pvParameters) { ListView_Param_Struct* listView_Params = pvParameters; Key_Message_Struct key_Message; u16 pos[5]; char tempString[29]; int currentPos; int currentRelativePos; u16 itemStringLengths[4]; u16 lastSelected = listView_Params->DefaultPos; u16 lengthTemp; u16 posTemp; u16 i, p, m; u8 displayLineNumInSinglePage = listView_Params->ListLength > 5 ? 5 : listView_Params->ListLength; // u16* dataNumPointer; float * dataPointers[4]; bool updateNumTab = true; bool firstDraw = true; bool currentPosChanged = false; xSemaphoreTake(OLEDRelatedMutex, portMAX_DELAY); OLED_Clear(); OLED_DrawRect(0, 0, 127, 23 + 10 * (displayLineNumInSinglePage - 1), DRAW); OLED_DrawHorizonalLine(13, 0, 127, 1); xSemaphoreGive(OLEDRelatedMutex); SetKeyBeatRate(listView_Params->FastSpeed); /*Get the lengths of the itemNames*/ for (i = 0; i < listView_Params->ItemNum; i++) { itemStringLengths[i] = GetStringGraphicalLength(listView_Params->ItemNames[i]); } pos[0] = listView_Params->ItemPositions[0]; /*Make the positions of the itemStrings centural between two grids*/ for (i = 0; i < listView_Params->ItemNum; i++) { pos[i] = GetCentralPosition(listView_Params->ItemPositions[i], listView_Params->ItemPositions[i + 1], itemStringLengths[i]) - 1; } for (i = 0; i < listView_Params->ItemNum; i++) { OLED_ShowAnyString(pos[i], 1, listView_Params->ItemNames[i], NotOnSelect, 12); } /*Draw vertical grids*/ for (i = 0; i < listView_Params->ItemNum; i++) { OLED_DrawVerticalLine(listView_Params->ItemPositions[i] - 2, 0, 23 + 10 * (displayLineNumInSinglePage - 1), 1); } /*Draw horizonal grids*/ for (i = 0; i < displayLineNumInSinglePage; i++) { OLED_DrawHorizonalLine(23 + 10 * i, 0, 127, 1); } if (listView_Params->Item1AutoNum == true) { for (i = 0; i < listView_Params->ItemNum - 1; i++) { dataPointers[i + 1] = listView_Params->DataPointers[i]; } // dataNumPointer = listView_Params->DataAutoNumPointer; // for (i = 0; i < listView_Params->ListLength; i++) // { // dataNumPointer[i] = listView_Params->Item1AutoNumStart + i*listView_Params->Item1AutoNumStep; // } } else { for (i = 0; i < listView_Params->ItemNum; i++) { dataPointers[i] = listView_Params->DataPointers[i]; } } currentPos = listView_Params->DefaultPos; currentRelativePos = 0; ClearKeyEvent(); for (;;) { xSemaphoreTake(OLEDRelatedMutex, portMAX_DELAY); if (listView_Params->Item1AutoNum == true) p = 1; else p = 0; for (i = 0; i < listView_Params->ItemNum - p; i++) { for (m = 0; m < displayLineNumInSinglePage; m++) { sprintf(tempString, listView_Params->sprintfCommandStrings[i], dataPointers[i + p][currentPos + m]); lengthTemp = GetStringGraphicalLength(tempString); posTemp = GetCentralPosition(listView_Params->ItemPositions[i + p], listView_Params->ItemPositions[i + p + 1], lengthTemp); OLED_ShowAnyString(posTemp - 1, 15 + 10 * m, tempString, NotOnSelect, 8); } } if (listView_Params->Item1AutoNum == true) { if (currentPosChanged == true) { currentPosChanged = false; for (i = 0; i < displayLineNumInSinglePage; i++) OLED_FillRect(listView_Params->ItemPositions[0], 15 + 10 * i, listView_Params->ItemPositions[1] - 4, 22 + 10 * i, 0); firstDraw = true; updateNumTab = true; } for (i = 0; i < displayLineNumInSinglePage; i++) { sprintf(tempString, "%d", listView_Params->Item1AutoNumStart + (currentPos + i)*listView_Params->Item1AutoNumStep); lengthTemp = GetStringGraphicalLength(tempString); posTemp = GetCentralPosition(listView_Params->ItemPositions[0], listView_Params->ItemPositions[1], lengthTemp); if (currentRelativePos != i&&lastSelected != i) OLED_ShowAnyString(posTemp - 1, 15 + 10 * i, tempString, NotOnSelect, 8); if (currentRelativePos == i&&updateNumTab == true) { if (firstDraw == false) OLED_InvertRect(listView_Params->ItemPositions[0], 15 + 10 * lastSelected, listView_Params->ItemPositions[1] - 4, 22 + 10 * lastSelected); else firstDraw = false; OLED_ShowAnyString(posTemp - 1, 15 + 10 * i, tempString, NotOnSelect, 8); OLED_InvertRect(listView_Params->ItemPositions[0], 15 + 10 * i, listView_Params->ItemPositions[1] - 4, 22 + 10 * i); lastSelected = currentRelativePos; updateNumTab = false; } } } OLED_Refresh_Gram(); xSemaphoreGive(OLEDRelatedMutex); xQueueReceive(Key_Message, &key_Message, portMAX_DELAY); if (key_Message.KeyEvent == RightClick || key_Message.AdvancedKeyEvent == RightContinous) { currentRelativePos++; updateNumTab = true; if (currentRelativePos >= displayLineNumInSinglePage) { currentPosChanged = true; currentPos++; if (currentPos + displayLineNumInSinglePage > listView_Params->ListLength) { currentPos = listView_Params->ListLength - displayLineNumInSinglePage; currentPosChanged = false; updateNumTab = false; } currentRelativePos = displayLineNumInSinglePage - 1; } } else if (key_Message.KeyEvent == LeftClick || key_Message.AdvancedKeyEvent == LeftContinous) { currentRelativePos--; updateNumTab = true; if (currentRelativePos < 0) { currentPosChanged = true; currentPos--; if (currentPos < 0) { currentPos = 0; currentPosChanged = false; updateNumTab = false; } currentRelativePos = 0; } } else if (key_Message.KeyEvent == MidDouble) { currentPos = 32767; xQueueSend(UI_ListViewMsg, ¤tPos, portMAX_DELAY); for(;;) vTaskDelay(portMAX_DELAY); } else if (key_Message.KeyEvent == MidClick) { xQueueSend(UI_ListViewMsg, ¤tPos, portMAX_DELAY); for(;;) vTaskDelay(portMAX_DELAY); } } }
/*** DemoRun() ** ** Parameters: ** none ** ** Return Value: ** none ** ** Errors: ** If demo shut down without proper exit, could damage PmodOLED. ** ** Description: ** Displays Demo message and each available Fill Pattern. ** Pauses between runs to check if user wants to continue, if not, exits. ** To be safe, exit through prompt before closing demo. ** Requires UART connection to terminal program on PC. */ void DemoRun() { int irow, ib, i; u8 *pat; char c; xil_printf("UART and SPI opened for PmodOLED Demo\n\r"); while (1) { //Choosing Fill pattern 0 pat = OLED_GetStdPattern(0); OLED_SetFillPattern(&myDevice, pat); //Turn automatic updating off OLED_SetCharUpdate(&myDevice, 0); //Draw a rectangle over writing then slide the rectangle //down slowly displaying all writing for (irow = 0; irow < OledRowMax; irow++) { OLED_ClearBuffer(&myDevice); OLED_SetCursor(&myDevice, 0, 0); OLED_PutString(&myDevice, "PmodOLED"); OLED_SetCursor(&myDevice, 0, 1); OLED_PutString(&myDevice, "by Digilent"); OLED_SetCursor(&myDevice, 0, 2); OLED_PutString(&myDevice, "Simple Demo"); OLED_MoveTo(&myDevice, 0, irow); OLED_FillRect(&myDevice, 127, 31); OLED_MoveTo(&myDevice, 0, irow); OLED_LineTo(&myDevice, 127, irow); OLED_Update(&myDevice); OLED_Delay(100); } OLED_Delay(1000); // Blink the display three times. for (i = 0; i < 3; i++) { OLED_DisplayOff (&myDevice); OLED_Delay (500); OLED_DisplayOn (&myDevice); OLED_Delay (500); } OLED_Delay(2000); // Now erase the characters from the display for (irow = OledRowMax-1; irow >= 0; irow--) { OLED_SetDrawColor(&myDevice, 1); OLED_SetDrawMode(&myDevice, OledModeSet); OLED_MoveTo(&myDevice, 0, irow); OLED_LineTo(&myDevice, 127, irow); OLED_Update(&myDevice); OLED_Delay(25); OLED_SetDrawMode(&myDevice, OledModeXor); OLED_MoveTo(&myDevice, 0, irow); OLED_LineTo(&myDevice, 127, irow); OLED_Update(&myDevice); } OLED_Delay(1000); // Draw a rectangle in center of screen // Display the 8 different patterns available OLED_SetDrawMode(&myDevice, OledModeSet); for(ib = 1; ib < 8; ib++) { OLED_ClearBuffer(&myDevice); pat = OLED_GetStdPattern(ib); OLED_SetFillPattern(&myDevice, pat); OLED_MoveTo(&myDevice, 55, 1); OLED_FillRect(&myDevice, 75, 27); OLED_DrawRect(&myDevice, 75, 27); OLED_Update(&myDevice); OLED_Delay(1000); } xil_printf("(q)uit or any key to continue:\n\r"); c = inbyte(); if (c == 'q' || c == 'Q') break; } xil_printf("Exiting PmodOLED Demo\n\r"); }