/** * Copyright (c) 2020 * * CENTIRM HotelTV Core javascript. * * @summary short description for the file * @author Joel * * Created at : 2020-11-26 02:21:56 * Last modified : 2020-11-26 15:31:40 */ var HotelTV = HotelTV || { 'devinfo': {}, 'svrinfo': {}, 'services': {}, 'settings': {}, 'hotelinfo': {}, 'guestinfo': {}, 'opening': {}, 'flight': {}, 'weather': {}, 'epg': {}, 'news': {}, 'widget': {}, 'tvguide': {}, 'message': {}, 'translation': {}, 'state': { 'lang': 'en-US', 'menu': { 'stage': { 'cur':null, 'prev':null, }, 'main': { 'cnt': 0, 'cur': null, 'prev': null, }, }, 'flight': { 'cur_location': null, }, 'weather': { 'default_location': null, }, 'media': { 'playing': false, }, 'tv':{ 'playing': false, 'shortkey': { 'idx': null, // 바로가기 번호 UI의 행번호(0부터 시작) 'ch_item_idx': null, // ALL Category내에서의 채널 index 'scroll_offset': null, }, }, 'external_input':{ 'connected': false, 'last_input': { 'type': 0, 'index': 0 } }, 'hotkey': { "mm": {} }, 'schedule': { 'flight_reflash': false, 'weather_reflash': false, 'widget_reflash': false }, 'theme_root': null, 'token': null }, 'carts': { 'amenity': { }, 'roomservice': { } }, 'orders': { 'amenity': { }, 'roomservice': { } }, 'dbginfo': { 'en': false, 'emulator': false, //PC에서 emulation할때, true로 설정, 타겟 셋트에서는 false로 설정할것 'hcap_ipc': false, //WEBOS HCAP 라이브러리 내부 메시치 출력 enable/disable 'output': 'osd', 'webdebugger': true //WEBOS 웹 디버거 enable/disable }, 'media_hndl': null, }; HotelTV.namespace = function(ns_string) { var parts = ns_string.split('.'), parent = HotelTV, i; // 처음에 중복되는 전역 객체명은 제거한다. if (parts[0] == 'HotelTV') { parts = parts.slice(1); } for (i = 0; i < parts.length; i += 1) { if (typeof parent[parts[i]] == 'undefined') { parent[parts[i]] = {}; } parent = parent[parts[i]]; } return parent; }; //// 비공개 매써드 /** * HCAP Wrapper Function::> Get ProCentric Server Info(Realted HCAP API:hcap.system.getHotelMode) * @param {string} sz_key property key name. * @param {callback} callback is callback object */ function __fxn_Set_DebugOpt(_enable, _out_option, _init) { HotelTV.dbginfo['en'] = _enable; HotelTV.dbginfo['output'] = _out_option; HotelTV.hal.Init(); /** Develop Mode definitions */ console.log("OPT" + navigator.appVersion); if (navigator.appVersion.includes("Web0S") == true) { HotelTV.dbginfo['emulator'] = false; HotelTV.devinfo['manufacture'] = "LG"; HotelTV.devinfo['tvOS'] = "Web0S"; /** Set HCAP Debug Options */ if (HotelTV.dbginfo['emulator'] == false) { //Enable/Disable browser debug mode HotelTV.hal.SetBrowserDebug(HotelTV.dbginfo['hcap_ipc'], HotelTV.dbginfo['webdebugger']); } } else if (navigator.appVersion.includes("Tizen") == true) { HotelTV.dbginfo['emulator'] = false; HotelTV.devinfo['manufacture'] = "SAMSUNG"; HotelTV.devinfo['tvOS'] = "Tizen"; } else { HotelTV.dbginfo['emulator'] = true; } if (HotelTV.dbginfo['output'] == 'osd') { if (HotelTV.dbginfo['en'] == true) { var logger = document.getElementById('debugwin'); if ( logger!=null ) { var dateNow = new Date(); var hours = dateNow.getHours(); var minutes = dateNow.getMinutes(); var seconds = dateNow.getSeconds(); if (hours < 10) { hours = "0" + hours; } if (minutes < 10) { minutes = "0" + minutes; } if (seconds < 10) { seconds = "0" + seconds; } if(logger.style.display!='block'){ logger.style.display = 'block'; } console.log = function(logmsg) { var _dispMsg = hours + ":" + minutes + ":" + seconds + "-> "; if (typeof logmsg == 'object') { _dispMsg += (JSON && JSON.stringify ? JSON.stringify(logmsg) : logmsg) + '
'; } else { _dispMsg += logmsg + '
'; } _dispMsg += logger.innerHTML; logger.innerHTML = _dispMsg; } } } } else { if (HotelTV.dbginfo['en'] != true) { console.log = function(logmsg) { } } } }; HotelTV.Init = async function() { console.log("Start Initialization:: "); //STEP#01::> Shutdown Channel HotelTV.hal.ChannelShutDown(); //SETP#02::> Set Debug Options __fxn_Set_DebugOpt(false, 'osd', false); //__fxn_Set_DebugOpt(true, 'native', false); //STEP#03::> Get Device Info HotelTV.ui_utils.SetBusy(true); const __ifxn_showFatalErr_Network = function() { let _tmval = 30; setTimeout(HotelTV.hal.Reboot, 29000); HotelTV.ui_utils.SetBusy(false); HotelTV.ui_utils.ShowErrMsg(true, "system.error.get-devinfo", "SYSTEM ERROR", "Network is un-available.\r\nplease contact your system administrator.", { "timeout": _tmval, "cb_disp": function() { _tmval -= 1; console.log("time..." + _tmval); if ($('.error #countdown').css("display") == "none") { $('.error #countdown').fadeIn(1000); } $('.error #countdown #message').text(`System will be reboot in ${_tmval} second...`); }, "cb_eoe": null }); } try { // let __netStatus = await HotelTV.hal.GetNetworkStatus(); if ( __netStatus.info==null || __netStatus.error==true ){ console.info("aa"); __ifxn_showFatalErr_Network(); return; } else { console.info("bb"); if ( __netStatus.info.ip_address=="0.0.0.0" || __netStatus.info.gateway=="0.0.0.0" ) { console.info("Fatall......."); __ifxn_showFatalErr_Network(); return; } } } catch ( _err ) { console.info("cc"); __ifxn_showFatalErr_Network(); return; } try { await HotelTV.hal.GetDevInfo(); //await HotelTV.hal.ShowDevInfo(); } catch (_error) { let _tmval = 50; setTimeout(HotelTV.hal.Reboot, 49000); HotelTV.ui_utils.ShowErrMsg(true, "system.error.get-devinfo", "SYSTEM ERROR", "Fail to get System Information.\r\nplease contact your system administrator.", { "timeout": _tmval, "cb_disp": function() { _tmval -= 1; console.log("time..." + _tmval); if ($('.error #countdown').css("display") == "none") { $('.error #countdown').fadeIn(1000); } $('.error #countdown #message').text(`System will be reboot in ${_tmval} second...`); }, "cb_eoe": null }); } //STEP#04::> API Module INIT await HotelTV.api.Init(HotelTV.svrinfo.ipaddr, HotelTV.svrinfo.port, HotelTV.devinfo.model_name.substring(2, HotelTV.devinfo.model_name.length - 1), HotelTV.devinfo.serial_number); try { let __apiRet = await HotelTV.api.CheckRegistration(); HotelTV.state['registration'] = await HotelTV.api.CheckRegistration(); } catch (_error) { let _tmval = 50; setTimeout(HotelTV.hal.Reboot, 49000); HotelTV.ui_utils.ShowErrMsg(true, "system.error.check-registration", "SYSTEM ERROR", "Un registered device.\r\nplease contact your system administrator.", { "timeout": _tmval, "cb_disp": function() { _tmval -= 1; console.log("time..." + _tmval); if ($('.error #countdown').css("display") == "none") { $('.error #countdown').fadeIn(1000); } $('.error #countdown #message').text(`The Device ID is ${HotelTV.devinfo.serial_number}.\r\n\r\nSystem will be reboot in ${_tmval} second...`); }, "cb_eoe": null }); } if (HotelTV.state['registration'].registered != true) { console.log("Show up and unregistered device"); } //STEP05::> CHECK HOTELTV LICENSE if (HotelTV.state['registration'].license == 'hotel-full') { // FULL LICENSE MODE try { HotelTV.settings = await HotelTV.api.GetSettings(); let need_reboot = await HotelTV.hal.SetDevice(HotelTV.settings); if (need_reboot == true) { console.log("System Need to Reboot"); HotelTV.ui_utils.SetBusy(false); let _tmval = 30; setTimeout(HotelTV.hal.Reboot, 29000); HotelTV.ui_utils.ShowErrMsg(true, "system.info.change-configuration", "SYSTEM INFO", `System configuration was changed.\r\n\r\nSystem information summary::\r\nDevice Serial Number: ${HotelTV.devinfo.serial_number}\r\nThe Device Model Name: ${HotelTV.devinfo.model_name}\r\nNetwork Configuration:${HotelTV.devinfo.network_info.ip_address}/${HotelTV.devinfo.network_info.subnet_mask}/${HotelTV.devinfo.network_info.gateway}`, { "timeout": _tmval, "cb_disp": function() { _tmval -= 1; //console.log("time..." + _tmval); if ($('.error #countdown').css("display") == "none") { $('.error #countdown').fadeIn(1000); } $('.error #countdown #message').text(`System will be reboot in ${_tmval} second...`); }, "cb_eoe": null }); return; } } catch (_error) { let _tmval = 50; setTimeout(HotelTV.hal.Reboot, 49000); HotelTV.ui_utils.ShowErrMsg(true, "system.set-devinfo", "SYSTEM ERROR", "Fail to configure device.\r\nplease contact your system administrator.", { "timeout": _tmval, "cb_disp": function() { _tmval -= 1; //console.log("time..." + _tmval); if ($('.error #countdown').css("display") == "none") { $('.error #countdown').fadeIn(1000); } $('.error #countdown #message').text(`The Device ID is ${HotelTV.devinfo.serial_number}.\r\n\r\nSystem will be reboot in ${_tmval} second...`); }, "cb_eoe": null }); } try { HotelTV.hotelinfo = await HotelTV.api.GetHotelInfo(); } catch (_error) { let _tmval = 50; setTimeout(HotelTV.hal.Reboot, 49000); HotelTV.ui_utils.ShowErrMsg(true, "system.error.get-hotelinfo", "SYSTEM ERROR", "Fail to get hotel information.\r\nplease contact your system administrator.", { "timeout": _tmval, "cb_disp": function() { _tmval -= 1; //console.log("time..." + _tmval); if ($('.error #countdown').css("display") == "none") { $('.error #countdown').fadeIn(1000); } $('.error #countdown #message').text(`The Device ID is ${HotelTV.devinfo.serial_number}.\r\n\r\nSystem will be reboot in ${_tmval} second...`); }, "cb_eoe": null }); } // state[theme_root] 정의 // For Reference: // 조선 : HJS00001 // 인스파이어 : HIN00001 // 임페리얼 : HIM00001 HotelTV.state['theme_root'] = HotelTV.hotelinfo.siteCode; try { HotelTV.guestinfo = await HotelTV.api.GetGuestInfo(); } catch (_error) { let _tmval = 50; setTimeout(HotelTV.hal.Reboot, 49000); HotelTV.ui_utils.ShowErrMsg(true, "system.error.get-guestinfo", "SYSTEM ERROR", "Fail to get guest information.\r\nplease contact your system administrator.", { "timeout": _tmval, "cb_disp": function() { _tmval -= 1; //console.log("time..." + _tmval); if ($('.error #countdown').css("display") == "none") { $('.error #countdown').fadeIn(1000); } $('.error #countdown #message').text(`The Device ID is ${HotelTV.devinfo.serial_number}.\r\n\r\nSystem will be reboot in ${_tmval} second...`); }, "cb_eoe": null }); } try { HotelTV.opening = await HotelTV.api.GetOpeningCtz(); } catch (_error) { let _tmval = 50; setTimeout(HotelTV.hal.Reboot, 49000); HotelTV.ui_utils.ShowErrMsg(true, "system.error.get-openingctzinfo", "SYSTEM ERROR", "Fail to get opening contents information.\r\nplease contact your system administrator.", { "timeout": _tmval, "cb_disp": function() { _tmval -= 1; //console.log("time..." + _tmval); if ($('.error #countdown').css("display") == "none") { $('.error #countdown').fadeIn(1000); } $('.error #countdown #message').text(`The Device ID is ${HotelTV.devinfo.serial_number}.\r\n\r\nSystem will be reboot in ${_tmval} second...`); }, "cb_eoe": null }); } try { HotelTV.weather = await HotelTV.api.GetWeather(); } catch (_error) { console.error("Display Error page for get Weather info"); } try { HotelTV.flight = await HotelTV.api.GetFlight(); } catch (_error) { console.error("Display Error page for get flight info"); } try { HotelTV.widget = await HotelTV.api.GetWidgetCtz(); } catch (_error) { let _tmval = 50; setTimeout(HotelTV.hal.Reboot, 49000); //console.log("Display Error page for get widget info"); HotelTV.ui_utils.ShowErrMsg(true, "system.error.get-widget", "SYSTEM ERROR", "Fail to get tv widget contents information.\r\nplease contact your system administrator.", { "timeout": _tmval, "cb_disp": function() { _tmval -= 1; //console.log("time..." + _tmval); if ($('.error #countdown').css("display") == "none") { $('.error #countdown').fadeIn(1000); } $('.error #countdown #message').text(`The Device ID is ${HotelTV.devinfo.serial_number}.\r\n\r\nSystem will be reboot in ${_tmval} second...`); }, "cb_eoe": null }); } try { HotelTV.tvguide = await HotelTV.api.GetProgramCtz(); } catch (_error) { let _tmval = 50; setTimeout(HotelTV.hal.Reboot, 49000); //console.log("Display Error page for get tvguide info"); HotelTV.ui_utils.ShowErrMsg(true, "system.error.get-tvguideinfo", "SYSTEM ERROR", "Fail to get tv program contents information.\r\nplease contact your system administrator.", { "timeout": _tmval, "cb_disp": function() { _tmval -= 1; //console.log("time..." + _tmval); if ($('.error #countdown').css("display") == "none") { $('.error #countdown').fadeIn(1000); } $('.error #countdown #message').text(`The Device ID is ${HotelTV.devinfo.serial_number}.\r\n\r\nSystem will be reboot in ${_tmval} second...`); }, "cb_eoe": null }); } try { HotelTV.news = await HotelTV.api.GetNews(); } catch (_error) { console.error("Display Error page for get news info"); } try { HotelTV.message = await HotelTV.api.GetMessage(); } catch (_error) { console.error("Display Error page for get news info"); } try { HotelTV.translation = await HotelTV.api.GetTranslation(); } catch (_error) { console.error("Display Error page for get translation info"); } //Save to Session sessionStorage.setItem("dbginfo", JSON.stringify(HotelTV.dbginfo)); sessionStorage.setItem("devinfo", JSON.stringify(HotelTV.devinfo)); sessionStorage.setItem("svrinfo", JSON.stringify(HotelTV.svrinfo)); sessionStorage.setItem("settings", JSON.stringify(HotelTV.settings)); sessionStorage.setItem("state", JSON.stringify(HotelTV.state)); sessionStorage.setItem("hotelinfo", JSON.stringify(HotelTV.hotelinfo)); sessionStorage.setItem("guestinfo", JSON.stringify(HotelTV.guestinfo)); sessionStorage.setItem("opening", JSON.stringify(HotelTV.opening)); sessionStorage.setItem("flight", JSON.stringify(HotelTV.flight)); sessionStorage.setItem("weather", JSON.stringify(HotelTV.weather)); sessionStorage.setItem("widget", JSON.stringify(HotelTV.widget)); sessionStorage.setItem("tvguide", JSON.stringify(HotelTV.tvguide)); sessionStorage.setItem("news", JSON.stringify(HotelTV.news)); sessionStorage.setItem("message", JSON.stringify(HotelTV.message)); sessionStorage.setItem("translation", JSON.stringify(HotelTV.translation)); //Now Switch Over Welcome page const __ifxn_getAndrestorBgServiceInfo = async function() { try { HotelTV.services = await HotelTV.api.GetServiceInfo(); sessionStorage.setItem("services", JSON.stringify(HotelTV.services)); } catch (_error) { console.error("Display Error page for get service info"); } } if (HotelTV.opening != null ) { if ( HotelTV.guestinfo.watchTV==true ) { HotelTV.state.lang = HotelTV.guestinfo.language; __ifxn_getAndrestorBgServiceInfo(); HotelTV.UnloadWelCome(true, 2000); } else { $(".startup").fadeOut(1000, function() { window.location.replace('./wellcome.html'); }); } } else { __ifxn_getAndrestorBgServiceInfo(); HotelTV.state.lang = HotelTV.guestinfo.language; HotelTV.UnloadWelCome(true, 2000); } } else { let _tmval = 60; setTimeout(HotelTV.hal.Reboot, 59000); HotelTV.ui_utils.ShowErrMsg(true, "system.error.unregistered-device", "SYSTEM ERROR", "This device is not a registered device or is an invalid licensed device.\r\nplease contact your system administrator.", { "timeout": _tmval, "cb_disp": function() { _tmval -= 1; $('.error #countdown #message').text(`The Device ID is ${HotelTV.devinfo.serial_number}.\r\n\r\nSystem need to be reboot`); if ($('.error #countdown').css("display") == "none") { $('.error #countdown').fadeIn(1000); } }, "cb_eoe": null } ); } console.log("Initialization:: Done"); HotelTV.ui_utils.SetBusy(false); //SpatialNavigation.init(); }; HotelTV.LoadWelCome = async function() { //Turn Off HCAP api log extDisableHcapConsoleLog = true; HotelTV.dbginfo = await JSON.parse(sessionStorage.getItem("dbginfo")); //SETP#02::> Set Debug Options __fxn_Set_DebugOpt(false, 'native', true); HotelTV.devinfo = await JSON.parse(sessionStorage.getItem("devinfo")); HotelTV.svrinfo = await JSON.parse(sessionStorage.getItem("svrinfo")); //STEP#03:API Module INIT await HotelTV.api.Init(HotelTV.svrinfo.ipaddr, HotelTV.svrinfo.port, HotelTV.devinfo.model_name.substring(2, HotelTV.devinfo.model_name.length - 1), HotelTV.devinfo.serial_number); HotelTV.settings = await JSON.parse(sessionStorage.getItem("settings")); HotelTV.guestinfo = await JSON.parse(sessionStorage.getItem("guestinfo")); HotelTV.hotelinfo = await JSON.parse(sessionStorage.getItem("hotelinfo")); HotelTV.opening = await JSON.parse(sessionStorage.getItem("opening")); HotelTV.widget = await JSON.parse(sessionStorage.getItem("widget")); HotelTV.tvguide = await JSON.parse(sessionStorage.getItem("tvguide")); try { HotelTV.services = await HotelTV.api.GetServiceInfo(); sessionStorage.setItem("services", JSON.stringify(HotelTV.services)); } catch (_error) { console.error("Display Error page for get service info"); } //HotelTV.translation = await JSON.parse(sessionStorage.getItem("translation")); try { HotelTV.translation = await HotelTV.api.GetTranslation(); } catch (_error) { console.error("Display Error page for get translation info"); } //Set checkined guest language HotelTV.state.lang = HotelTV.guestinfo.language; let _res = HotelTV.devinfo.display_resolution.split("x"); HotelTV.ui_welcome.Init(_res[0], _res[1]); //await HotelTV.hal.ShowDevInfo(); HotelTV.ui_welcome.Show(); //STEP#06 Register Service web worker if (window.SharedWorker) { const myWorker = new SharedWorker("./lib/hoteltv.service.js"); myWorker.port.postMessage({ 'cmd': "start_service", "param": { "token": HotelTV.state.token, "dev_family": HotelTV.devinfo.model_name.substring(2, HotelTV.devinfo.model_name.length - 1), "dev_snum": HotelTV.devinfo.serial_number, "svrinfo": HotelTV.svrinfo, }, }); myWorker.port.onmessage = function(e) { let recvMsg = e.data; //console.log(`Recv Msg[${recvMsg.event}]::> ${recvMsg.ret} ::> ${recvMsg.data}`); //console.log(`Recv Msg[${recvMsg.event}]::> ${recvMsg.ret}`); if (recvMsg.event == "update_report") { HotelTV.hal.GetUptime(); HotelTV.hal.GetDeviceUsage().then(_usage => { //console.log(`USAGE::> CPU[${_usage.cpu}%]`); HotelTV.api.ReportBrief(HotelTV.devinfo, HotelTV.guestinfo, _usage); }); } } } else { console.error('Your browser doesn\'t support web workers.') } //STEP#07 MQTT Service if (HotelTV.services) { if (HotelTV.services.mqtt) { let _mqttSvcInfo = HotelTV.services.mqtt; if (_mqttSvcInfo.protocol == "ws") { HotelTV.services.client = mqtt.connect( //'ws://' + HotelTV.svrinfo.ipaddr + ':9001', 'ws://' + _mqttSvcInfo.host + ':' + _mqttSvcInfo.port, { clean: true, // retain session connectTimeout: 4000, // Timeout period username: _mqttSvcInfo.username, password: _mqttSvcInfo.password, clientId: 'mqtt_sid_' + HotelTV.devinfo.serial_number.substring(0, 12) } ); HotelTV.services.client.on('connect', function() { HotelTV.services.client.subscribe(_mqttSvcInfo.topic, function(err) { if (err) { console.error(`Fail to subscribe::TOPIC[${_mqttSvcInfo.topic}]`); } else { console.log(`Success to subscribe::TOPIC[${_mqttSvcInfo.topic}]`); } }); }) HotelTV.services.client.on('message', function(topic, message) { let szMsg = message.toString(); HotelTV.ui_welcome.MqttEvent(szMsg); //MQTT메시지 종료 하려면 아래 end호출 //HotelTV.services.client.end() }) HotelTV.services.client.on('error', function(error) { // message is Buffer console.error(error.toString()); //HotelTV.services.client.end() }) } } } } HotelTV.UnloadWelCome = async function(_skip_ui_close=false, _main_load_delay=1000) { sessionStorage.setItem("state", JSON.stringify(HotelTV.state)); if ( _skip_ui_close==false ){ HotelTV.ui_welcome.Close(); } //MQTT Disconnect if( HotelTV.services.client ){ HotelTV.services.client.end(); } if (HotelTV.state['registration'].license == 'hotel-full') { const __ifxn_replace_page = function() { window.location.replace('./app_hoteltv_full.html'); } setTimeout(__ifxn_replace_page, _main_load_delay); } } HotelTV.LoadAppFull = async function() { //Turn Off HCAP api log extDisableHcapConsoleLog = true; HotelTV.ui_utils.SetBusy(true); //STEP#01: Load session info HotelTV.dbginfo = await JSON.parse(sessionStorage.getItem("dbginfo")); //SETP#02::> Set Debug Options __fxn_Set_DebugOpt(false, 'native', true); HotelTV.devinfo = await JSON.parse(sessionStorage.getItem("devinfo")); HotelTV.svrinfo = await JSON.parse(sessionStorage.getItem("svrinfo")); HotelTV.services = await JSON.parse(sessionStorage.getItem("services")); //STEP#02: Init HotelTV API await HotelTV.api.Init(HotelTV.svrinfo.ipaddr, HotelTV.svrinfo.port, HotelTV.devinfo.model_name.substring(2, HotelTV.devinfo.model_name.length - 1), HotelTV.devinfo.serial_number); HotelTV.settings = await JSON.parse(sessionStorage.getItem("settings")); HotelTV.guestinfo = await JSON.parse(sessionStorage.getItem("guestinfo")); HotelTV.hotelinfo = await JSON.parse(sessionStorage.getItem("hotelinfo")); HotelTV.weather = await JSON.parse(sessionStorage.getItem("weather")); HotelTV.opening = await JSON.parse(sessionStorage.getItem("opening")); HotelTV.widget = await JSON.parse(sessionStorage.getItem("widget")); HotelTV.tvguide = await JSON.parse(sessionStorage.getItem("tvguide")); HotelTV.flight = await JSON.parse(sessionStorage.getItem("flight")); HotelTV.news = await JSON.parse(sessionStorage.getItem("news")); HotelTV.message = await JSON.parse(sessionStorage.getItem("message")); try { HotelTV.epg = await HotelTV.api.GetEpg(); } catch (_error) { console.error("Display Error page for get epg info"); } try { let _result = await HotelTV.api.DeleteAmenityCarts(null); HotelTV.carts.amenity = await HotelTV.api.GetAmenityCarts(null); } catch (_error) { console.error("Display Error page for get amenity carts info"); } try { let _result = await HotelTV.api.DeleteRoomserviceCarts(null); HotelTV.carts.roomservice = await HotelTV.api.GetRoomserviceCarts(); } catch (_error) { console.error("Display Error page for get roomservicec carts info"); } try { HotelTV.orders.amenity = await HotelTV.api.GetAmenityOrders(null); } catch (_error) { console.error("Display Error page for get amenity order info"); } try { HotelTV.orders.roomservice = await HotelTV.api.GetRoomserviceOrders(null); } catch (_error) { console.error("Display Error page for get roomservice order info"); } try { HotelTV.translation = await HotelTV.api.GetTranslation(); } catch (_error) { console.error("Display Error page for get translation info"); } //HotelTV.translation = await JSON.parse(sessionStorage.getItem("translation")); //Override Lang if needed try { let Usr_Dataset = await HotelTV.api.GetUsrDataset(); if ( 'next_lang' in Usr_Dataset ){ HotelTV.state.lang = Usr_Dataset.next_lang; } } catch (_error) { console.error("Fail to get user data set"); } //STEP#03: INIT HCAP for HotelTV FullAPP let tmrAppAuth = setInterval(async function() { let _foundNetflix = false; let _hcapAppInfo = await HotelTV.hal.PreAppGetInfo(false); HotelTV.state['hcap_app'] = _hcapAppInfo.applist; for (_i = 0; _i < HotelTV.state['hcap_app'].length; _i++) { if (HotelTV.state['hcap_app'][_i].title == "Netflix") { console.log("Found out netflix among of pre hcap app-list.") clearInterval(tmrAppAuth); } } if (_foundNetflix == false) { try { let siAppToken = null; let siAppName = null; // siApp Token Authentication let _progam = HotelTV.tvguide.program; for (let _i = 1; _i <= _progam.length; _i++) { if (_progam[_i].type == "application" && _progam[_i].service == "netflix") { siAppToken = await HotelTV.api.DownloadData(_progam[_i].license.file.download); siAppName = _progam[_i].service; //siAppToken = _progam[_i].service; if (siAppName && siAppToken) { HotelTV.hal.siAppAuth(siAppName, siAppToken, false); } } } } catch (_error) { console.error("Display Error page for get siApp Auth"); } } }, 5000); //STEP#05: Set Display size let _res = HotelTV.devinfo.display_resolution.split("x"); HotelTV.ui_appfull.Init(_res[0], _res[1]); //STEP#06; Show UI //await HotelTV.hal.ShowDevInfo(); HotelTV.ui_appfull.Show(); //STEP#06 Register Service web worker if (window.SharedWorker) { const myWorker = new SharedWorker("./lib/hoteltv.service.js"); myWorker.port.postMessage({ 'cmd': "start_service", "param": { "token": HotelTV.state.token, "dev_family": HotelTV.devinfo.model_name.substring(2, HotelTV.devinfo.model_name.length - 1), "dev_snum": HotelTV.devinfo.serial_number, "svrinfo": HotelTV.svrinfo, }, }); myWorker.port.onmessage = function(e) { let recvMsg = e.data; //console.log(`Recv Msg[${recvMsg.event}]::> ${recvMsg.ret} ::> ${recvMsg.data}`); //console.log(`Recv Msg[${recvMsg.event}]::> ${recvMsg.ret}`); if (recvMsg.event == "update_epg") { if (recvMsg.ret === "OK") { HotelTV.epg = recvMsg.data; HotelTV.ui_appfull.UpdateEpg(); } } else if (recvMsg.event == "update_flight") { if (recvMsg.ret === "OK") { HotelTV.flight =recvMsg.data; } } else if (recvMsg.event == "update_weather") { if (recvMsg.ret === "OK") { HotelTV.weather = recvMsg.data; } } else if (recvMsg.event == "update_wiget") { if (recvMsg.ret === "OK") { HotelTV.widget = recvMsg.data; } } else if (recvMsg.event == "update_report") { HotelTV.hal.GetUptime(); HotelTV.hal.GetDeviceUsage().then(_usage => { //console.log(`USAGE::> CPU[${_usage.cpu}%]`); HotelTV.api.ReportBrief(HotelTV.devinfo, HotelTV.guestinfo, _usage); }); } // BGServiceEvent function for post processing HotelTV.ui_appfull.BGServiceEvent(recvMsg.event); } } else { console.error('Your browser doesn\'t support web workers.') } //STEP#07 MQTT Service if (HotelTV.services) { if (HotelTV.services.mqtt) { let _mqttSvcInfo = HotelTV.services.mqtt; if (_mqttSvcInfo.protocol == "ws") { HotelTV.services.client = mqtt.connect( //'ws://' + HotelTV.svrinfo.ipaddr + ':9001', 'ws://' + _mqttSvcInfo.host + ':' + _mqttSvcInfo.port, { clean: true, // retain session connectTimeout: 4000, // Timeout period username: _mqttSvcInfo.username, password: _mqttSvcInfo.password, clientId: 'mqtt_sid_' + HotelTV.devinfo.serial_number.substring(0, 12) } ); HotelTV.services.client.on('connect', function() { HotelTV.services.client.subscribe(_mqttSvcInfo.topic, function(err) { if (err) { console.error(`Fail to subscribe::TOPIC[${_mqttSvcInfo.topic}]`); } else { console.log(`Success to subscribe::TOPIC[${_mqttSvcInfo.topic}]`); } }); }) HotelTV.services.client.on('message', function(topic, message) { let szMsg = message.toString(); HotelTV.ui_appfull.MqttEvent(szMsg); //MQTT메시지 종료 하려면 아래 end호출 //HotelTV.services.client.end() }) HotelTV.services.client.on('error', function(error) { // message is Buffer console.error(error.toString()); //HotelTV.services.client.end() }) } } } // //HotelTV.hal.Test(); } HotelTV.UnloadAppFull = async function() { //MQTT Disconnect if( HotelTV.services.client ){ HotelTV.services.client.end(); } } HotelTV.Deinit = function() { console.log("Start De-Initialization:: "); //HotelTV.service.Deinit(); }