/* * testMenu.c * * Created on: Mar 27, 2024 * Author: Brian.Bailey */ #include #include #include #include #include //Drivers #include "fsl_common.h" #include "fsl_gpio.h" #include "Fonts\fontLibrary.h" #include "Graphics\graphicsLibrary.h" #include "lcd.h" #include "keys.h" #include "timer.h" #include "frq.h" #include "Graphics\icons.h" #include "System\system.h" #include "menu.h" #include "hwFixes.h" #include "eeprom.h" #include "testMenu.h" /******************************************************************************* * Definitions ******************************************************************************/ /******************************************************************************* * Variables ******************************************************************************/ MenuItem_t testMenu[TEST_MENU_NUM]; MenuItem_t hwFixMenu[HWFIX_MENU_NUM]; uint8_t * fixStrings[] = {"NOT YET...", "DONE"}; //1 = fix done uint8_t * onOffStrings[] = {"OFF", "ON"}; //1 = on extern HARDWARE_FIX_t hwf; extern char tempString[40]; extern uint8_t Diag_Flag; /******************************************************************************* * Static Function Declarations ******************************************************************************/ static void ClearTestMenuItems(MenuItem_t items[], uint32_t num); static uint8_t * GetFixStatusString(uint32_t index); static void HwFixMenu(void); static void DisplayHwFixMenu(uint32_t selected); static void DrawTestMenuScrollBar(uint32_t displayIndex, uint32_t numItems); /******************************************************************************* * Static Functions ******************************************************************************/ //Clear an array of MENU_ITEM_t static void ClearTestMenuItems(MenuItem_t items[], uint32_t num) { for(uint32_t i = 0; i < num; i++) { items[i].pMonoIcon = 0; //Init mono icon pointer to null items[i].text[0] = 0; //Init first char to null } } static uint8_t * GetFixStatusString(uint32_t index) { return fixStrings[index]; } static uint8_t * GetOnOffString(uint32_t index) { return onOffStrings[index]; } static void HwFixMenu(void) { uint32_t selected = 0; uint32_t menuNum = HWFIX_MENU_NUM; uint32_t menuExit = 0; //Draw screen first time DisplayHwFixMenu(selected); while(1) { //use keys to changes selected uint32_t pressed = KEY_WaitForKeyPress(KEY_ALL); switch(pressed) //This won't work if multiple keys pressed, but it'll clear them { case KEY_BACK: menuExit = true; break; case ON_OFF_KEY: //Do nothing break; case KEY_UP: if(--selected > menuNum) { selected = 0; } DisplayHwFixMenu(selected); break; case (KEY_UP << KEY_LONG_PRESS): do { if(--selected > menuNum) { selected = 0; } DisplayHwFixMenu(selected); Delay_Ticks(MENU_KEY_HOLD_SCROLL_DELAY); } while(KEY_GetUpKeyHeld()); break; case KEY_DOWN: if(++selected >= menuNum) { selected = menuNum - 1; } DisplayHwFixMenu(selected); break; case (KEY_DOWN << KEY_LONG_PRESS): do { if(++selected >= menuNum) { selected = menuNum - 1; } DisplayHwFixMenu(selected); Delay_Ticks(MENU_KEY_HOLD_SCROLL_DELAY); } while(KEY_GetDownKeyHeld()); break; case KEY_ENTER: //SHORT Press to SET Hardware Fix switch(selected) { case(0): //vBattCap_021 EE_WriteUINT32(EE_HWFIX_VBATT_CAP_021, true); hwf.vBattCap_021 = true; break; case(1): //Increase mainPcbaPN hwf.mainPcbaPN += 2; if(hwf.mainPcbaPN > HWF_MAX_MAIN_PCBA_PN) { hwf.mainPcbaPN = HWF_MAX_MAIN_PCBA_PN; } EE_WriteUINT32(EE_HWFIX_MAIN_PCBA_PN, hwf.mainPcbaPN); break; case(2): //Not used break; default: break; } DisplayHwFixMenu(selected); //Redraw menu after any changes break; case (KEY_ENTER << KEY_LONG_PRESS): //LONG Press to CLEAR Hardware Fix switch(selected) { case(0): //vBattCap_021 EE_WriteUINT32(EE_HWFIX_VBATT_CAP_021, false); hwf.vBattCap_021 = false; break; case(1): //Decrease mainPcbaPN hwf.mainPcbaPN -= 2; if(hwf.mainPcbaPN < HWF_MIN_MAIN_PCBA_PN) { hwf.mainPcbaPN = HWF_MIN_MAIN_PCBA_PN; } EE_WriteUINT32(EE_HWFIX_MAIN_PCBA_PN, hwf.mainPcbaPN); break; case(2): //Not used break; default: break; } DisplayHwFixMenu(selected); //Redraw menu after any changes break; } if(menuExit) { return; } } } static void DisplayHwFixMenu(uint32_t selected) { char displayIndex = 0; //index of first menu line to draw uint32_t menuNum = HWFIX_MENU_NUM; LCD_Clear(); //Title FL_DrawString("HARDWARE FIXES", LCD_X_MID, 0, MENU_FONT, LCD_DRAW_SET, FL_ALIGN_CENTER); //Update displayIndex if(selected >= (displayIndex + MENU_TEST_MAX_LINES_DISPLAYED)) { displayIndex++; } else if(selected < displayIndex) { displayIndex--; } //Draw menu items uint32_t lastIndex = displayIndex + MENU_TEST_MAX_LINES_DISPLAYED; //last line to draw. Limit lastIndex to max lines if(lastIndex > menuNum) //Limit lastIndex to number of items { lastIndex = menuNum; } for(uint32_t i = displayIndex; i < lastIndex; i++) { //Menu strings FL_DrawString(hwFixMenu[i].text, MENU_MAIN_TEXT_X, MENU_TEST_TEXT_Y_START + (i-displayIndex)*MENU_LINE_HEIGHT, MENU_FONT, LCD_DRAW_SET, FL_ALIGN_LEFT); //Draw item status switch(i) { case(0): //vBattCap_021 FL_DrawString(GetFixStatusString(hwf.vBattCap_021), MENU_MAIN_STATUS_X, MENU_TEST_TEXT_Y_START + (i - displayIndex)*MENU_LINE_HEIGHT, MENU_FONT, LCD_DRAW_SET, FL_ALIGN_LEFT); break; case(1): //mainPcbaPN sprintf(tempString, "%d", hwf.mainPcbaPN); FL_DrawString(tempString, MENU_MAIN_STATUS_X, MENU_TEST_TEXT_Y_START + (i - displayIndex)*MENU_LINE_HEIGHT, MENU_FONT, LCD_DRAW_SET, FL_ALIGN_LEFT); break; case(2): // break; default: break; } } //Draw selection bar uint32_t selRectY0 = MENU_TEST_TEXT_Y_START + (selected - displayIndex)*MENU_LINE_HEIGHT; GL_DrawFilledRectangle(MENU_SEL_RECT_X0, selRectY0, MENU_SEL_RECT_X1, selRectY0 + MENU_LINE_HEIGHT, LCD_DRAW_XOR); DrawTestMenuScrollBar(displayIndex, menuNum); LCD_Update(); } /* Draw TEST menu scroll bar on right side * DIFFERENT for testMenu since number of lines per screen is different */ static void DrawTestMenuScrollBar(uint32_t displayIndex, uint32_t numItems) { //Exit if scroll bar not needed if(numItems <= MENU_MAX_LINES_DISPLAYED) { return; } //numItems = 30; // 18 //vertical line const uint32_t lineWidth = 5; const uint32_t lineX = LCD_X_MAX - 10; const uint32_t lineYStart = 20; const uint32_t lineYStop = LCD_Y_MAX - 20; const uint32_t lineHeight = lineYStop - lineYStart; //rectangle const uint32_t rectWidth = 20; const uint32_t rectX = lineX; uint32_t rectHeight = lineHeight * ((double)MENU_TEST_MAX_LINES_DISPLAYED / numItems); uint32_t rectYStart = lineYStart + (lineHeight - rectHeight) * ((double)displayIndex / (numItems - MENU_MAX_LINES_DISPLAYED)); uint32_t rectYStop = rectYStart + rectHeight; //Draw line GL_DrawLine(lineX, lineYStart, lineX, lineYStop, lineWidth, LCD_DRAW_SET); //Draw Rectangle GL_DrawLine(rectX, rectYStart, rectX, rectYStop, rectWidth, LCD_DRAW_SET); } /******************************************************************************* * Public Functions ******************************************************************************/ void TM_Init(void) { //Clear menu items ClearTestMenuItems(testMenu, TEST_MENU_NUM); ClearTestMenuItems(hwFixMenu, HWFIX_MENU_NUM); uint32_t i = 0; //test menu testMenu[i].pMonoIcon = 0; strcpy(testMenu[i++].text, "Test Mode"); testMenu[i].pMonoIcon = 0; strcpy(testMenu[i++].text, "Show Details"); testMenu[i].pMonoIcon = 0; strcpy(testMenu[i++].text, "Hardware Fixes"); testMenu[i].pMonoIcon = 0; strcpy(testMenu[i++].text, "Frog"); testMenu[i].pMonoIcon = 0; strcpy(testMenu[i++].text, "Tuna"); i = 0; //hwFix menu hwFixMenu[i].pMonoIcon = 0; strcpy(hwFixMenu[i++].text, "VBatt Cap (021)"); hwFixMenu[i].pMonoIcon = 0; strcpy(hwFixMenu[i++].text, "Main PCBA PN"); hwFixMenu[i].pMonoIcon = 0; strcpy(hwFixMenu[i++].text, "TBD"); } /* * Test menu accesses through konami code */ void TM_TestMenu(void) { uint32_t selected = 0; uint32_t menuNum = TEST_MENU_NUM; uint32_t menuExit = 0; //Draw screen first time TM_DisplayTestMenu(selected); while(1) { //use keys to changes selected uint32_t pressed = KEY_WaitForKeyPress(KEY_ALL); switch(pressed) //This won't work if multiple keys pressed, but it'll clear them { case KEY_BACK: menuExit = true; break; case ON_OFF_KEY: //Do nothing break; case KEY_UP: if(--selected > menuNum) { selected = 0; } TM_DisplayTestMenu(selected); break; case (KEY_UP << KEY_LONG_PRESS): do { if(--selected > menuNum) { selected = 0; } TM_DisplayTestMenu(selected); Delay_Ticks(MENU_KEY_HOLD_SCROLL_DELAY); } while(KEY_GetUpKeyHeld()); break; case KEY_DOWN: if(++selected >= menuNum) { selected = menuNum - 1; } TM_DisplayTestMenu(selected); break; case (KEY_DOWN << KEY_LONG_PRESS): do { if(++selected >= menuNum) { selected = menuNum - 1; } TM_DisplayTestMenu(selected); Delay_Ticks(MENU_KEY_HOLD_SCROLL_DELAY); } while(KEY_GetDownKeyHeld()); break; case KEY_ENTER: switch(selected) { case(0): //Test Mode //Toggle test mode flag break; case(1): //Show Details Diag_Flag ^=1; //Toggle showDetails flag break; case(2): //Hardware Fixes HwFixMenu(); break; case(3): //Not used break; case(4): //Not used break; case(5): //Not used break; default: break; } TM_DisplayTestMenu(selected); //Redraw menu after any changes break; } if(menuExit) { return; } } } void TM_DisplayTestMenu(uint32_t selected) { char displayIndex = 0; //index of first menu line to draw uint32_t menuNum = TEST_MENU_NUM; LCD_Clear(); //Title FL_DrawString("SNEAKRET MENU", LCD_X_MID, 0, MENU_FONT, LCD_DRAW_SET, FL_ALIGN_CENTER); //Update displayIndex if(selected >= (displayIndex + MENU_TEST_MAX_LINES_DISPLAYED)) { displayIndex++; } else if(selected < displayIndex) { displayIndex--; } //Draw menu items uint32_t lastIndex = displayIndex + MENU_TEST_MAX_LINES_DISPLAYED; //last line to draw. Limit lastIndex to max lines if(lastIndex > menuNum) //Limit lastIndex to number of items { lastIndex = menuNum; } for(uint32_t i = displayIndex; i < lastIndex; i++) { //Menu strings FL_DrawString(testMenu[i].text, MENU_MAIN_TEXT_X, MENU_TEST_TEXT_Y_START + (i-displayIndex)*MENU_LINE_HEIGHT, MENU_FONT, LCD_DRAW_SET, FL_ALIGN_LEFT); //Draw item status switch(i) { case(0): //Test Mode FL_DrawString(GetOnOffString(0), MENU_MAIN_STATUS_X, MENU_TEST_TEXT_Y_START + (i - displayIndex)*MENU_LINE_HEIGHT, MENU_FONT, LCD_DRAW_SET, FL_ALIGN_LEFT); break; case(1): //Show Details FL_DrawString(GetOnOffString(Diag_Flag), MENU_MAIN_STATUS_X, MENU_TEST_TEXT_Y_START + (i - displayIndex)*MENU_LINE_HEIGHT, MENU_FONT, LCD_DRAW_SET, FL_ALIGN_LEFT); break; case(2): //Hardware Fix Menu GL_DrawMonoBitmap(menuMore, MENU_MAIN_STATUS_X, MENU_TEST_TEXT_Y_START + (i-displayIndex)*MENU_LINE_HEIGHT + MENU_MAIN_STATUS_Y_OFF, LCD_DRAW_SET); break; case(3): //Frog GL_DrawMonoBitmap(menuMore, MENU_MAIN_STATUS_X, MENU_TEST_TEXT_Y_START + (i-displayIndex)*MENU_LINE_HEIGHT + MENU_MAIN_STATUS_Y_OFF, LCD_DRAW_SET); break; case(4): //Tuna GL_DrawMonoBitmap(menuMore, MENU_MAIN_STATUS_X, MENU_TEST_TEXT_Y_START + (i-displayIndex)*MENU_LINE_HEIGHT + MENU_MAIN_STATUS_Y_OFF, LCD_DRAW_SET); break; default: break; } } //Draw selection bar uint32_t selRectY0 = MENU_TEST_TEXT_Y_START + (selected - displayIndex)*MENU_LINE_HEIGHT; GL_DrawFilledRectangle(MENU_SEL_RECT_X0, selRectY0, MENU_SEL_RECT_X1, selRectY0 + MENU_LINE_HEIGHT, LCD_DRAW_XOR); DrawTestMenuScrollBar(displayIndex, menuNum); LCD_Update(); }