index.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524
  1. <?php
  2. include_once '../auth.php';
  3. ?>
  4. <html>
  5. <meta name="apple-mobile-web-app-capable" content="yes" />
  6. <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1"/>
  7. <head>
  8. <script type='text/javascript' charset='utf-8'>
  9. // Hides mobile browser's address bar when page is done loading.
  10. window.addEventListener('load', function(e) {
  11. setTimeout(function() { window.scrollTo(0, 1); }, 1);
  12. }, false);
  13. </script>
  14. <title>Homdynm UI</title>
  15. <link rel="stylesheet" href="script/tocas/tocas.css">
  16. <script src="script/tocas/tocas.js"></script>
  17. <script src="script/jquery.min.js"></script>
  18. <script src="../script/ao_module.js"></script>
  19. <style>
  20. .ultrasmall.image{
  21. height:35px;
  22. margin:0px !important;
  23. margin-right:10px !important;
  24. }
  25. .selectable{
  26. cursor:pointer;
  27. }
  28. .selectable:hover{
  29. background-color:#f0f0f0;
  30. }
  31. .noborder{
  32. border: 1px solid transparent !important;
  33. }
  34. .controlBtn{
  35. position:absolute;
  36. right:8px;
  37. bottom:8px;
  38. }
  39. .devIcon{
  40. border-radius: 10px;
  41. }
  42. .primary.button{
  43. background-color: #4aa9eb !important;
  44. }
  45. .bottom.item{
  46. position:absolute;
  47. bottom: 0px;
  48. left:0px;
  49. width:100%;
  50. font-size:80%;
  51. }
  52. #sideMenu{
  53. height: calc(100% - 85px);
  54. }
  55. body{
  56. height:100%;
  57. background:rgba(247,247,247,0.95);
  58. }
  59. </style>
  60. </head>
  61. <body>
  62. <div class="ts menu">
  63. <a class="item noborder" href="index.php"><img class="ts ultrasmall circular image" src="img/main_icon.png"> Homdynm UI</a>
  64. <a class="right item" onClick="toggleSideMenu();"><i class="content icon"></i></a>
  65. </div>
  66. <!-- Side bar on the right -->
  67. <div id="sideMenu" class="ts static visible right sidebar vertical menu" style="display:none;">
  68. <div class="item">
  69. <div class="ts header">
  70. Homdynm UI
  71. <div class="sub header">Prototype Build v0.0.1</div>
  72. </div>
  73. </div>
  74. <a class="selectable item" onClick="loadDevList();hideSideMenu();">
  75. <i class="refresh icon"></i> Refresh List
  76. </a>
  77. <a class="selectable item" onClick="hideSideMenu();" href="hds_scan.php">
  78. <i class="search icon"></i> Scan Devices
  79. </a>
  80. <a class="selectable item" onClick="manualDriverConfig();">
  81. <i class="edit icon"></i> Manual Device Config
  82. </a>
  83. <a class="selectable item" onClick="initNicknameChangeList();">
  84. <i class="tags icon"></i> Set Nickname
  85. </a>
  86. <a class="selectable item">
  87. <i class="object group icon"></i> Create Action Group
  88. </a>
  89. <a class="selectable item">
  90. <i class="external icon"></i> Start Control Panel
  91. </a>
  92. <div class="bottom item">
  93. CopyRight ArOZ Online Project 2019
  94. </div>
  95. </div>
  96. <div id="devList" class="ts container">
  97. </div>
  98. <div id="moreInfoInterface" class="ts active dimmer" style="display:none;">
  99. <div style="position:absolute;width:100%;height:100%;left:0px;top:0px;" onClick='$("#moreInfoInterface").fadeOut("fast");'>
  100. </div>
  101. <div id="informationItnerface" class="ts segment mainUI" style="height:80%;width:95%;overflow-y:auto;">
  102. <div class="ts header">
  103. Device Properties
  104. </div><br>
  105. <div class="ts horizontal form">
  106. <div class="field">
  107. <label>Device UUID</label>
  108. <input id="duid" type="text" readonly="true">
  109. </div>
  110. <div class="field">
  111. <label>Last Seen IP Address</label>
  112. <input id="lastseen" type="text" readonly="true">
  113. </div>
  114. <div class="field">
  115. <label>Device Driver Identifier</label>
  116. <input id="ddi" type="text" readonly="true">
  117. </div>
  118. <div class="field">
  119. <label>Device Information</label>
  120. <input id="dinfo" type="text" readonly="true">
  121. </div>
  122. <div class="field">
  123. <label>Driver Found</label>
  124. <input id="driverfound" type="text" readonly="true">
  125. </div>
  126. </div>
  127. <br>
  128. <button class="ts primary button" onClick='$("#moreInfoInterface").fadeOut("fast");'>Close</button>
  129. <button id="setNicknameButton" class="ts button" onClick='setNickname();'>Set Nickname</button>
  130. <br><br>
  131. </div>
  132. </div>
  133. <div id="actionInterface" class="ts active dimmer" style="display:none;">
  134. <div style="position:absolute;width:100%;height:100%;left:0px;top:0px;" onClick='$("#actionInterface").fadeOut("fast");'>
  135. </div>
  136. <div id="actionMainUI" class="ts segment mainUI" style="height:80%;width:95%;">
  137. <iframe id="controlUI" src="" width="500px" height="800px"> </iframe>
  138. </div>
  139. </div>
  140. <div id="nickNameSelector" class="ts active dimmer" style="display:none;">
  141. <div style="position:absolute;width:100%;height:100%;left:0px;top:0px;" onClick='$("#nickNameSelector").fadeOut("fast");'>
  142. </div>
  143. <div id="nicknameSelectorUI" class="ts segment mainUI" style="height:80%;width:95%;overflow-y:auto;">
  144. <div class="ts header">
  145. <div class="content">
  146. Nickname Settings
  147. <div class="sub header">Please select an UUID from below for changing its nickname.</div>
  148. </div>
  149. </div>
  150. <div class="ts container">
  151. <div id="nicknameChangeList" class="ts list">
  152. </div>
  153. </div>
  154. </div>
  155. </div>
  156. <div id="manualDevConfig" class="ts active dimmer" style="display:none;">
  157. <div style="position:absolute;width:100%;height:100%;left:0px;top:0px;" onClick='$("#manualDevConfig").fadeOut("fast");'>
  158. </div>
  159. <div id="manualDevConfigUI" class="ts segment mainUI" style="height:80%;width:95%;">
  160. <div class="ts header">
  161. <div class="content">
  162. Manual Device Configuration
  163. <div class="sub header">Add devices that runs other protocol to the system</div>
  164. </div>
  165. </div>
  166. <div class="ts container">
  167. <button class="ts primary tiny button" onClick="addDevViaIP();"><i class="add icon"></i>Add device via IP</button>
  168. <button class="ts tiny button" onClick="openFolderForDev();"><i class="folder icon"></i>Open device folder</button>
  169. <p>Current list of Non-HDS Devices</p>
  170. <div id="customDevList" class="ts ordered list">
  171. <div class="item">Loading</div>
  172. </div>
  173. </div>
  174. </div>
  175. </div>
  176. <script>
  177. //Initiate the page content
  178. loadDevList();
  179. var currentlyViewingDevices = "";
  180. //ao_module Float Window functions
  181. ao_module_setWindowIcon("home");
  182. ao_module_setWindowTitle("Homdynm UI");
  183. ao_module_setGlassEffectMode();
  184. ao_module_setWindowSize(465,730,true);
  185. if (!ao_module_virtualDesktop){
  186. $("body").css("background-color","white");
  187. }
  188. function inputbox(message, placeholder = ""){
  189. var input = prompt(message, placeholder);
  190. if (input != null) {
  191. return input;
  192. }else{
  193. return false;
  194. }
  195. }
  196. function addDevViaIP(){
  197. var ipaddr = inputbox("Please enter the IP Address of your device.");
  198. if (ipaddr != false){
  199. var classType = inputbox("Select the custom driver for this device. Leave empty for default.");
  200. if (classType == false){
  201. alert("Driver Type cannot be empty!");
  202. return;
  203. }
  204. $.get("manualDriverConfig.php?ipaddr=" + ipaddr + "&classType=" + classType,function(data){
  205. //Finished the adding process. Realod the list of custom devices.
  206. loadCustomDeviceList();
  207. });
  208. }else{
  209. //User cancelled the opr
  210. }
  211. }
  212. function openFolderForDev(){
  213. if (ao_module_virtualDesktop){
  214. ao_module_openPath("Homdynm/devices");
  215. }else{
  216. window.open('../SystemAOB/functions/file_system/index.php?controlLv=2&subdir=Homdynm/devices');
  217. }
  218. }
  219. function loadCustomDeviceList(){
  220. $("#customDevList").html("");
  221. $.ajax("manualDriverConfig.php").done(function(data){
  222. if (data.length == 0){
  223. $("#customDevList").append('<div class="item">N/A</div>');
  224. }else{
  225. for (var i =0; i < data.length; i++){
  226. $("#customDevList").append('<div class="item">' + data[i][1] + " <br>( Config UID: " + data[i][0] + " / Driver Loader: " + data[i][2] + ")" + '</div>');
  227. }
  228. }
  229. });
  230. }
  231. function manualDriverConfig(){
  232. //Open manual driver configuration interface
  233. loadCustomDeviceList();
  234. $("#manualDevConfig").show();
  235. hideSideMenu();
  236. }
  237. function setSelectNickname(object){
  238. currentlyViewingDevices = $(object).attr("uuid");
  239. setNickname();
  240. }
  241. function initNicknameChangeList(){
  242. hideSideMenu();
  243. var template = '<a class="item" uuid="{uuid}" onClick="setSelectNickname(this);">\
  244. <i class="hashtag icon"></i>\
  245. <div class="content">\
  246. <div class="header">Current Nickname: {currentNickname}</div>\
  247. <div class="description">Device UUID: {uuid} / Device Type: {devClassName}</div>\
  248. </div>\
  249. </a>';
  250. $("#nicknameChangeList").html("");
  251. $(".HDSDev").each(function(){
  252. if ($(this).attr("className") != "offline" && $(this).attr("className") !== undefined){
  253. var uuid = $(this).attr("uuid");
  254. var devClassname = $(this).attr("classname");
  255. var nickName = $(this).attr("nickname");
  256. if (nickName === undefined){
  257. //This devices has no old nickname
  258. nickName = uuid;
  259. }
  260. var box = template;
  261. box = box.split("{uuid}").join(uuid);
  262. box = box.split("{currentNickname}").join(nickName);
  263. box = box.split("{devClassName}").join(devClassname);
  264. $("#nicknameChangeList").append(box);
  265. }
  266. });
  267. $("#nickNameSelector").fadeIn('fast');
  268. }
  269. function setNickname(){
  270. var newnickname = prompt("Please enter a nickname for this devices.", "");
  271. if (newnickname == null || newnickname == ""){
  272. //Opr canceld
  273. }else{
  274. if (currentlyViewingDevices != "Unknown"){
  275. $.ajax("nicknameman.php?nickname=" + newnickname + "&uuid=" + currentlyViewingDevices).done(function(data){
  276. loadDevList();
  277. $("#moreInfoInterface").fadeOut('fast');
  278. $("#nickNameSelector").fadeOut('fast');
  279. });
  280. }else{
  281. alert("Error. Unknown device UUID");
  282. }
  283. }
  284. }
  285. function hideSideMenu(){
  286. $("#sideMenu").hide();
  287. }
  288. function showMore(object){
  289. var device = $(object).parent().parent();
  290. var duid = device.attr("uuid");
  291. var lastseen = device.attr("devip");
  292. var ddi = device.attr("classtype");
  293. var dinfo = device.attr("classname");
  294. var dfound = device.attr("driverfound");
  295. if (duid === undefined){
  296. duid = "Unknown";
  297. $("#setNicknameButton").hide();
  298. }else{
  299. $("#setNicknameButton").show();
  300. }
  301. if (dfound === undefined){
  302. dfound = "Offline";
  303. }
  304. $("#duid").val(duid);
  305. $("#lastseen").val(lastseen);
  306. $("#ddi").val(ddi);
  307. $("#dinfo").val(dinfo);
  308. $("#driverfound").val(dfound);
  309. currentlyViewingDevices = duid;
  310. $("#moreInfoInterface").fadeIn('fast');
  311. }
  312. function action(object){
  313. var classType = $(object).parent().parent().attr("classtype");
  314. var driverFound = ($(object).parent().parent().attr("driverfound") == "true");
  315. var ip = $(object).parent().parent().attr("devip");
  316. if (driverFound){
  317. $("#actionInterface").fadeIn('fast');
  318. updateIframeSize();
  319. $("#controlUI").attr("src","drivers/" + classType + "/" + classType + ".php?ip=" + ip);
  320. }else{
  321. alert("Driver not found!");
  322. }
  323. }
  324. function loadDevList(){
  325. $("#devList").html("");
  326. var template = '<div class="ts segment HDSDev" devIp="{deviceIP}">\
  327. <div class="ts grid">\
  328. <div class="four wide column"><img class="ts tiny devIcon image" src="img/system/loading.gif"></div>\
  329. <div class="twelve wide column">\
  330. <div class="ts container">\
  331. <div class="ts header">\
  332. <span class="devHeader">{deviceIP}</span>\
  333. <div class="sub devProperty header"><i class="spinner loading icon"></i> Loading</div>\
  334. </div>\
  335. </div>\
  336. </div>\
  337. </div>\
  338. <div class="controlBtn infoMount">\
  339. <button class="ts icon button" onClick="showMore(this);"><i class="notice icon"></i></button>\
  340. <button class="ts primary icon button" onClick="action(this);"><i class="external icon"></i></button>\
  341. </div>\
  342. </div>';
  343. $.ajax("loadDevList.php").done(function(data){
  344. if (data.length == 0){
  345. var nodevFound = '<div class="ts segment">\
  346. <h5 class="ts center aligned icon header">\
  347. <i class="remove icon"></i>No Device Found\
  348. <div class="sub header">No HDS based device is found in your network.<br>\
  349. Click <a href="readmore.html">here</a> to know more on how to build one yourself.</div>\
  350. </h5>\
  351. </div>';
  352. $("#devList").append(nodevFound);
  353. }else{
  354. for (var i =0; i < data.length; i++){
  355. var ip = data[i];
  356. var box = template;
  357. box = box.split("{deviceIP}").join(ip);
  358. $("#devList").append(box);
  359. }
  360. }
  361. //All devices loaded. Get information about the devices.
  362. $(".HDSDev").each(function(){
  363. let ip = $(this).attr("devIp");
  364. requestInfo("http://" + ip + "/info",this);
  365. requestUUID("http://" + ip + "/uuid",this);
  366. });
  367. });
  368. $.ajax("manualDriverConfig.php").done(function(data){
  369. for(var i =0; i < data.length; i++){
  370. var uuid = data[i][0];
  371. var ipaddr = data[i][1];
  372. var classType = data[i][2];
  373. var box = template;
  374. box = box.split("{deviceIP}").join(ipaddr);
  375. box = $(box).attr("uuid",uuid);
  376. box = $(box).attr("classtype",classType);
  377. box = $(box).attr("classname",classType.split(".").join(" "));
  378. box = $(box).removeClass("HDSDev").addClass("CustomDev");
  379. $("#devList").append(box);
  380. }
  381. initCustomDevUI();
  382. });
  383. }
  384. function initCustomDevUI(){
  385. $(".CustomDev").each(function(){
  386. var classType = $(this).attr("classtype");
  387. loadDevImage(classType,this);
  388. loadDevDefaultDescription(this);
  389. getNickName(this);
  390. });
  391. }
  392. function loadDevDefaultDescription(object){
  393. var classType = $(object).attr("classtype");
  394. $.ajax("loadDriverProperties.php?classType=" + classType).done(function(data){
  395. $(object).find(".devProperty").text(data);
  396. });
  397. }
  398. function requestUUID(targetAddress, object){
  399. $.ajax({
  400. url: targetAddress,
  401. error: function(){
  402. //Declare offline
  403. },
  404. success: function(data){
  405. //UUID found.
  406. var uuid = data;
  407. $(object).attr("uuid",uuid);
  408. $(object).find(".devHeader").text(uuid);
  409. getNickName(object);
  410. },
  411. timeout: 5000 // sets timeout to 3 seconds
  412. });
  413. }
  414. function getNickName(object){
  415. $.ajax({
  416. url: "nicknameman.php?uuid=" + $(object).attr("uuid"),
  417. success: function(data){
  418. //UUID found.
  419. if (data != false){
  420. //Replace the uuid with nickname
  421. $(object).find(".devHeader").text(data);
  422. $(object).attr("nickname",data);
  423. }
  424. },
  425. timeout: 5000 // sets timeout to 3 seconds
  426. });
  427. }
  428. function requestInfo(targetAddress,object){
  429. //This function should work if both devices are in the same subnet. If not, something else will be done.
  430. $.ajax({
  431. url: targetAddress,
  432. error: function(){
  433. //Declare offline
  434. $(object).attr("className","offline");
  435. $(object).attr("classType","offline");
  436. $(object).find(".devHeader").html("<i class='remove icon'></i> Unable to Connect");
  437. $(object).find(".devProperty").html("This device is offline or its address has been changed.");
  438. $(object).find(".devIcon").attr('src',"img/system/unable2connect.png");
  439. },
  440. success: function(data){
  441. //Device in the same subnet. Try to load driver.
  442. if (data.includes("_")){
  443. var className = data.split("_")[0];
  444. var classType = data.split("_")[1];
  445. $(object).attr("className",className);
  446. $(object).attr("classType",classType);
  447. $(object).find(".devProperty").html(className);
  448. loadDevImage(classType,object);
  449. }else{
  450. console.log("[Homdynm] Error. Unknown devices class for ip address: " + $(object).attr("devIP"));
  451. }
  452. },
  453. timeout: 5000 // sets timeout to 3 seconds
  454. });
  455. }
  456. function loadDevImage(classType,object){
  457. $.ajax("loadDevImage.php?driverClass=" + classType).done(function(data){
  458. $(object).find(".devIcon").attr('src',data[0]);
  459. $(object).attr("driverFound",data[1]);
  460. if (data[1] == false){
  461. //Driver not found. Update the icon
  462. $(object).find(".devIcon").attr('src',"img/system/driverNotFound.png");
  463. }
  464. });
  465. }
  466. function toggleSideMenu(){
  467. $("#sideMenu").toggle();
  468. }
  469. function updateIframeSize(){
  470. $("#controlUI").attr("width",$("#actionMainUI").width());
  471. $("#controlUI").attr("height",$("#actionMainUI").height());
  472. $("#controlUI").css("width",$("#actionMainUI").width());
  473. $("#controlUI").css("height",$("#actionMainUI").height());
  474. }
  475. $(window).on("resize",function(){
  476. updateIframeSize();
  477. });
  478. </script>
  479. </body>
  480. </html>