/* PacoMouseCYD throttle -- F. CaƱada 2025-2026 -- https://usuaris.tinet.cat/fmco/ */ //////////////////////////////////////////////////////////// // ***** WINDOW OBJECTS ***** //////////////////////////////////////////////////////////// void openWindow(uint16_t id) { uint16_t n; char buf[MAX_LABEL_LNG]; switch (id) { case WIN_LOGO: createObject(OBJ_WIN, WIN_LOGO); createObject(OBJ_DRAWSTR, DSTR_INIT); createObject(OBJ_LABEL, LBL_PACO_TXT); posObjStack1 = createObject(OBJ_LABEL, LBL_INIT); createObject(OBJ_ICON, ICON_PACO); createObject(OBJ_BAR, BAR_INIT); drawWindow(WIN_LOGO); break; case WIN_CALIBRATE: createObject(OBJ_WIN, WIN_CALIBRATE); posObjStack2 = createObject(OBJ_LABEL, LBL_CAL); posObjStack1 = createObject(OBJ_LABEL, LBL_PRESS); newEvent(OBJ_WIN, WIN_CALIBRATE, EVNT_DRAW); break; case WIN_SSID: createObject(OBJ_WIN, WIN_SSID); createObject(OBJ_ICON, ICON_WIFI_SSID); createObject(OBJ_BUTTON, BUT_SSID_CLOSE); posObjStack1 = createObject(OBJ_LABEL, LBL_SCAN); drawWindow(WIN_SSID); scanWiFi(); objStack[posObjStack1].objID = LBL_SSID_SCAN; createObject(OBJ_TXT, TXT_SSID1); createObject(OBJ_TXT, TXT_SSID2); createObject(OBJ_TXT, TXT_SSID3); createObject(OBJ_TXT, TXT_SSID4); createObject(OBJ_TXT, TXT_SSID5); createObject(OBJ_TXT, TXT_SSID6); scanWiFiFill(); newEvent(OBJ_WIN, WIN_SSID, EVNT_DRAW); break; case WIN_WIFI: snprintf(ssidName, SSID_LNG, "%s", wifiSetting.ssid); snprintf(keybPwdHideBuf, 9, "********"); snprintf(keybIP1Buf, 4, "%d", wifiSetting.CS_IP[0]); snprintf(keybIP2Buf, 4, "%d", wifiSetting.CS_IP[1]); snprintf(keybIP3Buf, 4, "%d", wifiSetting.CS_IP[2]); snprintf(keybIP4Buf, 4, "%d", wifiSetting.CS_IP[3]); setProtocolData(); createObject(OBJ_WIN, WIN_WIFI); createObject(OBJ_ICON, ICON_WIFI_CFG); createObject(OBJ_LABEL, LBL_SSID); createObject(OBJ_TXT, TXT_SSID); createObject(OBJ_LABEL, LBL_PWD_HIDE); createObject(OBJ_TXT, TXT_PWD_HIDE); createObject(OBJ_LABEL, LBL_IP); createObject(OBJ_TXT, TXT_IP1); createObject(OBJ_TXT, TXT_IP2); createObject(OBJ_TXT, TXT_IP3); createObject(OBJ_TXT, TXT_IP4); createObject(OBJ_LABEL, LBL_PORT); createObject(OBJ_TXT, TXT_PORT); createObject(OBJ_KEYBOARD, KEYB_IP); createObject(OBJ_LABEL, LBL_PROTOCOL); createObject(OBJ_TXT, TXT_PROTOCOL); createObject(OBJ_BUTTON, BUT_WIFI_OK); newEvent(OBJ_WIN, WIN_WIFI, EVNT_DRAW); break; case WIN_WIFI_PWD: snprintf(keybPwdBuf, PWD_LNG, wifiSetting.password); createObject(OBJ_WIN, WIN_WIFI_PWD); createObject(OBJ_TXT, TXT_PWD); createObject(OBJ_KEYBOARD, KEYB_PWD); createObject(OBJ_BUTTON, BUT_PWD_OK); createObject(OBJ_BUTTON, BUT_PWD_CNCL); newEvent(OBJ_WIN, WIN_WIFI_PWD, EVNT_DRAW); break; case WIN_PROTOCOL: radioData[RAD_PROTOCOL].value = wifiSetting.protocol - CLIENT_Z21; if (wifiSetting.protocol == CLIENT_LNET) radioData[RAD_PROTOCOL_LN].value = (wifiSetting.serverType) ? 0 : 1; else radioData[RAD_PROTOCOL_LN].value = radioData[RAD_PROTOCOL_LN].num; createObject(OBJ_WIN, WIN_PROTOCOL); createObject(OBJ_RADIO, RAD_PROTOCOL); createObject(OBJ_RADIO, RAD_PROTOCOL_LN); createObject(OBJ_LABEL, LBL_SEL_PROT); createObject(OBJ_LABEL, LBL_SEL_Z21); createObject(OBJ_LABEL, LBL_SEL_XNET); createObject(OBJ_LABEL, LBL_SEL_ECOS); createObject(OBJ_LABEL, LBL_SEL_LNET); createObject(OBJ_LABEL, LBL_SEL_LBSERVER); createObject(OBJ_LABEL, LBL_SEL_BINARY); createObject(OBJ_BUTTON, BUT_PROT_OK); createObject(OBJ_BUTTON, BUT_OPTIONS); newEvent(OBJ_WIN, WIN_PROTOCOL, EVNT_DRAW); break; case WIN_THROTTLE: iconData[ICON_LOK_EDIT].bitmap = (wifiSetting.protocol == CLIENT_ECOS) ? info24 : wrench; createObject(OBJ_WIN, WIN_THROTTLE); createObject(OBJ_ICON, ICON_MENU); createObject(OBJ_ICON, ICON_POWER); createObject(OBJ_ICON, ICON_FNEXT); createObject(OBJ_ICON, ICON_LOK_EDIT); createObject(OBJ_FNC, FNC_ACC_PANEL); //createObject(OBJ_ICON, ICON_FWD); //createObject(OBJ_ICON, ICON_REV); createObject(OBJ_TXT, TXT_CLOCK); createObject(OBJ_TXT, TXT_LOCO_NAME); createObject(OBJ_TXT, TXT_LOCO_ADDR); createObject(OBJ_LPIC, LPIC_MAIN); createObject(OBJ_GAUGE, GAUGE_SPEED); createObject(OBJ_LABEL, LBL_KMH); createObject(OBJ_FNC, FNC_FX0); createObject(OBJ_FNC, FNC_FX1); createObject(OBJ_FNC, FNC_FX2); createObject(OBJ_FNC, FNC_FX3); createObject(OBJ_FNC, FNC_FX4); createObject(OBJ_FNC, FNC_FX5); createObject(OBJ_FNC, FNC_FX6); createObject(OBJ_FNC, FNC_FX7); createObject(OBJ_FNC, FNC_FX8); createObject(OBJ_FNC, FNC_FX9); newEvent(OBJ_WIN, WIN_THROTTLE, EVNT_DRAW); break; case WIN_CONFIG: buttonData[BUT_CFG_I_LANG].objID = DSTR_ENGLISH + currLanguage; lastLanguage = currLanguage; createObject(OBJ_WIN, WIN_CONFIG); createObject(OBJ_DRAWSTR, DSTR_CFG_MENU); createObject(OBJ_BUTTON, BUT_CFG_I_LANG); createObject(OBJ_BUTTON, BUT_CFG_T_LANG); createObject(OBJ_BUTTON, BUT_CFG_I_SCR); createObject(OBJ_BUTTON, BUT_CFG_T_SCR); createObject(OBJ_BUTTON, BUT_CFG_I_SPD); createObject(OBJ_BUTTON, BUT_CFG_T_SPD); createObject(OBJ_BUTTON, BUT_CFG_I_WIFI); createObject(OBJ_BUTTON, BUT_CFG_T_WIFI); createObject(OBJ_BUTTON, BUT_CFG_I_FCLK); createObject(OBJ_BUTTON, BUT_CFG_T_FCLK); createObject(OBJ_BUTTON, BUT_CFG_I_LOCK); createObject(OBJ_BUTTON, BUT_CFG_T_LOCK); createObject(OBJ_BUTTON, BUT_CFG_I_ABOUT); createObject(OBJ_BUTTON, BUT_CFG_T_ABOUT); createObject(OBJ_ICON, ICON_CFG_EXIT); newEvent(OBJ_WIN, WIN_CONFIG, EVNT_DRAW); break; case WIN_SCREEN: barData[BAR_BLIGHT].value = backlight; switchData[SW_ROTATE].state = (locationUSB == USB_UP); createObject(OBJ_WIN, WIN_SCREEN); createObject(OBJ_ICON, ICON_BLIGHT); createObject(OBJ_BAR, BAR_BLIGHT); createObject(OBJ_SWITCH, SW_ROTATE); createObject(OBJ_LABEL, LBL_SCR_ROTATE); createObject(OBJ_BUTTON, BUT_CFG_TOUCH); createObject(OBJ_BUTTON, BUT_SCR_OK); createObject(OBJ_BUTTON, BUT_SCR_CNCL); newEvent(OBJ_WIN, WIN_SCREEN, EVNT_DRAW); break; case WIN_SPEED: switchData[SW_SHUNTING].state = shuntingMode; radioData[RAD_STOP_MODE].value = (stopMode > 0) ? 1 : 0; createObject(OBJ_WIN, WIN_SPEED); createObject(OBJ_LABEL, LBL_SHUNTING); createObject(OBJ_SWITCH, SW_SHUNTING); createObject(OBJ_RADIO, RAD_STOP_MODE); createObject(OBJ_ICON, ICON_STOP); createObject(OBJ_LABEL, LBL_STOP_0); createObject(OBJ_LABEL, LBL_STOP_E); createObject(OBJ_BUTTON, BUT_SPD_OK); newEvent(OBJ_WIN, WIN_SPEED, EVNT_DRAW); break; case WIN_SET_CLOCK: snprintf(keybHourBuf, 3, "%d", clockHour); snprintf(keybMinBuf, 3, "%d", clockMin); snprintf(keybRateBuf, 4, "%d", clockRate); showClockData(TXT_HOUR); createObject(OBJ_WIN, WIN_SET_CLOCK); createObject(OBJ_DRAWSTR, DSTR_CLOCK); createObject(OBJ_CHAR, CHAR_CLK_COLON); createObject(OBJ_ICON, ICON_SET_CLOCK); createObject(OBJ_TXT, TXT_HOUR); createObject(OBJ_TXT, TXT_MIN); createObject(OBJ_TXT, TXT_RATE); createObject(OBJ_LABEL, LBL_RATE); createObject(OBJ_KEYBOARD, KEYB_CLOCK); createObject(OBJ_BUTTON, BUT_CLOCK_OK); createObject(OBJ_BUTTON, BUT_CLOCK_CNCL); newEvent(OBJ_WIN, WIN_SET_CLOCK, EVNT_DRAW); break; case WIN_LOCK: switchData[SW_LOCK_LOK].state = (bitRead(lockOptions, LOCK_SEL_LOCO)) ? true : false; switchData[SW_LOCK_ACC].state = (bitRead(lockOptions, LOCK_TURNOUT)) ? true : false; switchData[SW_LOCK_PRG].state = (bitRead(lockOptions, LOCK_PROG)) ? true : false; createObject(OBJ_WIN, WIN_LOCK); createObject(OBJ_SWITCH, SW_LOCK_LOK); createObject(OBJ_SWITCH, SW_LOCK_ACC); createObject(OBJ_SWITCH, SW_LOCK_PRG); createObject(OBJ_LABEL, LBL_LOCK_LOK); createObject(OBJ_LABEL, LBL_LOCK_ACC); createObject(OBJ_LABEL, LBL_LOCK_PRG); createObject(OBJ_BUTTON, BUT_LOCK); newEvent(OBJ_WIN, WIN_LOCK, EVNT_DRAW); break; case WIN_ABOUT: snprintf (aboutPacoMouseCYD, PWD_LNG + 1, "v%s.%s%s", VER_H, VER_L, VER_R); snprintf (aboutIP, PWD_LNG + 1, "IP: %u.%u.%u.%u", WiFi.localIP().operator[](0), WiFi.localIP().operator[](1), WiFi.localIP().operator[](2), WiFi.localIP().operator[](3)); snprintf (aboutMAC, PWD_LNG + 1, "MAC: %s", WiFi.macAddress().c_str()); createObject(OBJ_WIN, WIN_ABOUT); createObject(OBJ_DRAWSTR, DSTR_ABOUT); createObject(OBJ_LABEL, LBL_PACO_TXT); createObject(OBJ_ICON, ICON_ABOUT_PACO); createObject(OBJ_TXT, TXT_ABOUT); createObject(OBJ_TXT, TXT_ABOUT_IP); createObject(OBJ_TXT, TXT_ABOUT_MAC); createObject(OBJ_LABEL, LBL_PACO_WEB); newEvent(OBJ_WIN, WIN_ABOUT, EVNT_DRAW); break; case WIN_LOK_EDIT: snprintf (locoEditName, NAME_LNG + 1, "%s", locoData[myLocoData].myName ); sprintf (locoEditAddr, "%d", locoData[myLocoData].myAddr.address); sprintf (locoEditID, "%d", locoData[myLocoData].myLocoID); sprintf (locoEditVmax, "%d", locoData[myLocoData].myVmax); lpicData[LPIC_LOK_EDIT].id = locoData[myLocoData].myLocoID; for (n = 0; n < 29; n++) fncData[FNC_F0 + n].idIcon = locoData[myLocoData].myFuncIcon[n]; createObject(OBJ_WIN, WIN_LOK_EDIT); createObject(OBJ_LABEL, LBL_ADDR); createObject(OBJ_LABEL, LBL_IMAGE); createObject(OBJ_LABEL, LBL_NAME); createObject(OBJ_LABEL, LBL_VMAX); createObject(OBJ_LPIC, LPIC_LOK_EDIT); createObject(OBJ_TXT, TXT_EDIT_ADDR); createObject(OBJ_TXT, TXT_EDIT_NAME); createObject(OBJ_TXT, TXT_EDIT_IMAGE); createObject(OBJ_TXT, TXT_EDIT_VMAX); createObject(OBJ_BUTTON, BUT_EDIT_FUNC); createObject(OBJ_BUTTON, BUT_EDIT_CNCL); if (wifiSetting.protocol != CLIENT_ECOS) { createObject(OBJ_BUTTON, BUT_EDIT_OK); if ((locoData[myLocoData].mySpeed < 2) && (countLocoInStack() > 1)) // stopped and remaining locos in stack createObject(OBJ_BUTTON, BUT_EDIT_DEL); } newEvent(OBJ_WIN, WIN_LOK_EDIT, EVNT_DRAW); break; case WIN_EDIT_NAME: snprintf(keybNameBuf, NAME_LNG + 1, locoData[myLocoData].myName); txtData[TXT_NAME].maxLength = NAME_LNG; createObject(OBJ_WIN, WIN_EDIT_NAME); createObject(OBJ_TXT, TXT_NAME); createObject(OBJ_KEYBOARD, KEYB_NAME); createObject(OBJ_BUTTON, BUT_NAME_OK); createObject(OBJ_BUTTON, BUT_NAME_CNCL); newEvent(OBJ_WIN, WIN_EDIT_NAME, EVNT_DRAW); break; case WIN_FUNC: createObject(OBJ_WIN, WIN_FUNC); for (n = 0; n < 29; n++) createObject(OBJ_FNC, FNC_F0 + n); createObject(OBJ_LABEL, LBL_ADDR); createObject(OBJ_TXT, TXT_EDIT_ADDR); createObject(OBJ_LABEL, LBL_EDIT_FUNC); if (wifiSetting.protocol != CLIENT_ECOS) createObject(OBJ_BUTTON, BUT_FNC_OK); createObject(OBJ_BUTTON, BUT_FNC_CNCL); newEvent(OBJ_WIN, WIN_FUNC, EVNT_DRAW); break; case WIN_CHG_FUNC: createObject(OBJ_WIN, WIN_CHG_FUNC); createObject(OBJ_FNC, FNC_CHG); createObject(OBJ_TXT, TXT_EDIT_FNC); newEvent(OBJ_WIN, WIN_CHG_FUNC, EVNT_DRAW); break; case WIN_VMAX: createObject(OBJ_WIN, WIN_VMAX); createObject(OBJ_TXT, TXT_KEYB_VMAX); createObject(OBJ_KEYBOARD, KEYB_VMAX); newEvent(OBJ_WIN, WIN_VMAX, EVNT_DRAW); break; case WIN_SEL_LOCO: createObject(OBJ_WIN, WIN_SEL_LOCO); createObject(OBJ_DRAWSTR, DSTR_SELLOK); posObjStack1 = createObject(OBJ_ICON, ICON_LAST_UP); prepareLocoList(); createObject(OBJ_ICON, ICON_SEL_LOK); if (wifiSetting.protocol != CLIENT_ECOS) createObject(OBJ_FNC, FNC_SEL_KEYPAD); createObject(OBJ_TXT, TXT_SEL_ADDR1); createObject(OBJ_TXT, TXT_SEL_NAME1); createObject(OBJ_TXT, TXT_SEL_ADDR2); createObject(OBJ_TXT, TXT_SEL_NAME2); createObject(OBJ_TXT, TXT_SEL_ADDR3); createObject(OBJ_TXT, TXT_SEL_NAME3); createObject(OBJ_TXT, TXT_SEL_ADDR4); createObject(OBJ_TXT, TXT_SEL_NAME4); createObject(OBJ_TXT, TXT_SEL_ADDR5); createObject(OBJ_TXT, TXT_SEL_NAME5); createObject(OBJ_TXT, TXT_SEL_ADDR6); createObject(OBJ_TXT, TXT_SEL_NAME6); newEvent(OBJ_WIN, WIN_SEL_LOCO, EVNT_DRAW); break; case WIN_ENTER_ADDR: locoKeybAddr[0] = '\0'; createObject(OBJ_WIN, WIN_ENTER_ADDR); createObject(OBJ_TXT, TXT_KEYB_ADDR); createObject(OBJ_KEYBOARD, KEYB_ADDR); newEvent(OBJ_WIN, WIN_ENTER_ADDR, EVNT_DRAW); break; case WIN_SEL_IMAGE: createObject(OBJ_WIN, WIN_SEL_IMAGE); createObject(OBJ_LABEL, LBL_SEL_IMAGE); createObject(OBJ_BUTTON, BUT_IMAGE_CNCL); drawWindow(WIN_SEL_IMAGE); populateImageList(); createObject(OBJ_LPIC, LPIC_SEL_IMG1); createObject(OBJ_LPIC, LPIC_SEL_IMG2); createObject(OBJ_LPIC, LPIC_SEL_IMG3); createObject(OBJ_LPIC, LPIC_SEL_IMG4); createObject(OBJ_LPIC, LPIC_SEL_IMG5); createObject(OBJ_LPIC, LPIC_SEL_IMG6); createObject(OBJ_ICON, ICON_PREV_IMAGE); createObject(OBJ_ICON, ICON_NEXT_IMAGE); newEvent(OBJ_WIN, WIN_SEL_IMAGE, EVNT_DRAW); break; case WIN_MENU: createObject(OBJ_WIN, WIN_MENU); createObject(OBJ_BUTTON, BUT_MENU_I_DRIVE); createObject(OBJ_BUTTON, BUT_MENU_T_DRIVE); createObject(OBJ_BUTTON, BUT_MENU_I_ACC); createObject(OBJ_BUTTON, BUT_MENU_T_ACC); createObject(OBJ_BUTTON, BUT_MENU_I_CV); createObject(OBJ_BUTTON, BUT_MENU_T_CV); createObject(OBJ_BUTTON, BUT_MENU_I_CFG); createObject(OBJ_BUTTON, BUT_MENU_T_CFG); createObject(OBJ_BUTTON, BUT_MENU_I_UTILS); createObject(OBJ_BUTTON, BUT_MENU_T_UTILS); createObject(OBJ_DRAWSTR, DSTR_MENU); newEvent(OBJ_WIN, WIN_MENU, EVNT_DRAW); break; case WIN_OPTIONS: setOptionsData(); createObject(OBJ_WIN, WIN_OPTIONS); switch (wifiSetting.protocol) { case CLIENT_Z21: //createObject(OBJ_SWITCH, SW_OPT_TT_OFFSET); //createObject(OBJ_LABEL, LBL_OPT_TT_OFFSET); createObject(OBJ_SWITCH, SW_OPT_ADR); createObject(OBJ_LABEL, LBL_OPT_ADR); break; case CLIENT_XNET: //createObject(OBJ_SWITCH, SW_OPT_TT_OFFSET); //createObject(OBJ_LABEL, LBL_OPT_TT_OFFSET); break; case CLIENT_LNET: switchData[SW_OPT_DISCOVER].state = (autoIdentifyCS > 0) ? true : false; createObject(OBJ_SWITCH, SW_OPT_DISCOVER); createObject(OBJ_LABEL, LBL_OPT_DISCOVER); createObject(OBJ_RADIO, RAD_CSTATION); createObject(OBJ_LABEL, LBL_OPT_IB2); createObject(OBJ_LABEL, LBL_OPT_UHLI); createObject(OBJ_LABEL, LBL_OPT_DIG); break; case CLIENT_ECOS: break; } createObject(OBJ_BUTTON, BUT_OPT_OK); newEvent(OBJ_WIN, WIN_OPTIONS, EVNT_DRAW); break; case WIN_SPEEDO: speedoSpeed = 0; speedoPhase = SPD_WAIT; setSpeedoPhase(SPD_WAIT); setTextSpeedo(); snprintf(spdLengthBuf, NAME_LNG + 1, "%d", speedoLength); snprintf(spdSpeedBuf, NAME_LNG + 1, "%d km/h", speedoSpeed); iconData[ICON_SPEEDO_LOK].x = 40 + (speedoPhase * 32); drawStrData[DSTR_SPEEDO_BLANK].x = 40 + (speedoPhase * 32); lpicData[LPIC_SPEEDO].id = locoData[myLocoData].myLocoID; createObject(OBJ_WIN, WIN_SPEEDO); createObject(OBJ_LPIC, LPIC_SPEEDO); createObject(OBJ_LABEL, LBL_SCALE); createObject(OBJ_LABEL, LBL_MM); createObject(OBJ_GAUGE, GAUGE_SPEEDO); createObject(OBJ_FNC, FNC_SPEEDO_DIR); createObject(OBJ_DRAWSTR, DSTR_SPEEDO_BLANK); createObject(OBJ_DRAWSTR, DSTR_SPEEDO_TRK); createObject(OBJ_ICON, ICON_SPEEDO_LOK); createObject(OBJ_ICON, ICON_SPEEDO_RADAR); createObject(OBJ_BUTTON, BUT_SPEEDO_CNCL); createObject(OBJ_BUTTON, BUT_SPEEDO_CV); createObject(OBJ_TXT, TXT_SPEEDO_SCALE); createObject(OBJ_TXT, TXT_SPEEDO_LNG); createObject(OBJ_TXT, TXT_SPEEDO_SPD); newEvent(OBJ_WIN, WIN_SPEEDO, EVNT_DRAW); break; case WIN_SPEEDO_LNG: snprintf(speedoKeybLng, PORT_LNG + 1, "%d", speedoLength); createObject(OBJ_WIN, WIN_SPEEDO_LNG); createObject(OBJ_TXT, TXT_EDIT_LNG); createObject(OBJ_KEYBOARD, KEYB_LNG); newEvent(OBJ_WIN, WIN_SPEEDO_LNG, EVNT_DRAW); break; case WIN_SPEEDO_SCALE: setTextSpeedo(); createObject(OBJ_WIN, WIN_SPEEDO_SCALE); createObject(OBJ_TXT, TXT_EDIT_SCALE); createObject(OBJ_TXT, TXT_NUM_SCALE); createObject(OBJ_KEYBOARD, KEYB_SCALE); createObject(OBJ_BUTTON, BUT_SPEEDO_H0); createObject(OBJ_BUTTON, BUT_SPEEDO_N); createObject(OBJ_BUTTON, BUT_SPEEDO_TT); createObject(OBJ_BUTTON, BUT_SPEEDO_Z); createObject(OBJ_BUTTON, BUT_SPEEDO_0); newEvent(OBJ_WIN, WIN_SPEEDO_SCALE, EVNT_DRAW); break; case WIN_READ_CV: createObject(OBJ_WIN, WIN_READ_CV); createObject(OBJ_DRAWSTR, DSTR_CFG_MENU); createObject(OBJ_BUTTON, BUT_CV_ADDR); createObject(OBJ_BUTTON, BUT_CV_SPD_L); createObject(OBJ_BUTTON, BUT_CV_SPD_M); createObject(OBJ_BUTTON, BUT_CV_SPD_H); createObject(OBJ_BUTTON, BUT_CV_ACC); createObject(OBJ_BUTTON, BUT_CV_DEC); createObject(OBJ_BUTTON, BUT_CV_CFG); createObject(OBJ_BUTTON, BUT_CV_MAN); newEvent(OBJ_WIN, WIN_READ_CV, EVNT_DRAW); break; case WIN_PROG_CV: //buttonData[BUT_CV_LNCV].backgnd = (wifiSetting.protocol == CLIENT_LNET) ? COLOR_CREAM : COLOR_LIGHTBLACK; setFieldsCV(); setBitsCV(); setStatusCV(); switchData[SW_POM].state = modeProg; createObject(OBJ_WIN, WIN_PROG_CV); createObject(OBJ_LABEL, LBL_CV); createObject(OBJ_LABEL, LBL_POM); createObject(OBJ_LABEL, LBL_BITS); createObject(OBJ_SWITCH, SW_POM); createObject(OBJ_BUTTON, BUT_CV_READ); createObject(OBJ_BUTTON, BUT_CV_CNCL); if (wifiSetting.protocol == CLIENT_LNET) createObject(OBJ_BUTTON, BUT_CV_LNCV); createObject(OBJ_KEYBOARD, KEYB_CV); createObject(OBJ_CHAR, CHAR_CV_EQUAL); createObject(OBJ_BUTTON, BUT_CV_0); createObject(OBJ_BUTTON, BUT_CV_1); createObject(OBJ_BUTTON, BUT_CV_2); createObject(OBJ_BUTTON, BUT_CV_3); createObject(OBJ_BUTTON, BUT_CV_4); createObject(OBJ_BUTTON, BUT_CV_5); createObject(OBJ_BUTTON, BUT_CV_6); createObject(OBJ_BUTTON, BUT_CV_7); createObject(OBJ_TXT, TXT_CV); createObject(OBJ_TXT, TXT_CV_VAL); createObject(OBJ_TXT, TXT_CV_STATUS); newEvent(OBJ_WIN, WIN_PROG_CV, EVNT_DRAW); break; case WIN_PROG_ADDR: getLabelTxt(LBL_CV_ADDR, buf); snprintf(cvStatusBuf, PWD_LNG + 1, "%s", buf); createObject(OBJ_WIN, WIN_PROG_ADDR); createObject(OBJ_TXT, TXT_CV_STATUS); createObject(OBJ_ICON, ICON_ADDR); createObject(OBJ_TXT, TXT_CV_ADDR); createObject(OBJ_KEYBOARD, KEYB_CV_ADDR); createObject(OBJ_BUTTON, BUT_ADDR_CNCL); newEvent(OBJ_WIN, WIN_PROG_ADDR, EVNT_DRAW); break; case WIN_PROG_LNCV: setFieldsLNCV(); createObject(OBJ_WIN, WIN_PROG_LNCV); createObject(OBJ_KEYBOARD, KEYB_LNCV); createObject(OBJ_LABEL, LBL_LNCV_ART); createObject(OBJ_LABEL, LBL_LNCV_MOD); createObject(OBJ_LABEL, LBL_LNCV_NUM); createObject(OBJ_BUTTON, BUT_LNCV_FIND); createObject(OBJ_BUTTON, BUT_LNCV_CNCL); createObject(OBJ_TXT, TXT_LNCV_ART); createObject(OBJ_TXT, TXT_LNCV_MOD); createObject(OBJ_TXT, TXT_LNCV_ADR); createObject(OBJ_TXT, TXT_LNCV_VAL); createObject(OBJ_CHAR, CHAR_LNCV_EQUAL); newEvent(OBJ_WIN, WIN_PROG_LNCV, EVNT_DRAW); break; case WIN_STEAM: fncData[FNC_ST_SMOKE].state = false; createObject(OBJ_WIN, WIN_STEAM); createObject(OBJ_DRAWSTR, DSTR_STEAM); createObject(OBJ_ICON, ICON_POWER); createObject(OBJ_ICON, ICON_MANOMETER); createObject(OBJ_ICON, ICON_STEAM_EDIT); createObject(OBJ_BUTTON, BUT_STEAM_CNCL); createObject(OBJ_FNC, FNC_ST_WATER); createObject(OBJ_FNC, FNC_ST_TENDER); createObject(OBJ_FNC, FNC_ST_WHISTLE); createObject(OBJ_FNC, FNC_ST_FIRE); createObject(OBJ_FNC, FNC_ST_SMOKE); createObject(OBJ_BAR, BAR_JOHNSON); createObject(OBJ_BAR, BAR_WATER); createObject(OBJ_BAR, BAR_TENDER); createObject(OBJ_BAR, BAR_BRAKE); newEvent(OBJ_WIN, WIN_STEAM, EVNT_DRAW); break; case WIN_UTIL: createObject(OBJ_WIN, WIN_UTIL); createObject(OBJ_BUTTON, BUT_UTL_I_SPEEDO); createObject(OBJ_BUTTON, BUT_UTL_T_SPEEDO); createObject(OBJ_BUTTON, BUT_UTL_I_STEAM); createObject(OBJ_BUTTON, BUT_UTL_T_STEAM); createObject(OBJ_BUTTON, BUT_UTL_I_SCAN); createObject(OBJ_BUTTON, BUT_UTL_T_SCAN); createObject(OBJ_BUTTON, BUT_UTL_I_STA); createObject(OBJ_BUTTON, BUT_UTL_T_STA); createObject(OBJ_ICON, ICON_UTL_EXIT); createObject(OBJ_DRAWSTR, DSTR_UTL_MENU); newEvent(OBJ_WIN, WIN_UTIL, EVNT_DRAW); break; case WIN_ACCESSORY: editAccessory = false; winData[WIN_ACCESSORY].backgnd = COLOR_WHITE; updateAccPanel(); createObject(OBJ_WIN, WIN_ACCESSORY); createObject(OBJ_BUTTON, BUT_ACC_0); createObject(OBJ_BUTTON, BUT_ACC_1); createObject(OBJ_BUTTON, BUT_ACC_2); createObject(OBJ_BUTTON, BUT_ACC_3); createObject(OBJ_BUTTON, BUT_ACC_4); createObject(OBJ_BUTTON, BUT_ACC_5); createObject(OBJ_BUTTON, BUT_ACC_6); createObject(OBJ_BUTTON, BUT_ACC_7); createObject(OBJ_BUTTON, BUT_ACC_8); createObject(OBJ_BUTTON, BUT_ACC_9); createObject(OBJ_BUTTON, BUT_ACC_10); createObject(OBJ_BUTTON, BUT_ACC_11); createObject(OBJ_BUTTON, BUT_ACC_12); createObject(OBJ_BUTTON, BUT_ACC_13); createObject(OBJ_BUTTON, BUT_ACC_14); createObject(OBJ_BUTTON, BUT_ACC_15); createObject(OBJ_BUTTON, BUT_ACC_CNCL); createObject(OBJ_BUTTON, BUT_ACC_EDIT); createObject(OBJ_TXT, TXT_ACC_0); createObject(OBJ_TXT, TXT_ACC_1); createObject(OBJ_TXT, TXT_ACC_2); createObject(OBJ_TXT, TXT_ACC_3); createObject(OBJ_TXT, TXT_ACC_4); createObject(OBJ_TXT, TXT_ACC_5); createObject(OBJ_TXT, TXT_ACC_6); createObject(OBJ_TXT, TXT_ACC_7); createObject(OBJ_TXT, TXT_ACC_8); createObject(OBJ_TXT, TXT_ACC_9); createObject(OBJ_TXT, TXT_ACC_10); createObject(OBJ_TXT, TXT_ACC_11); createObject(OBJ_TXT, TXT_ACC_12); createObject(OBJ_TXT, TXT_ACC_13); createObject(OBJ_TXT, TXT_ACC_14); createObject(OBJ_TXT, TXT_ACC_15); createObject(OBJ_TXT, TXT_PANEL); newEvent(OBJ_WIN, WIN_ACCESSORY, EVNT_DRAW); break; case WIN_PANELS: createObject(OBJ_WIN, WIN_PANELS); createObject(OBJ_TXT, TXT_PANEL0); createObject(OBJ_TXT, TXT_PANEL1); createObject(OBJ_TXT, TXT_PANEL2); createObject(OBJ_TXT, TXT_PANEL3); createObject(OBJ_TXT, TXT_PANEL4); createObject(OBJ_TXT, TXT_PANEL5); createObject(OBJ_TXT, TXT_PANEL6); createObject(OBJ_TXT, TXT_PANEL7); createObject(OBJ_TXT, TXT_PANEL8); createObject(OBJ_TXT, TXT_PANEL9); createObject(OBJ_TXT, TXT_PANEL10); createObject(OBJ_TXT, TXT_PANEL11); createObject(OBJ_TXT, TXT_PANEL12); createObject(OBJ_TXT, TXT_PANEL13); createObject(OBJ_TXT, TXT_PANEL14); createObject(OBJ_TXT, TXT_PANEL15); newEvent(OBJ_WIN, WIN_PANELS, EVNT_DRAW); break; case WIN_PANEL_NAME: snprintf(keybNameBuf, PANEL_LNG + 1, panelNameBuf); txtData[TXT_NAME].maxLength = PANEL_LNG; createObject(OBJ_WIN, WIN_PANEL_NAME); createObject(OBJ_TXT, TXT_NAME); createObject(OBJ_KEYBOARD, KEYB_NAME); createObject(OBJ_BUTTON, BUT_NAME_OK); createObject(OBJ_BUTTON, BUT_NAME_CNCL); newEvent(OBJ_WIN, WIN_PANEL_NAME, EVNT_DRAW); break; case WIN_ACC_CTRL: snprintf(accKeybAddr, ADDR_LNG + 1, "%d", myTurnout); createObject(OBJ_WIN, WIN_ACC_CTRL); createObject(OBJ_TXT, TXT_ACC_ADDR); createObject(OBJ_KEYBOARD, KEYB_ACC); createObject(OBJ_ICON, ICON_KEYB_ACC); createObject(OBJ_BUTTON, BUT_ACC_RED); createObject(OBJ_BUTTON, BUT_ACC_GREEN); newEvent(OBJ_WIN, WIN_ACC_CTRL, EVNT_DRAW); break; case WIN_ACC_ASPECT: createObject(OBJ_WIN, WIN_ACC_ASPECT); createObject(OBJ_BUTTON, BUT_ACC_ASPECT0); createObject(OBJ_BUTTON, BUT_ACC_ASPECT1); createObject(OBJ_BUTTON, BUT_ACC_ASPECT2); if (currAccAspects == 4) createObject(OBJ_BUTTON, BUT_ACC_ASPECT3); newEvent(OBJ_WIN, WIN_ACC_ASPECT, EVNT_DRAW); break; case WIN_ACC_TYPE: createObject(OBJ_WIN, WIN_ACC_TYPE); createObject(OBJ_LABEL, LBL_ACC_TYPE); createObject(OBJ_FNC, FNC_ACC_TYPE); newEvent(OBJ_WIN, WIN_ACC_TYPE, EVNT_DRAW); break; case WIN_ACC_EDIT: n = accDef[currAccEdit.type].aspects; winData[WIN_ACC_EDIT].h = 130 + (n * 40); buttonData[BUT_TYPE_OK].y = 93 + (n * 40); buttonData[BUT_TYPE_CNCL].y = 93 + (n * 40); iconData[ICON_TYPE_OK].y = 97 + (n * 40); iconData[ICON_TYPE_CNCL].y = 97 + (n * 40); createObject(OBJ_WIN, WIN_ACC_EDIT); createObject(OBJ_LABEL, LBL_ACC_NAME); createObject(OBJ_LABEL, LBL_ACC_ADDR); createObject(OBJ_TXT, TXT_ACC_NAME); createObject(OBJ_TXT, TXT_ACC_ADDR1); createObject(OBJ_FNC, FNC_EDIT_ASPECT0); createObject(OBJ_BUTTON, BUT_ACC_OUT0); createObject(OBJ_BUTTON, BUT_ACC_OUT1); if (n > 1) { createObject(OBJ_FNC, FNC_EDIT_ASPECT1); createObject(OBJ_BUTTON, BUT_ACC_OUT4); createObject(OBJ_BUTTON, BUT_ACC_OUT5); } if (n > 2) { createObject(OBJ_TXT, TXT_ACC_ADDR2); createObject(OBJ_ICON, ICON_PLUS_ONE); createObject(OBJ_FNC, FNC_EDIT_ASPECT2); createObject(OBJ_BUTTON, BUT_ACC_OUT2); createObject(OBJ_BUTTON, BUT_ACC_OUT3); createObject(OBJ_BUTTON, BUT_ACC_OUT6); createObject(OBJ_BUTTON, BUT_ACC_OUT7); createObject(OBJ_BUTTON, BUT_ACC_OUT8); createObject(OBJ_BUTTON, BUT_ACC_OUT9); createObject(OBJ_BUTTON, BUT_ACC_OUT10); createObject(OBJ_BUTTON, BUT_ACC_OUT11); } if (n > 3) { createObject(OBJ_FNC, FNC_EDIT_ASPECT3); createObject(OBJ_BUTTON, BUT_ACC_OUT12); createObject(OBJ_BUTTON, BUT_ACC_OUT13); createObject(OBJ_BUTTON, BUT_ACC_OUT14); createObject(OBJ_BUTTON, BUT_ACC_OUT15); } createObject(OBJ_BUTTON, BUT_TYPE_OK); createObject(OBJ_BUTTON, BUT_TYPE_CNCL); newEvent(OBJ_WIN, WIN_ACC_EDIT, EVNT_DRAW); break; case WIN_ACC_NAME: snprintf(keybNameBuf, ACC_LNG + 1, accKeybName); txtData[TXT_NAME].maxLength = ACC_LNG; createObject(OBJ_WIN, WIN_ACC_NAME); createObject(OBJ_TXT, TXT_NAME); createObject(OBJ_KEYBOARD, KEYB_NAME); createObject(OBJ_BUTTON, BUT_NAME_OK); createObject(OBJ_BUTTON, BUT_NAME_CNCL); newEvent(OBJ_WIN, WIN_ACC_NAME, EVNT_DRAW); break; case WIN_ACC_ADDR1: snprintf(accKeybAdrEdit, ADDR_LNG + 1, "%d", currAccEdit.addr); createObject(OBJ_WIN, WIN_ACC_ADDR1); createObject(OBJ_TXT, TXT_ACC_EDIT); createObject(OBJ_KEYBOARD, KEYB_ACC_ADDR); newEvent(OBJ_WIN, WIN_ACC_ADDR1, EVNT_DRAW); break; case WIN_ACC_ADDR2: snprintf(accKeybAdrEdit, ADDR_LNG + 1, "%d", currAccEdit.addr2); createObject(OBJ_WIN, WIN_ACC_ADDR2); createObject(OBJ_TXT, TXT_ACC_EDIT); createObject(OBJ_KEYBOARD, KEYB_ACC_ADDR); newEvent(OBJ_WIN, WIN_ACC_ADDR2, EVNT_DRAW); break; case WIN_WIFI_SCAN: setTimer(TMR_SCAN, 5, TMR_ONESHOT); createObject(OBJ_WIN, WIN_WIFI_SCAN); createObject(OBJ_DRAWSTR, DSTR_WIFI_SCAN); createObject(OBJ_LABEL, LBL_SSID_SCAN); createObject(OBJ_FNC, FNC_SCAN_RESET); newEvent(OBJ_WIN, WIN_WIFI_SCAN, EVNT_DRAW); break; case WIN_STA_RUN: updateStationTime(staTime); updateStationLevel(); updateStationStars(); updateTargetStations(); createObject(OBJ_WIN, WIN_STA_RUN); createObject(OBJ_LABEL, LBL_STA_RUN); createObject(OBJ_LABEL, LBL_STA_LEVEL); createObject(OBJ_LABEL, LBL_STA_INSTR); createObject(OBJ_FNC, FNC_STA_STARS); createObject(OBJ_ICON, ICON_STA_CLOCK); createObject(OBJ_ICON, ICON_STA_STATION); createObject(OBJ_ICON, ICON_STA_EDIT); createObject(OBJ_BUTTON, BUT_STA_START); createObject(OBJ_BUTTON, BUT_STA_CNCL); createObject(OBJ_TXT, TXT_STA_LEVEL); createObject(OBJ_TXT, TXT_STA_STARS); createObject(OBJ_TXT, TXT_STA_STATION); createObject(OBJ_TXT, TXT_STA_CLOCK); newEvent(OBJ_WIN, WIN_STA_RUN, EVNT_DRAW); break; case WIN_STA_PLAY: updateTurnoutButtons(); fncData[FNC_STA_RAYO].state = isTrackOff(); createObject(OBJ_WIN, WIN_STA_PLAY); createObject(OBJ_DRAWSTR, DSTR_STATION_PLAY); createObject(OBJ_ICON, ICON_STA_TARGET); createObject(OBJ_ICON, ICON_STA_TRAIN); createObject(OBJ_ICON, ICON_STA_PIN); createObject(OBJ_ICON, ICON_STA_TIME); createObject(OBJ_ICON, ICON_STA_COUNT); createObject(OBJ_TXT, TXT_STA_TIME); createObject(OBJ_TXT, TXT_STA_COUNT); createObject(OBJ_TXT, TXT_STA_STARC); createObject(OBJ_GAUGE, GAUGE_STATION); createObject(OBJ_FNC, FNC_STA_DIR); createObject(OBJ_FNC, FNC_STA_STARC); createObject(OBJ_FNC, FNC_STA_RAYO); createObject(OBJ_BUTTON, BUT_STA_STOP); switch (staMaxTurnout) { case 1: fncData[FNC_STA_ACC0].x = 104; buttonData[BUT_STA_ACC0].x = 100; createObject(OBJ_BUTTON, BUT_STA_ACC0); break; case 2: fncData[FNC_STA_ACC0].x = 54; fncData[FNC_STA_ACC1].x = 154; buttonData[BUT_STA_ACC0].x = 50; buttonData[BUT_STA_ACC1].x = 150; createObject(OBJ_BUTTON, BUT_STA_ACC0); createObject(OBJ_BUTTON, BUT_STA_ACC1); break; case 3: fncData[FNC_STA_ACC0].x = 40; fncData[FNC_STA_ACC1].x = 104; fncData[FNC_STA_ACC2].x = 168; buttonData[BUT_STA_ACC0].x = 36; buttonData[BUT_STA_ACC1].x = 100; buttonData[BUT_STA_ACC2].x = 164; createObject(OBJ_BUTTON, BUT_STA_ACC0); createObject(OBJ_BUTTON, BUT_STA_ACC1); createObject(OBJ_BUTTON, BUT_STA_ACC2); break; default: fncData[FNC_STA_ACC0].x = 20; fncData[FNC_STA_ACC1].x = 76; fncData[FNC_STA_ACC2].x = 132; fncData[FNC_STA_ACC3].x = 188; buttonData[BUT_STA_ACC0].x = 16; buttonData[BUT_STA_ACC1].x = 72; buttonData[BUT_STA_ACC2].x = 128; buttonData[BUT_STA_ACC3].x = 184; createObject(OBJ_BUTTON, BUT_STA_ACC0); createObject(OBJ_BUTTON, BUT_STA_ACC1); createObject(OBJ_BUTTON, BUT_STA_ACC2); createObject(OBJ_BUTTON, BUT_STA_ACC3); break; } newEvent(OBJ_WIN, WIN_STA_PLAY, EVNT_DRAW); break; case WIN_STA_STARS: createObject(OBJ_WIN, WIN_STA_STARS); if (staCurrTime > 0) { staStars++; createObject(OBJ_FNC, FNC_STA_STAR1); if (staCurrTime > 10) { // time remaining staStars++; createObject(OBJ_FNC, FNC_STA_STAR2); createObject(OBJ_LABEL, LBL_STA_EXCEL); } else { createObject(OBJ_LABEL, LBL_STA_GREAT); } updateStationStars(); } else { createObject(OBJ_ICON, ICON_STA_TIMEOUT); createObject(OBJ_LABEL, LBL_STA_TIMEOUT); } newEvent(OBJ_WIN, WIN_STA_STARS, EVNT_DRAW); break; case WIN_STA_EDIT: snprintf(staStartTimeBuf, IP_LNG + 1, "%d", staStartTime); snprintf(staStatNumBuf, IP_LNG + 1, "%d", staMaxStations); snprintf(staTurnNumBuf, IP_LNG + 1, "%d", staMaxTurnout); snprintf(staTurnout1Buf, ADDR_LNG + 1, "%d", staTurnoutAdr1); snprintf(staTurnout2Buf, ADDR_LNG + 1, "%d", staTurnoutAdr2); snprintf(staTurnout3Buf, ADDR_LNG + 1, "%d", staTurnoutAdr3); snprintf(staTurnout4Buf, ADDR_LNG + 1, "%d", staTurnoutAdr4); for (n = 0; n < 8; n++) switchData[SW_STA_OR1 + n].state = bitRead(staTurnoutDef, n); createObject(OBJ_WIN, WIN_STA_EDIT); createObject(OBJ_LABEL, LBL_STA_STATIONS); createObject(OBJ_LABEL, LBL_STA_TURNOUTS); createObject(OBJ_LABEL, LBL_STA_TIME); createObject(OBJ_LABEL, LBL_STA_DESC); createObject(OBJ_TXT, TXT_STA_STARTTIME); createObject(OBJ_TXT, TXT_STA_STATNUM); createObject(OBJ_TXT, TXT_STA_TURNNUM); createObject(OBJ_TXT, TXT_STA_TURNOUT1); createObject(OBJ_TXT, TXT_STA_TURNOUT2); createObject(OBJ_TXT, TXT_STA_TURNOUT3); createObject(OBJ_TXT, TXT_STA_TURNOUT4); createObject(OBJ_BUTTON, BUT_STA_EDIT); createObject(OBJ_SWITCH, SW_STA_OR1); createObject(OBJ_SWITCH, SW_STA_OR2); createObject(OBJ_SWITCH, SW_STA_OR3); createObject(OBJ_SWITCH, SW_STA_OR4); createObject(OBJ_SWITCH, SW_STA_INV1); createObject(OBJ_SWITCH, SW_STA_INV2); createObject(OBJ_SWITCH, SW_STA_INV3); createObject(OBJ_SWITCH, SW_STA_INV4); createObject(OBJ_BUTTON, BUT_STA_STAM); createObject(OBJ_BUTTON, BUT_STA_STAP); createObject(OBJ_BUTTON, BUT_STA_TURNM); createObject(OBJ_BUTTON, BUT_STA_TURNP); newEvent(OBJ_WIN, WIN_STA_EDIT, EVNT_DRAW); break; case WIN_STA_KEYB: createObject(OBJ_WIN, WIN_STA_KEYB); createObject(OBJ_KEYBOARD, KEYB_STA); newEvent(OBJ_WIN, WIN_STA_KEYB, EVNT_DRAW); break; } } void alertWindow(byte err) { errType = err; createObject(OBJ_WIN, WIN_ALERT); switch (err) { case ERR_SERV: createObject(OBJ_ICON, ICON_WARNING); createObject(OBJ_ICON, ICON_WARNING_ON); createObject(OBJ_LABEL, LBL_SERVICE); break; case ERR_CHG_WIFI: createObject(OBJ_ICON, ICON_INFO); createObject(OBJ_LABEL, LBL_CHG_WIFI); break; case ERR_FULL: createObject(OBJ_ICON, ICON_WARNING); createObject(OBJ_ICON, ICON_WARNING_ON); createObject(OBJ_LABEL, LBL_STACK_FULL); break; case ERR_STOP: createObject(OBJ_ICON, ICON_ESTOP); createObject(OBJ_LABEL, LBL_ESTOP); break; case ERR_WAIT: case ERR_CV: barData[BAR_WAIT].value = 0; setTimer(TMR_WAIT, 5, TMR_ONESHOT); if (err == ERR_WAIT) createObject(OBJ_ICON, ICON_WAIT); else createObject(OBJ_ICON, ICON_WAIT_CV); createObject(OBJ_BAR, BAR_WAIT); break; case ERR_ASK_SURE: createObject(OBJ_ICON, ICON_WARNING); createObject(OBJ_ICON, ICON_WARNING_ON); createObject(OBJ_LABEL, LBL_ASK_SURE); createObject(OBJ_BUTTON, BUT_SURE_OK); createObject(OBJ_BUTTON, BUT_SURE_CNCL); break; } newEvent(OBJ_WIN, WIN_ALERT, EVNT_DRAW); }