63 var ADMIN_PERMISSION_THRESHOLD = 255;
64 var userPermission = 10;
65 var CMDHISTDIVINDEX = 0;
71 var stringOfAllMacros = [];
73 var readoutDictionary = [];
74 var namesOfAllMacros = [];
76 var theAddressStrForRead =
"";
77 var isOnMacroMakerPage =
false;
78 var isOnPrivateMacros =
false;
80 var isMacroRunning =
false;
81 var waitForCurrentCommandToComeBack =
false;
82 var putReadResultInBoxFlag =
false;
83 var runningMacroLSBF = 0;
84 var SEQFORMAT =
"hex";
86 var arrayOfCommandsForEdit = [];
87 var oldMacroNameForEdit =
"";
88 var newMacroNameForEdit =
"";
89 var macroDateForEdit =
"";
90 var macroNotesForEdit =
"";
92 var lastDeletedMacro =
"";
93 var boxOfFreshVar =
"";
101 Debug.log(
"init() was called");
102 DesktopContent.XMLHttpRequest(
"Request?RequestType=FElist",
"",FElistHandler);
103 DesktopContent.XMLHttpRequest(
"Request?RequestType=getPermission",
"",getPermissionHandler);
104 fecListDiv = document.getElementById(
'fecList');
105 macroLibDiv = document.getElementById(
'macroLib');
106 mainDiv = document.getElementById(
'main');
108 progressbarOuterDiv = document.getElementById(
'progressBarOuter');
109 progressbarOuterDiv.style.display =
"none";
111 historyDiv = document.getElementById(
'history');
112 sequenceDiv = document.getElementById(
'sequence');
113 makerDiv = document.getElementById(
'maker');
114 popupEditMacroDiv = document.getElementById(
'popupEditMacro');
116 historybox = document.getElementById(
'historyContent');
117 sequencebox = document.getElementById(
'sequenceContent');
118 privateMacroBox = document.getElementById(
'listOfPrivateMacros');
119 publicMacroBox = document.getElementById(
'listOfPublicMacros');
120 window.onresize = redrawWindow;
122 loadExistingMacros();
125 toggleMacroPublicity(0);
132 DesktopContent.XMLHttpRequest(
"Request?RequestType=FElist",
"",
139 function redrawWindow()
141 Debug.log(
"Window redraw to " + window.innerWidth +
" - " + window.innerHeight);
143 var w = window.innerWidth;
144 var h = window.innerHeight;
152 var b1 = [_MARGIN, _MARGIN+4*_MARGIN, w/3, h/2-_MARGIN];
153 var b2 = [_MARGIN, h/2+2*_MARGIN, w/3-_MARGIN, h/2-_MARGIN];
154 var b3 = [w/3, _MARGIN+4*_MARGIN, w/3, h/2-_MARGIN];
155 var b4 = [w/3, h/2+2*_MARGIN, w/3, h/2-_MARGIN];
156 var b5 = [w*2/3,_MARGIN+4*_MARGIN,w/3-_MARGIN, h-2*_MARGIN];
157 var b6 = [_MARGIN, _MARGIN+4*_MARGIN,w/3-2*_MARGIN, h-2*_MARGIN];
158 var b7 = [w/3, _MARGIN+4*_MARGIN, w/3, h/2-_MARGIN];
159 var b8 = [w/2-200,h/5,2*w/3,3*h/5+15];
196 popupEditMacroDiv.style.left = b8[0] +
"px";
197 popupEditMacroDiv.style.top = b8[1] +
"px";
198 popupEditMacroDiv.style.height = b8[3] +
"px";
200 historybox.style.height = (h-_MARGIN*2-54) +
"px";
201 sequencebox.style.height = (h-_MARGIN*2-54) +
"px";
202 privateMacroBox.style.height = (h/2-_MARGIN*2-54-2) +
"px";
203 publicMacroBox.style.height = (h/2-_MARGIN*2-54-2) +
"px";
209 function FElistHandler(req)
211 Debug.log(
"FElistHandler() was called. ");
213 FEELEMENTS = req.responseXML.getElementsByTagName(
"FE");
214 var listoffecs = document.getElementById(
'list');
215 if(FEELEMENTS.length === 0)
216 listoffecs.innerHTML =
"<p class='red'>" +
217 "<br>No Front-End interfaces were found. <br><br>Otsdaq must be configured with Front-ends, then " +
219 "<a href='#' onclick='initLite(); return false;' >refresh</a>" +
220 " (also in the upper-right of Macro Maker).</p>";
224 var w = document.getElementById(
"fecList").offsetWidth - 76;
229 var noMultiSelect =
false;
237 for(var i=0;i<FEELEMENTS.length;++i)
240 fullnames[i] = FEELEMENTS[i].getAttribute(
"value");
241 var sp = fullnames[i].split(
":");
244 display = sp[2] +
":" + sp[0] +
":" + sp[1];
246 if(display.length > w)
247 display = display.substr(0,w-4) +
"..." + display.substr(display.length - 4);
249 vals[i] =
"<abbr title='" + (sp[2] +
":" + sp[0] +
":" + sp[1]) +
"'>"+display+
"</abbr>";
269 listoffecs.innerHTML =
"";
270 MultiSelectBox.createSelectBox(listoffecs,
272 "Please select from below:",
273 vals,keys,types,
"listSelectionHandler",noMultiSelect,
284 MultiSelectBox.initMySelectBoxes();
288 function getPermissionHandler(req)
290 Debug.log(
"getPermissionHandler() was called. ");
292 userPermission = DesktopContent.getXMLValue(req,
"Permission");
293 console.log(
"User Permission: " + userPermission);
297 function listSelectionHandler(listoffecs)
299 var splits = listoffecs.id.split(
'_');
300 elementIndex = splits[splits.length-1] | 0;
301 MultiSelectBox.dbg(
"Chosen element index:",elementIndex);
305 function callWrite(address,data)
307 var reminderEl = document.getElementById(
'reminder');
308 if(isArrayAllZero(selected))
309 Debug.log(
"Please select at least one interface from the list",Debug.HIGH_PRIORITY);
312 var addressFormatStr = document.getElementById(
"addressFormat").value;
313 var dataFormatStr = document.getElementById(
"dataFormat").value;
314 if(isMacroRunning ==
true)
316 addressFormatStr =
"hex";
317 dataFormatStr =
"hex";
320 if (typeof address ===
'undefined')
322 var addressStr = document.getElementById(
'addressInput').value.toString();
323 var dataStr = document.getElementById(
'dataInput').value.toString();
326 reminderEl.innerHTML =
"Please enter an address to write to";
329 else if(dataStr ==
"")
331 reminderEl.innerHTML =
"Please enter your data";
337 var addressStr = address.toString();
338 var dataStr = data.toString();
341 if (addressStr.substr(0,2)==
"0x") addressStr = addressStr.substr(2);
342 if (dataStr.substr(0,2)==
"0x") dataStr = dataStr.substr(2);
344 var selectionStrArray = [];
345 var supervisorIndexArray = [];
346 var interfaceIndexArray = [];
347 for (var i = 0; i < selected.length; i++)
351 var oneInterface = FEELEMENTS[i].getAttribute(
"value")
352 selectionStrArray.push(oneInterface);
353 supervisorIndexArray.push(oneInterface.split(
":")[1]);
354 interfaceIndexArray.push(oneInterface.split(
":")[2]);
357 var contentEl = document.getElementById(
'historyContent');
358 var innerClass =
"class=\"innerClass1\"";
359 if (CMDHISTDIVINDEX%2) innerClass =
"class=\"innerClass2\"";
361 var reverse = document.getElementById(
"lsbFirst").checked;
362 if(runningMacroLSBF == 1) reverse =
true;
363 if(runningMacroLSBF == 2) reverse =
false;
365 var update =
"<div " + innerClass +
" id = \"" + CMDHISTDIVINDEX +
"\" title=\"" +
"Entered: "
366 + Date().toString() +
"\nSelected interface: " + selectionStrArray
367 +
"\" onclick=\"histCmdWriteDivOnclick(" +
"'" + addressStr +
"','" + dataStr +
"','"
368 + addressFormatStr +
"','" + dataFormatStr +
"')\">Write [" + dataFormatStr +
"] <b>"
369 + dataStr + LSBchecker(reverse) +
"</b> into register [" + addressFormatStr +
"] <b> "
370 + addressStr + LSBchecker(reverse) +
"</b></div>";
373 var convertedAddress = reverseLSB(convertToHex(addressFormatStr,addressStr),reverse);
374 var convertedData = reverseLSB(convertToHex(dataFormatStr,dataStr),reverse);
376 DesktopContent.XMLHttpRequest(
"Request?RequestType=writeData" +
377 "&Address=" + convertedAddress +
378 "&Data=" + convertedData +
379 "&supervisorIndex=" + supervisorIndexArray +
380 "&interfaceIndex=" + interfaceIndexArray +
381 "&time=" + Date().toString() +
382 "&addressFormatStr=" + addressFormatStr +
383 "&dataFormatStr=" + dataFormatStr,
385 "interfaces=" + selectionStrArray,
387 contentEl.innerHTML += update;
389 contentEl.scrollTop = contentEl.scrollHeight;
390 reminderEl.innerHTML =
"Data successfully written!";
395 function callRead(address)
397 var reminderEl = document.getElementById(
'reminder');
398 if(isArrayAllZero(selected))
399 Debug.log(
"Please select at least one interface from the list",Debug.HIGH_PRIORITY);
402 var addressFormatStr = document.getElementById(
"addressFormat").value;
403 var dataFormatStr = document.getElementById(
"dataFormat").value;
405 if (typeof address ===
'undefined')
407 theAddressStrForRead = document.getElementById(
'addressInput').value.toString();
408 if(theAddressStrForRead ===
"")
410 reminderEl.innerHTML =
"Please enter an address to read from";
415 theAddressStrForRead = address.toString();
417 if (theAddressStrForRead.substr(0,2)==
"0x") theAddressStrForRead = theAddressStrForRead.substr(2);
419 var selectionStrArray = [];
420 var supervisorIndexArray = [];
421 var interfaceIndexArray = [];
422 for (var i = 0; i < selected.length; i++)
426 var oneInterface = FEELEMENTS[i].getAttribute(
"value");
427 if (selected[i]!==0) selectionStrArray.push(FEELEMENTS[i].getAttribute(
"value"));
428 supervisorIndexArray.push(oneInterface.split(
":")[1]);
429 interfaceIndexArray.push(oneInterface.split(
":")[2]);
432 var reverse = document.getElementById(
"lsbFirst").checked;
433 if(runningMacroLSBF == 1) reverse =
true;
434 if(runningMacroLSBF == 2) reverse =
false;
436 var convertedAddress = reverseLSB(convertToHex(addressFormatStr,theAddressStrForRead),reverse);
438 DesktopContent.XMLHttpRequest(
"Request?RequestType=readData" +
439 "&Address=" + convertedAddress +
440 "&supervisorIndex=" + supervisorIndexArray +
441 "&interfaceIndex=" + interfaceIndexArray +
442 "&time=" + Date().toString() +
443 "&addressFormatStr=" + addressFormatStr +
444 "&dataFormatStr=" + dataFormatStr,
446 "interfaces=" + selectionStrArray,
452 function toggleReadBitField(fromLink)
454 var el = document.getElementById(
"enableReadBitField");
456 el.checked = !el.checked;
458 var val = el.checked;
460 Debug.log(
"checkbox val " + val);
461 document.getElementById(
"readBitFieldTable").style.display = val?
"block":
"none";
465 function writeHandler(req)
467 Debug.log(
"writeHandler() was called.");
469 var runningPercentageEl = document.getElementById(
'macroRunningPercentage');
470 var barEl = document.getElementById(
'macroRunningBar');
471 barWidth += barIncrement;
472 barEl.style.width = barWidth +
'%';
473 runningPercentageEl.innerHTML = Math.round(barWidth*10)/10 +
'%';
474 waitForCurrentCommandToComeBack =
false;
479 function readHandler(req)
481 Debug.log(
"readHandler() was called.");
483 var addressFormatStr = document.getElementById(
"addressFormat").value;
484 var dataFormatStr = document.getElementById(
"dataFormat").value;
485 var extractBitField = document.getElementById(
"enableReadBitField").checked && !isMacroRunning;
487 if(isMacroRunning ==
true)
489 addressFormatStr =
"hex";
490 dataFormatStr =
"hex";
493 var reminderEl = document.getElementById(
'reminder');
495 var dataOutput = DesktopContent.getXMLValue(req,
"readData");
496 if(putReadResultInBoxFlag) boxOfFreshVar = dataOutput;
500 var reverse = document.getElementById(
"lsbFirst").checked;
501 if(runningMacroLSBF == 1) reverse =
true;
502 if(runningMacroLSBF == 2) reverse =
false;
505 if (isNaN(
"0x"+dataOutput))
507 convertedOutput =
"<span class='red'>" + dataOutput +
"</span>";
512 convertedOutput = convertFromHex(dataFormatStr,reverseLSB(dataOutput,reverse),extractBitField);
513 argOutput = convertedOutput;
516 var selectionStrArray = [];
517 for (var i = 0; i < selected.length; i++)
519 if (selected[i]!==0) selectionStrArray.push(FEELEMENTS[i].getAttribute(
"value"));
521 var innerClass =
"class=\"innerClass1\"";
522 if (CMDHISTDIVINDEX%2) innerClass =
"class=\"innerClass2\"";
523 var contentEl = document.getElementById(
'historyContent');
525 var update =
"<div " + innerClass +
" id = \"" + CMDHISTDIVINDEX +
"\" title=\"" +
"Entered: " + Date().toString()
526 +
"\nSelected interface: " + selectionStrArray +
"\" onclick=\"histCmdReadDivOnclick(" +
527 "'" + theAddressStrForRead +
"','" + argOutput +
"'" +
528 ",'" + addressFormatStr +
"','" + dataFormatStr +
"'" +
529 ")\">Read [" + dataFormatStr +
"] <b>"
530 + convertedOutput + LSBchecker(reverse)
531 +
"</b> from register [" + addressFormatStr +
"]<b>" +
532 theAddressStrForRead + LSBchecker(reverse) +
"</b></div>";
534 theAddressStrForRead =
"";
535 contentEl.innerHTML += update;
537 contentEl.scrollTop = contentEl.scrollHeight;
538 reminderEl.innerHTML =
"Data read: " + convertedOutput;
539 var runningPercentageEl = document.getElementById(
'macroRunningPercentage');
540 var barEl = document.getElementById(
'macroRunningBar');
541 barWidth += barIncrement;
542 barEl.style.width = barWidth +
'%';
543 runningPercentageEl.innerHTML = Math.round(barWidth*10)/10 +
'%';
544 waitForCurrentCommandToComeBack =
false;
548 function isArrayAllZero(arr)
550 for(var j = 0; j < arr.length; j++)
552 if (arr[j]!==0)
return false;
558 function convertToHex(format,target)
565 return Number(target).toString(16);
568 for(var i = target.length-1; i>=0; i--)
569 output.push(target.charCodeAt(i).toString(16));
570 return output.join(
'');
575 function convertFromHex(format,target,extractBitField)
579 Debug.log(
"Extracting Bit-Field");
580 var startPos = document.getElementById(
"readBitFieldStartPos").value | 0;
581 var fieldSz = document.getElementById(
"readBitFieldLength").value | 0;
582 Debug.log(
"Extracting Bit-Field start/size = " + startPos +
" / " + fieldSz);
584 while(((startPos/4)|0) && target.length)
586 target = target.substr(0,target.length-1);
587 Debug.log(
"div4 target " + target);
591 Debug.log(
"target " + target);
593 var size = Math.ceil((startPos+fieldSz)/4);
594 target = target.substr(target.length-size);
596 Debug.log(
"sized target " + target);
598 if(target.length == 0) target =
"0";
602 var num = parseInt(target,16);
603 Debug.log(
"num " + num);
606 for(var i=0;i<fieldSz;++i)
608 Debug.log(
"mask " + mask);
609 num = (num >> startPos) & mask;
611 Debug.log(
"final num " + num);
612 target = num.toString(16).toUpperCase();
614 Debug.log(
"final target " + target);
622 return parseInt(target,16).toString();
625 for (var i = 0; i < target.length; i += 2)
626 str += String.fromCharCode(parseInt(target.substr(i, 2), 16));
632 function reverseLSB(original, execute)
637 if(original.length%2)
638 original =
"0"+original;
639 for (var i = original.length-2; i > -2; i -= 2)
640 str += original.substr(i,2);
643 else return original;
647 function LSBchecker(LSBF)
655 function toggleDisplay(onMacro)
657 var fecListEl = document.getElementById(
"fecList");
658 var macroLibEl = document.getElementById(
"macroLib");
659 var sequenceEl = document.getElementById(
"sequence");
660 var progressBarOuterEl = document.getElementById(
"progressBarOuter");
661 var mainEl = document.getElementById(
"main");
662 var makerEl = document.getElementById(
"maker");
665 isOnMacroMakerPage =
true;
666 fecListEl.style.display =
"none";
667 macroLibEl.style.display =
"none";
668 sequenceEl.style.display =
"block";
669 progressBarOuterEl.style.display =
"none";
670 mainEl.style.display =
"none";
671 makerEl.style.display =
"block";
672 document.getElementById(
"page2tag").style.backgroundColor =
"#8A2A2B";
673 document.getElementById(
"page1tag").style.backgroundColor =
"#333";
678 isOnMacroMakerPage =
false;
679 fecListEl.style.display =
"block";
680 macroLibEl.style.display =
"block";
681 sequenceEl.style.display =
"none";
682 progressBarOuterEl.style.display =
"none";
683 mainEl.style.display =
"block";
684 makerEl.style.display =
"none";
685 document.getElementById(
"page1tag").style.backgroundColor =
"#8A2A2B";
686 document.getElementById(
"page2tag").style.backgroundColor =
"#333";
692 function toggleMacroPublicity(onPublic)
694 var privateEl = document.getElementById(
"listOfPrivateMacros");
695 var publicEl = document.getElementById(
"listOfPublicMacros");
697 privateEl.style.display =
"none";
698 publicEl.style.display =
"block";
704 isOnPrivateMacros =
false;
708 privateEl.style.display =
"block";
709 publicEl.style.display =
"none";
715 isOnPrivateMacros =
true;
720 function addCommand(command,address,data)
722 var contentEl = document.getElementById(
'sequenceContent');
723 var macroReminderEl = document.getElementById(
'macroReminder');
724 macroReminderEl.innerHTML =
"";
725 var formatMarkerHead, formatMarkerTail =
"";
726 if(SEQFORMAT ==
"hex") formatMarkerHead =
"0x";
727 else if(SEQFORMAT ==
"ascii")
729 formatMarkerHead =
"\"";
730 formatMarkerTail =
"\"";
734 formatMarkerHead =
"";
735 formatMarkerTail =
"";
740 if (typeof address ===
'undefined')
742 var addressStrBefore = document.getElementById(
'macroAddressInput').value.toString();
743 var dataStrBefore = document.getElementById(
'macroDataInput').value.toString();
744 if(addressStrBefore ===
"")
746 macroReminderEl.innerHTML =
"Please enter an address to write to";
749 else if(dataStrBefore ===
"")
751 macroReminderEl.innerHTML =
"Please enter your data";
754 var addressFormatStr = document.getElementById(
"macroAddressFormat").value;
755 var dataFormatStr = document.getElementById(
"macroDataFormat").value;
756 var reverse = document.getElementById(
"lsbFirst").checked;
757 var addressStr = reverseLSB(convertToHex(addressFormatStr,addressStrBefore),reverse);
758 var dataStr = reverseLSB(convertToHex(dataFormatStr,dataStrBefore),reverse);
762 var addressStr = address.toString();
763 var dataStr = data.toString();
765 var update =
"<div id = \"seq" + SEQINDEX +
"\" data-id =" + SEQINDEX
766 +
" onmouseout=\"hideDeletex(" + SEQINDEX +
")\" onmouseover=\"showDeletex("
767 + SEQINDEX +
")\" ondragstart=\"hideDeletex(" + SEQINDEX
768 +
")\" ondragend=\"getOrder()\" class=\"seqDiv\"><p class=\"insideSEQ textSEQ\">Write <b>"
769 + formatMarkerHead + convertFromHex(SEQFORMAT,dataStr) + formatMarkerTail +
"</b> into <b>"
770 + formatMarkerHead + convertFromHex(SEQFORMAT,addressStr) + formatMarkerTail
771 +
"</b></p><img src=\"/WebPath/images/windowContentImages/macromaker-delete.png\" id=\"deletex"
772 + SEQINDEX +
"\" class=\"insideSEQ deletex\" onclick=\"removeCommand("
773 + SEQINDEX +
")\"></></div>";
774 var writeMacroString = SEQINDEX +
":w:" + addressStr +
":" + dataStr;
775 macroString.push(writeMacroString);
778 if (typeof address ===
'undefined')
780 var addressStrBefore = document.getElementById(
'macroAddressInput').value.toString();
781 if(addressStrBefore ===
"")
783 macroReminderEl.innerHTML =
"Please enter an address to read from";
786 var addressFormatStr = document.getElementById(
"macroAddressFormat").value;
787 var reverse = document.getElementById(
"lsbFirst").checked;
788 var addressStr = reverseLSB(convertToHex(addressFormatStr,addressStrBefore),reverse);
790 else var addressStr = address.toString();
791 var update =
"<div id = \"seq" + SEQINDEX +
"\" data-id =" + SEQINDEX
792 +
" onmouseout=\"hideDeletex(" + SEQINDEX +
")\" onmouseover=\"showDeletex("
793 + SEQINDEX +
")\" ondragstart=\"hideDeletex(" + SEQINDEX
794 +
")\" ondragend=\"getOrder()\" class=\"seqDiv\"><p class=\"insideSEQ\">Read from <b>"
795 + formatMarkerHead + convertFromHex(SEQFORMAT,addressStr) + formatMarkerTail
796 +
"</b></p><img src=\"/WebPath/images/windowContentImages/macromaker-delete.png\" id=\"deletex"
797 + SEQINDEX +
"\" class=\"insideSEQ deletex\" onclick=\"removeCommand("
798 + SEQINDEX +
")\"></></div>";
799 var readMacroString = SEQINDEX+
":r:"+addressStr+
":";
800 macroString.push(readMacroString);
803 if (typeof address ===
'undefined')
805 var delayStr = document.getElementById(
'delayInput').value.toString();
808 macroReminderEl.innerHTML =
"Please enter a delay";
811 else if (isNaN(delayStr))
813 macroReminderEl.innerHTML =
"Delay has to be a numerical number";
816 if(document.getElementById(
"delayUnit").value ===
"s") delayStr = Number(delayStr)*1000;
820 var delayStr = address.toString();
821 var update =
"<div id = \"seq" + SEQINDEX +
"\" data-id =" + SEQINDEX
822 +
" onmouseout=\"hideDeletex(" + SEQINDEX +
")\" onmouseover=\"showDeletex("
823 + SEQINDEX +
")\" ondragstart=\"hideDeletex(" + SEQINDEX
824 +
")\" ondragend=\"getOrder()\" class=\"seqDiv\"><p class=\"insideSEQ\">Delay <b>"
825 + delayStr +
"</b> ms</p><img src=\"/WebPath/images/windowContentImages/macromaker-delete.png\" id=\"deletex"
826 + SEQINDEX +
"\" class=\"insideSEQ deletex\" onclick=\"removeCommand(" + SEQINDEX
828 var delayMacroString = SEQINDEX+
":d:"+delayStr;
829 macroString.push(delayMacroString);
832 Debug.log(
"So if it's not write, read, or delay, what is it??");
834 contentEl.innerHTML += update;
836 contentEl.scrollTop = contentEl.scrollHeight;
837 sortable =
Sortable.create(contentEl,{
838 chosenClass:
'chosenClassInSequence',
839 ghostClass:
'ghostClassInSequence'
845 function hideDeletex(seqIndex)
847 var deleteID =
"deletex"+seqIndex;
848 document.getElementById(deleteID).style.display =
"none";
852 function showDeletex(seqIndex)
854 var deleteID =
"deletex"+seqIndex;
855 var deleteEl = document.getElementById(deleteID);
856 deleteEl.style.top = (deleteEl.parentNode.offsetTop + 1) +
"px";
857 deleteEl.style.left = (deleteEl.parentNode.offsetLeft +
858 deleteEl.parentNode.offsetWidth - 20) +
"px";
859 deleteEl.style.display =
"block";
866 var order = sortable.toArray();
868 var sorting = order.slice();
869 sorting.sort(
function(a,b){
return a-b;});
872 for(var i = 0; i < macroString.length; i++)
873 tempString.push(macroString[sorting.indexOf(order[i])]);
877 function removeCommand(seqIndex)
879 document.getElementById(
"undoDelete").disabled =
false;
880 var child = document.getElementById(
"seq"+seqIndex);
881 var parent = document.getElementById(
'sequenceContent');
882 parent.removeChild(child);
883 for (var i = 0; i < macroString.length; i++)
885 if (seqIndex == macroString[i].split(
":")[0])
887 lastDeletedMacro = macroString[i];
888 macroString.splice(i,1);
895 function undoDelete()
897 addCommand(lastDeletedMacro.split(
":")[1],lastDeletedMacro.split(
":")[2],lastDeletedMacro.split(
":")[3]);
898 document.getElementById(
"undoDelete").disabled =
true;
902 function showPopupClearAllConfirm()
904 var popupClearAllConfirm = document.getElementById(
"popupClearAllConfirm");
905 popupClearAllConfirm.style.display =
"block";
909 function showPopupClearHistoryConfirm()
911 var popupClearAllConfirm = document.getElementById(
"popupClearHistoryConfirm");
912 popupClearAllConfirm.style.display =
"block";
916 function clearAll(el)
918 var contentEl = document.getElementById(
'sequenceContent');
919 contentEl.innerHTML =
"";
925 function clearHistory(el)
927 DesktopContent.XMLHttpRequest(
"Request?RequestType=clearHistory",
"",clearHistoryHandler);
928 var contentEl = document.getElementById(
'historyContent');
929 contentEl.innerHTML =
"";
934 function clearHistoryHandler(req)
936 Debug.log(
"clearHistoryHandler() was called.");
942 function hideSmallPopup(el)
944 var wholeDiv = el.parentNode.parentNode.parentNode;
945 wholeDiv.style.display =
"none";
951 if (macroString.length === 0)
952 document.getElementById(
'macroReminder').innerHTML =
"Macro sequence cannot be empty";
955 document.getElementById(
"popupSaveMacro").style.display =
"block";
956 if (userPermission == ADMIN_PERMISSION_THRESHOLD)
957 document.getElementById(
"makeMacroPublic").style.display =
"block";
962 function hidePopupSaveMacro()
964 var popupSaveMacro = document.getElementById(
"popupSaveMacro");
965 popupSaveMacro.style.display =
"none";
966 document.getElementById(
"macroName").value=
"";
967 document.getElementById(
"macroNotes").value=
"";
968 document.getElementById(
'macroReminder').innerHTML =
"Macro successfully saved!";
972 function hidePopupEditMacro()
974 var popupEditMacro = document.getElementById(
"popupEditMacro");
975 popupEditMacro.style.display =
"none";
976 arrayOfCommandsForEdit = [];
980 function saveAsMacro()
983 var macroName = document.getElementById(
"macroName").value;
985 var Regex = /^[a-zA-Z0-9\_]+$/g;
986 if (!Regex.test(macroName))
987 document.getElementById(
"popupIllegalNaming").style.display =
"block";
990 var macroNotes = document.getElementById(
"macroNotes").value;
991 if(macroNotes.indexOf(
"@") >= 0 || macroNotes.indexOf(
"#") >= 0 || macroNotes.indexOf(
"..") >= 0)
993 document.getElementById(
"popupIllegalNotes").style.display =
"block";
996 var macroLibEl = document.getElementById(
'listOfPrivateMacros');
997 stringOfAllMacros[MACROINDEX] = tempString;
998 var isMacroPublic = document.getElementById(
"isMacroPublic").checked;
999 var isMacroLSBF = document.getElementById(
"isMacroLSBF").checked;
1001 if(namesOfAllMacros.indexOf(macroName) !== -1)
1003 document.getElementById(
"popupMacroAlreadyExists").style.display =
"block";
1004 document.getElementById(
"duplicateName").innerHTML = macroName;
1005 document.getElementById(
"popupMacroAlreadyExistsCancel").onclick =
function(){
1006 hideSmallPopup(
this);
1010 document.getElementById(
'popupMacroAlreadyExistsOverwrite').onclick =
function(){
1011 DesktopContent.XMLHttpRequest(
"Request?RequestType=editMacro" +
1012 "&isPublic=" + isMacroPublic +
1013 "&isLSBF=" + isMacroLSBF +
1015 "oldMacroName=" + macroName +
1016 "&newMacroName=" + macroName +
1017 "&Sequence=" + tempString +
1018 "&Time=" + Date().toString() +
1019 "&Notes=" + encodeURIComponent(macroNotes),
1020 saveChangedMacroHandler ,
1023 hideSmallPopup(
this);
1024 hidePopupSaveMacro();
1025 macroLibEl.scrollTop = macroLibEl.scrollHeight - macroLibEl.clientHeight;
1030 DesktopContent.XMLHttpRequest(
"Request?RequestType=createMacro" +
1031 "&isPublic="+isMacroPublic+
1032 "&isLSBF="+isMacroLSBF,
1034 "Name=" + macroName +
1035 "&Sequence=" + tempString +
1036 "&Time=" + Date().toString() +
1037 "&Notes=" + encodeURIComponent(macroNotes),
1038 createMacroHandler ,
1041 hidePopupSaveMacro();
1042 macroLibEl.scrollTop = macroLibEl.scrollHeight - macroLibEl.clientHeight;
1048 function createMacroHandler(req,macroName)
1050 Debug.log(
"createMacroHandler() was called for " + macroName);
1052 Debug.log(
"Your Macro '" + macroName +
"' was succesfully saved!",Debug.INFO_PRIORITY);
1053 loadExistingMacros();
1058 function runMacro(stringOfCommands,macroName)
1060 var contentEl = document.getElementById(
'historyContent');
1061 var progressBarInnerEl = document.getElementById(
'progressBarInner');
1062 var progressBarOuterEl = document.getElementById(
"progressBarOuter");
1064 var start =
"<p class=\"red\"><b><small>-- Start of Macro: " + macroName +
" --</small></b></p>";
1065 contentEl.innerHTML += start;
1066 contentEl.scrollTop = contentEl.scrollHeight;
1068 progressBarInnerEl.style.display =
"block";
1069 progressBarOuterEl.style.display =
"block";
1070 var barEl = document.getElementById(
'macroRunningBar');
1071 barEl.style.width =
'0%';
1072 barIncrement = 100/stringOfCommands.length;
1074 var copyOfStringOfCommands = stringOfCommands.slice();
1075 timeIntervalID = setInterval(
function(){
1076 if(!waitForCurrentCommandToComeBack)
1078 if(i == stringOfCommands.length)
1080 var end =
"<p class=\"red\"><b><small>-- End of Macro: " + macroName +
" --</small></b></p>";
1081 contentEl.innerHTML += end;
1082 contentEl.scrollTop = contentEl.scrollHeight;
1083 isMacroRunning =
false;
1084 setTimeout(
function(){
1085 progressBarInnerEl.style.display =
"none";
1086 progressBarOuterEl.style.display =
"none";
1090 runningMacroLSBF = 0;
1091 clearInterval(timeIntervalID);
1095 var Command = copyOfStringOfCommands[i].split(
":")
1096 var commandType = Command[1];
1097 if(commandType==
'w'){
1098 callWrite(Command[2],Command[3]);
1099 waitForCurrentCommandToComeBack =
true;
1100 }
else if(commandType==
'r'){
1101 if(readoutDictionary.indexOf(Command[3].toString()) !== -1)
1103 if(boxOfFreshVar ===
"")
1105 putReadResultInBoxFlag =
true;
1106 callRead(Command[2])
1107 waitForCurrentCommandToComeBack = true;
1112 for(var j = i+1; j < copyOfStringOfCommands.length; j++)
1114 if(copyOfStringOfCommands[j].split(
":")[2] == Command[3])
1116 var newCommand = copyOfStringOfCommands[j].split(
":");
1117 newCommand[2] = boxOfFreshVar;
1118 copyOfStringOfCommands[j] = newCommand.join(
":");
1121 if(copyOfStringOfCommands[j].split(
":")[3] == Command[3])
1123 var newCommand = copyOfStringOfCommands[j].split(
":");
1124 newCommand[3] = boxOfFreshVar;
1125 copyOfStringOfCommands[j] = newCommand.join(
":");
1129 putReadResultInBoxFlag =
false;
1130 console.log(
"final command after 2nd replacement" + copyOfStringOfCommands);
1135 callRead(Command[2]);
1136 waitForCurrentCommandToComeBack =
true;
1139 else if(commandType==
'd'){
1140 waitForCurrentCommandToComeBack =
true;
1141 setTimeout(
function(){delay();},Number(Command[2]));
1144 var contentEl = document.getElementById(
'historyContent');
1145 var innerClass =
"class=\"innerClass1\"";
1146 if (CMDHISTDIVINDEX%2) innerClass =
"class=\"innerClass2\"";
1147 var selectionStrArray = [];
1148 for (var i = 0; i < selected.length; i++)
1150 if (selected[i]!==0) selectionStrArray.push(FEELEMENTS[i].getAttribute(
"value"));
1152 var update =
"<div " + innerClass +
" id = \"" + CMDHISTDIVINDEX +
"\" title=\"" +
"Entered: " + Date().toString()
1153 +
"\nSelected interface: " + selectionStrArray +
"\" onclick=\"histCmdDelayDivOnclick(" + Command[2]
1154 +
")\">Delay <b>" + Command[2] +
"</b> ms</div>";
1155 contentEl.innerHTML += update;
1156 contentEl.scrollTop = contentEl.scrollHeight;
1158 var runningPercentageEl = document.getElementById(
'macroRunningPercentage');
1159 var barEl = document.getElementById(
'macroRunningBar');
1160 barWidth += barIncrement;
1161 barEl.style.width = barWidth +
'%';
1162 runningPercentageEl.innerHTML = Math.round(barWidth*10)/10 +
'%';
1163 waitForCurrentCommandToComeBack =
false;
1166 console.log(
"ERROR! Command type "+commandType+
" not found");
1174 function loadExistingMacros()
1176 DesktopContent.XMLHttpRequest(
"Request?RequestType=loadMacros",
"",loadingMacrosHandler);
1180 function loadUserHistory()
1182 DesktopContent.XMLHttpRequest(
"Request?RequestType=loadHistory",
"",loadingHistHandler);
1186 function loadingMacrosHandler(req)
1188 Debug.log(
"loadingMacrosHandler() was called.");
1190 var hugeStringOfMacros = DesktopContent.getXMLValue(req,
"returnMacroStr");
1191 var hugeStringOfPublicMacros = DesktopContent.getXMLValue(req,
"returnPublicStr");
1192 namesOfAllMacros = [];
1193 if (hugeStringOfMacros && hugeStringOfMacros.length > 0)
1195 var macrosArray = hugeStringOfMacros.split(
"@");
1197 var finalOutput =
"";
1198 for(var i = 0; i < macrosArray.length; i++)
1200 var arr = JSON.parse(macrosArray[i]);
1201 namesOfAllMacros.push(arr.name);
1202 var macroString = arr.sequence.split(
",");
1203 var forDisplay = [];
1204 for (var j = 0; j < macroString.length; j++)
1205 forDisplay.push(macroString[j].split(
":").slice(1).filter(Boolean).join(
":"));
1207 stringOfAllMacros[MACROINDEX] = macroString;
1208 out +=
"<div title='Sequence: " + forDisplay.join(
",") +
"\nNotes: "
1209 + arr.notes +
"\nCreated: " + arr.time +
"\nLSBF: " + arr.LSBF
1210 +
"\' class='macroDiv' data-id=\"" + arr.name +
"\" data-sequence=\""
1211 + macroString +
"\" data-notes=\"" + arr.notes +
"\" data-time=\""
1212 + arr.time +
"\" data-LSBF=\"" + arr.LSBF
1213 +
"\" onclick='dealWithVariables(stringOfAllMacros["
1214 + MACROINDEX +
"],\"" + arr.name +
"\",\"" + arr.LSBF +
"\")'><b>" + arr.name +
"</b></br></div>";
1218 document.getElementById(
"listOfPrivateMacros").innerHTML = out;
1221 document.getElementById(
"listOfPrivateMacros").innerHTML =
"";
1222 if (hugeStringOfPublicMacros && hugeStringOfPublicMacros.length > 0)
1224 var publicMacrosArray = hugeStringOfPublicMacros.split(
"@");
1226 var finalOutput =
"";
1227 for(var i = 0; i < publicMacrosArray.length; i++)
1229 var arr = JSON.parse(publicMacrosArray[i]);
1230 namesOfAllMacros.push(arr.name);
1231 var macroString = arr.sequence.split(
",");
1232 var forDisplay = [];
1233 for (var j = 0; j < macroString.length; j++)
1234 forDisplay.push(macroString[j].split(
":").slice(1).filter(Boolean).join(
":"));
1236 stringOfAllMacros[MACROINDEX] = macroString;
1237 out +=
"<div title='Sequence: " + forDisplay.join(
",") +
"\nNotes: "
1238 + arr.notes +
"\nCreated: " + arr.time +
"\nLSBF: " + arr.LSBF
1239 +
"\' class='macroDiv' data-id=\"" + arr.name +
"\" data-sequence=\""
1240 + macroString +
"\" data-notes=\""
1241 + arr.notes +
"\" data-time=\"" + arr.time
1242 +
"\" data-LSBF=\"" + arr.LSBF
1243 +
"\" onclick='dealWithVariables(stringOfAllMacros["
1244 + MACROINDEX +
"],\"" + arr.name +
"\",\"" + arr.LSBF +
"\")'><b>" + arr.name +
"</b></br></div>";
1248 document.getElementById(
"listOfPublicMacros").innerHTML = out;
1251 document.getElementById(
"listOfPublicMacros").innerHTML =
"";
1252 console.log(namesOfAllMacros);
1256 function loadingHistHandler(req)
1258 Debug.log(
"loadingHistHandler() was called.");
1260 var hugeStringOfHistory = DesktopContent.getXMLValue(req,
"returnHistStr");
1261 var contentEl = document.getElementById(
'historyContent');
1262 if ( !hugeStringOfHistory )
return;
1264 var commandHistArray = hugeStringOfHistory.split(
"#");
1266 var finalOutPut =
"";
1267 for(var i = 0; i < commandHistArray.length; i++)
1269 var innerClass =
"class=\"innerClass1\"";
1270 if (CMDHISTDIVINDEX%2) innerClass =
"class=\"innerClass2\"";
1272 var arr = JSON.parse(commandHistArray[i]);
1273 var oneCommand = arr.Command.split(
":");
1274 var commandType = oneCommand[0];
1275 var addressFormat = arr.Format.split(
":")[0];
1276 var dataFormat = arr.Format.split(
":")[1];
1277 var convertedAddress = convertFromHex(addressFormat,oneCommand[1]);
1278 var convertedData = convertFromHex(dataFormat,oneCommand[2]);
1279 if (isNaN(
'0x'+oneCommand[2]))
1281 convertedData =
"<span class='red'>" + oneCommand[2] +
"</span>";
1285 argData = convertedData;
1287 if(commandType==
'w')
1289 out =
"<div " + innerClass +
" id = \"" + CMDHISTDIVINDEX +
"\" title=\"" +
"Entered: "
1290 + arr.Time +
"\nSelected interface: " + arr.Interfaces
1291 +
"\" onclick=\"histCmdWriteDivOnclick(" +
"'" + convertedAddress +
1292 "','" + argData +
"','"
1293 + addressFormat +
"','" + dataFormat +
"')\">Write [" + dataFormat +
"] <b>"
1294 + convertedData +
"</b> into register [" + addressFormat +
"] <b> "
1295 + convertedAddress +
"</b></div>";
1296 finalOutPut += decodeURI(out);
1299 else if(commandType==
'r')
1301 out =
"<div " + innerClass +
" id = \"" + CMDHISTDIVINDEX +
"\" title=\"" +
"Entered: "
1302 + arr.Time +
"\nSelected interface: " + arr.Interfaces +
"\" onclick=\"histCmdReadDivOnclick(" +
1303 "'" + convertedAddress +
"','" + argData +
"'" +
1304 ",'" + addressFormat +
"','" + dataFormat +
"'" +
1305 ")\">Read [" + dataFormat +
"] <b>"
1306 + convertedData +
"</b> from register [" + addressFormat +
"] <b>" + convertedAddress +
"</b></div>";
1307 finalOutPut += decodeURI(out);
1311 Debug.log(
"ERROR! Command type "+commandType+
" not found", Debug.HIGH_PRIORITY);
1315 contentEl.innerHTML = finalOutPut;
1316 contentEl.scrollTop = contentEl.scrollHeight;
1319 function histCmdWriteDivOnclick(addressStr, dataStr, addressFormatStr, dataFormatStr)
1321 var reverse = document.getElementById(
"lsbFirst").checked;
1322 var convertedAddress = reverseLSB(convertToHex(addressFormatStr,addressStr),reverse);
1323 var convertedData = reverseLSB(convertToHex(dataFormatStr,dataStr),reverse);
1328 document.getElementById(
'addressInput').value = convertedAddress;
1329 document.getElementById(
'macroAddressInput').value = convertedAddress;
1330 document.getElementById(
'dataInput').value = convertedData;
1331 document.getElementById(
'macroDataInput').value = convertedData;
1335 Debug.log(
"Error capturing address/data into input fields: " + e);
1339 if(isOnMacroMakerPage)
1341 addCommand(
"w",convertedAddress,convertedData);
1344 callWrite(addressStr, dataStr);
1349 function histCmdReadDivOnclick(addressStr, outputStr,
1350 addressFormatStr, outputFormatStr)
1352 var reverse = document.getElementById(
"lsbFirst").checked;
1353 var convertedAddress = reverseLSB(convertToHex(addressFormatStr,addressStr),reverse);
1359 var convertedData = reverseLSB(convertToHex(outputFormatStr,outputStr),reverse);
1361 document.getElementById(
'addressInput').value = convertedAddress;
1362 document.getElementById(
'macroAddressInput').value = convertedAddress;
1363 document.getElementById(
'dataInput').value = convertedData;
1364 document.getElementById(
'macroDataInput').value = convertedData;
1368 Debug.log(
"Error capturing address/data into input fields: " + e);
1371 if(isOnMacroMakerPage)
1373 addCommand(
"r",convertedAddress)
1376 callRead(addressStr);
1380 function histCmdDelayDivOnclick(delayStr)
1382 if(isOnMacroMakerPage)
1384 addCommand(
"d",delayStr);
1389 function macroActionOnRightClick(macroName, macroAction, macroSequence, macroNotes, macroDate, macroLSBF)
1391 Debug.log(
"macroName=" + macroName +
" macroAction=" + macroAction +
1392 " macroSequence=" + macroSequence +
" macroNotes=" + macroNotes +
1393 " macroDate=" + macroDate);
1394 var isMacroPublic = !isOnPrivateMacros;
1398 if (userPermission != ADMIN_PERMISSION_THRESHOLD && isMacroPublic)
1399 document.getElementById(
"popupNoDeletePermission").style.display =
"block";
1402 document.getElementById(
'popupDeleteMacroConfirm').style.display =
"block";
1403 document.getElementById(
'macroNameForDelete').innerHTML = macroName;
1404 document.getElementById(
'popupDeleteMacroConfirmYes').onclick =
function(){
1405 DesktopContent.XMLHttpRequest(
"Request?RequestType=deleteMacro" +
1406 "&isPublic=" + isMacroPublic +
1407 "&MacroName=" + macroName,
1410 deleteMacroHandler);
1411 hideSmallPopup(
this);
1413 document.getElementById(
'popupDeleteMacroConfirmCancel').onclick =
function(){hideSmallPopup(
this)};
1417 if (userPermission != ADMIN_PERMISSION_THRESHOLD && isMacroPublic)
1418 document.getElementById(
"popupNoEditPermission").style.display =
"block";
1421 var popupEditMacro = document.getElementById(
"popupEditMacro");
1422 popupEditMacro.style.display =
"block";
1424 oldMacroNameForEdit = macroName;
1425 macroNotesForEdit = macroNotes;
1426 macroDateForEdit = macroDate;
1429 var macroSequenceEditEl = document.getElementById(
"macroSequenceEdit");
1430 arrayOfCommandsForEdit = macroSequence.split(
",");
1433 for (var i = 0; i < arrayOfCommandsForEdit.length; i++)
1435 var Command = arrayOfCommandsForEdit[i].split(
":")
1436 var commandType = Command[1];
1437 var markColor =
"1";
1439 var markColorData =
"1";
1440 var disableData =
"";
1441 var readResult =
"...";
1442 if(commandType==
'w'){
1443 if(isNaN(
'0x'+Command[2]))
1446 disable =
"disabled";
1448 if(isNaN(
'0x'+Command[3]))
1450 markColorData =
"2";
1451 disableData =
"disabled";
1453 var writeEdit =
"<lable>Write <textarea " + disableData +
1454 " class=\"JStextarea\" onchange=\"editCommands(this," +
1455 seqID +
",3)\">" + Command[3]
1456 +
"</textarea><div class='variableMark" + markColorData +
1457 "' title='Set field to variable' onclick='setFieldToVariable(this," + seqID
1458 +
",3)'>V</div> into address <textarea " + disable +
1459 " class=\"JStextarea\" onchange=\"editCommands(this," + seqID +
",2)\">" + Command[2]
1460 +
"</textarea><div class='variableMark" + markColor +
"' title='Set field to variable' onclick='setFieldToVariable(this," + seqID
1461 +
",2)'>V</div><br/></lable>";
1463 output += writeEdit;
1464 }
else if(commandType==
'r'){
1465 if(isNaN(
'0x'+Command[2]))
1468 disable =
"disabled";
1470 if(Command[3] !==
"")
1472 markColorData =
"2";
1473 readResult = Command[3];
1475 var readEdit =
"<lable>Read <textarea disabled class=\"JStextarea\" onchange=\"editCommands(this," + seqID +
",3)\">" + readResult
1476 +
"</textarea><div class='variableMark" + markColorData +
"' title='Set field to variable' onclick='setFieldToVariable(this," + seqID
1477 +
",3,1)'>V</div> from address <textarea " + disable +
" class=\"JStextarea\" onchange=\"editCommands(this," + seqID +
",2)\">" + Command[2]
1478 +
"</textarea><div class='variableMark" + markColor +
"' title='Set field to variable' onclick='setFieldToVariable(this," + seqID
1479 +
",2)'>V</div><br/></lable>";
1482 }
else if(commandType==
'd'){
1483 if(isNaN(Command[2]))
1486 disable =
"disabled";
1488 var delayEdit =
"<lable>Delay <textarea " + disable +
" class=\"JStextarea\" onchange=\"editCommands(this," + seqID +
",2)\">" + Command[2]
1489 +
"</textarea><div class='variableMark" + markColor +
"' title='Set field to variable' onclick='setFieldToVariable(this," + seqID
1490 +
",2)'>V</div> milliseconds<br/></lable>";
1492 output += delayEdit;
1494 console.log(
"ERROR! Command type "+commandType+
" not found");
1496 macroSequenceEditEl.innerHTML = output;
1497 if(macroLSBF ==
"true")
1498 document.getElementById(
"isMacroEditLSBF").checked =
true;
1500 document.getElementById(
"isMacroEditLSBF").checked =
false;
1503 var macroNameEl = document.getElementById(
"macroNameEdit");
1504 macroNameEl.value = macroName;
1505 var macroNotesEl = document.getElementById(
"macroNotesEdit");
1506 var date =
new Date();
1508 if(date.getMinutes() < 10)
1509 minutes =
"0"+date.getMinutes().toString();
1510 else minutes = date.getMinutes();
1511 var time = date.getHours() +
":" + minutes +
" " + date.toLocaleDateString();
1512 macroNotesForEdit =
"[Modified " + time +
"] " + macroNotes;
1513 macroNotesEl.value = macroNotesForEdit;
1514 document.getElementById(
"editFormat").selectedIndex = 0;
1518 var sequenceContentEl = document.getElementById(
"sequenceContent");
1519 var temp = sequenceContentEl.innerHTML;
1520 sequenceContentEl.innerHTML =
"";
1521 var arrayOfCommands = macroSequence.split(
",");
1522 for (var i = 0; i < arrayOfCommands.length; i++)
1524 var Command = arrayOfCommands[i].split(
":");
1525 addCommand(Command[1],Command[2],Command[3]);
1527 sequenceContentEl.innerHTML += temp;
1532 var arrayOfCommands = macroSequence.split(
",");
1533 for (var i = 0; i < arrayOfCommands.length; i++)
1535 var Command = arrayOfCommands[i].split(
":");
1536 addCommand(Command[1],Command[2],Command[3]);
1541 DesktopContent.XMLHttpRequest(
"Request?RequestType=exportMacro" +
1542 "&MacroName=" + macroName,
1544 "MacroSequence=" + macroSequence +
1545 "&MacroNotes=" + encodeURIComponent(macroNotes),
1546 exportMacroHandler);
1549 Debug.log(
"FE Macro Export...");
1550 exportFEMacro(macroName,macroSequence,macroNotes);
1553 Debug.log(
"Impossible!? macroAction=" + macroAction);
1558 function exportFEMacro(macroName,macroSequence,macroNotes)
1560 Debug.log(
"exportFEMacro()");
1562 var targetFEPluginName =
"";
1566 for (var i = 0; i < selected.length; i++)
1567 if(selected[i] !== 0)
1571 targetFEPluginName = FEELEMENTS[i].getAttribute(
"value").split(
":")[0];
1579 Debug.log(
"Error occured during FE Macro export: " + e, Debug.HIGH_PRIORITY);
1584 Debug.log(
"Error! To export the Macro to a FE plugin, please select " +
1585 "a single FE target from FE list. There are currently " +
1586 targetCnt +
" selected.", Debug.HIGH_PRIORITY);
1591 Debug.log(
"Exporting to plugin " + targetFEPluginName);
1592 console.log(
"macroName",macroName);
1593 console.log(
"macroSequence",macroSequence);
1594 console.log(
"macroNotes",macroNotes);
1597 DesktopContent.XMLHttpRequest(
"Request?RequestType=exportFEMacro" +
1598 "&MacroName=" + macroName +
1599 "&PluginName=" + targetFEPluginName,
1601 "MacroSequence=" + macroSequence +
1602 "&MacroNotes=" + encodeURIComponent(macroNotes),
1605 var err = DesktopContent.getXMLValue(req,
"Error");
1608 Debug.log(
"To view your front-end plugin " +
1609 "source code files...\n" +
1611 "<a onclick='DesktopContent.openNewBrowserTab(" +
1612 "\"Code Editor\",undefined /*subname undefined for LID lookup*/," +
1613 "\"?startFilePrimary=" +
1614 headerFile +
"&startFileSecondary=" +
1615 sourceFile +
"&startViewMode=1\",undefined /*unique undefined for LID lookup*/);' " +
1616 "title='Click to open a new browser tab with both source files in the Code Editor.'>" +
1617 "here</a> to open them in the Code Editor)" +
1620 "<a onclick='DesktopContent.openNewWindow(" +
1621 "\"Code Editor\",undefined /*subname undefined for LID lookup*/," +
1622 "\"?startFilePrimary=" +
1623 headerFile +
"\",undefined /*unique undefined for LID lookup*/);' " +
1624 "title='Click to open this header file in the Code Editor.'>" +
1625 headerFile +
"</a>\n\nand...\n\n" +
1628 "<a onclick='DesktopContent.openNewWindow(" +
1629 "\"Code Editor\",undefined /*subname undefined for LID lookup*/," +
1630 "\"?startFilePrimary=" +
1631 sourceFile +
"\",undefined /*unique undefined for LID lookup*/);' " +
1632 "title='Click to open this source file in the Code Editor.'>" +
1633 sourceFile +
"</a>\n\n" +
1635 "Click the links above to open the source code files in the Code Editor.\n\n"
1638 "If you would like to run existing FE Macros, try doing so here...\n" +
1639 "(You MUST compile the plugin, and reconfigure otsdaq for FE Macro changes to take effect!): " +
1640 "<a onclick='DesktopContent.openNewWindow(" +
1641 "\"FE Macro Test\",\".h\"," +
1642 "\"/WebPath/html/FEMacroTest.html?urn=" +
1643 DesktopContent._localUrnLid +
1644 "\",0 /*unique*/);' " +
1645 "title='Click to open the FE Macro Test web app.'>" +
1646 "FE Macro Test" +
"</a>\n\n"
1648 Debug.HIGH_PRIORITY);
1650 Debug.log(
"Error! Something went wrong with your FE Macro export: " +
1651 err,Debug.HIGH_PRIORITY);
1656 var headerFile = DesktopContent.getXMLValue(req,
"headerFile");
1657 var sourceFile = DesktopContent.getXMLValue(req,
"sourceFile");
1658 if(headerFile && sourceFile)
1660 Debug.log(
"Your FE Macro was succesfully exported to the front-end plugin " +
1661 "source code files...\n" +
1663 "<a onclick='DesktopContent.openNewBrowserTab(" +
1664 "\"Code Editor\",\"\"," +
1665 "\"/WebPath/html/CodeEditor.html?startFilePrimary=" +
1666 headerFile +
"&startFileSecondary=" +
1667 sourceFile +
"&startViewMode=1\",0 /*unique*/);' " +
1668 "title='Click to open a new browser tab with both source files in the Code Editor.'>" +
1669 "here</a> to open them in the Code Editor)" +
1672 "<a onclick='DesktopContent.openNewWindow(" +
1673 "\"Code Editor\",\".h\"," +
1674 "\"/WebPath/html/CodeEditor.html?startFilePrimary=" +
1675 headerFile +
"\",0 /*unique*/);' " +
1676 "title='Click to open this header file in the Code Editor.'>" +
1677 headerFile +
"</a>\n\nand...\n\n" +
1680 "<a onclick='DesktopContent.openNewWindow(" +
1681 "\"Code Editor\",\".cc\"," +
1682 "\"/WebPath/html/CodeEditor.html?startFilePrimary=" +
1683 sourceFile +
"\",0 /*unique*/);' " +
1684 "title='Click to open this source file in the Code Editor.'>" +
1685 sourceFile +
"</a>\n\n" +
1687 "Click the links above to open the source code files in the Code Editor.\n\n"
1690 "If you would like to run your new FE Macro, try doing so here...\n" +
1691 "(You MUST compile the plugin, and reconfigure otsdaq for your FE Macro changes to take effect!): " +
1692 "<a onclick='DesktopContent.openNewWindow(" +
1693 "\"FE Macro Test\",\".h\"," +
1694 "\"/WebPath/html/FEMacroTest.html?urn=" +
1695 DesktopContent._localUrnLid +
1696 "\",0 /*unique*/);' " +
1697 "title='Click to open the FE Macro Test web app.'>" +
1698 "FE Macro Test" +
"</a>\n\n"
1700 Debug.INFO_PRIORITY);
1703 Debug.log(
"Error! Something went wrong with your FE Macro export." +
1704 " Please check the logs to understand the error.",
1705 Debug.HIGH_PRIORITY);
1713 function exportMacroHandler(req)
1715 Debug.log(
"exportMacroHandler() was called. ");
1717 var exportFile = DesktopContent.getXMLValue(req,
"ExportFile");
1719 Debug.log(
"Your Macro was succesfully exported!" +
1720 " It was saved to...\n\n" + exportFile
1721 ,Debug.INFO_PRIORITY);
1725 function editCommands(textarea, seqID, index)
1727 var x = arrayOfCommandsForEdit[seqID].split(
":");
1728 if(isNaN(
"0x" + textarea.value) && textarea.value !==
"")
1730 document.getElementById(
"popupIllegalEdit").style.display =
"block";
1731 textarea.value = x[index];
1735 x[index] = textarea.value;
1736 arrayOfCommandsForEdit[seqID] = x.join(
":");
1741 function deleteMacroHandler(req)
1743 Debug.log(
"deleteMacroHandler() was called. ");
1745 loadExistingMacros();
1747 var deletedMacroName = DesktopContent.getXMLValue(req,
"deletedMacroName");
1748 var reminderEl = document.getElementById(
'reminder');
1749 reminderEl.innerHTML =
"Successfully deleted " + decodeURI(deletedMacroName);
1753 function saveChangedMacro()
1755 newMacroNameForEdit = document.getElementById(
"macroNameEdit").value;
1757 var Regex = /^[a-zA-Z0-9\_]+$/g;
1758 var Regex2 = /^[a-z0-9]+$/i;
1759 if (!Regex.test(newMacroNameForEdit))
1760 document.getElementById(
"popupIllegalNaming").style.display =
"block";
1763 if(document.getElementById(
"editFormat").value ==
"dec")
1765 var nodeListOfTextareas=document.getElementsByTagName(
'textarea');
1766 for(var i=1;i<nodeListOfTextareas.length-1;i++)
1768 if(!isNaN(
'0x'+nodeListOfTextareas[i].value))
1769 nodeListOfTextareas[i].innerHTML = convertToHex(
"dec",nodeListOfTextareas[i].value);
1772 for(var i = 0; i < arrayOfCommandsForEdit.length; i++)
1774 var eachCommand = arrayOfCommandsForEdit[i].split(
":");
1775 for (var j = 1; j < eachCommand.length; j++)
1777 if(!Regex2.test(eachCommand[j]) && eachCommand[j] !==
'')
1779 document.getElementById(
"popupIllegalInput").style.display =
"block";
1780 document.getElementById(
"illegalInputValue").innerHTML = eachCommand[j];
1783 else if (eachCommand[j] ===
'')
1785 if(eachCommand[j-2] ==
'r')
continue;
1788 document.getElementById(
"popupEmptyInput").style.display =
"block";
1795 macroNotesForEdit = document.getElementById(
'macroNotesEdit').value;
1796 if(macroNotesForEdit.indexOf(
"@") >= 0 || macroNotesForEdit.indexOf(
"#") >= 0 || macroNotesForEdit.indexOf(
"..") >= 0)
1798 document.getElementById(
"popupIllegalNotes").style.display =
"block";
1801 var isMacroLSBF = document.getElementById(
'isMacroEditLSBF').checked;
1802 var isMacroPublic = !isOnPrivateMacros;
1803 DesktopContent.XMLHttpRequest(
"Request?RequestType=editMacro" +
1804 "&isPublic=" + isMacroPublic +
1805 "&isLSBF=" + isMacroLSBF,
1807 "Sequence=" + arrayOfCommandsForEdit +
1808 "&oldMacroName=" + oldMacroNameForEdit +
1809 "&newMacroName=" + newMacroNameForEdit +
1810 "&Time=" + macroDateForEdit +
1811 "&Notes=" + encodeURIComponent(macroNotesForEdit),
1812 saveChangedMacroHandler ,
1813 newMacroNameForEdit );
1814 hidePopupEditMacro();
1819 function saveChangedMacroHandler(req,macroName)
1821 Debug.log(
"saveChangedMacroHandler() was called.");
1823 Debug.log(
"Your Macro '" + macroName +
"' was succesfully saved!",Debug.INFO_PRIORITY);
1824 loadExistingMacros();
1828 function reloadMacroSequence()
1830 var sequenceContentEl = document.getElementById(
"sequenceContent");
1831 sequenceContentEl.innerHTML =
"";
1833 SEQFORMAT = document.getElementById(
"sequenceFormat").value;
1834 var macroStringForReload = tempString.slice();
1835 for (var i = 0; i < macroStringForReload.length; i++)
1837 var Command = macroStringForReload[i].split(
":");
1838 addCommand(Command[1],Command[2],Command[3]);
1843 function reloadEditSequence()
1846 var nodeListOfTextareas=document.getElementsByTagName(
'textarea');
1847 if(document.getElementById(
"editFormat").value ==
"dec")
1849 for(var i=1;i<nodeListOfTextareas.length-1;i++)
1851 if(!isNaN(
'0x'+nodeListOfTextareas[i].value))
1852 nodeListOfTextareas[i].innerHTML = convertFromHex(
"dec",nodeListOfTextareas[i].value);
1865 for(var i=1;i<nodeListOfTextareas.length-1;i++)
1867 if(!isNaN(
'0x'+nodeListOfTextareas[i].value))
1868 nodeListOfTextareas[i].innerHTML = convertToHex(
"dec",nodeListOfTextareas[i].value);
1874 function setFieldToVariable(div, seqID, index,isReadResultField)
1876 Debug.log(
"setFieldToVariable");
1878 var popupNameVariableEl = document.getElementById(
"popupNameVariable");
1879 popupNameVariableEl.style.display =
"block";
1881 var nameVariablePromptEl = document.getElementById(
"nameVariablePrompt");
1882 var textareaEl = div.previousSibling;
1883 var currentVal = textareaEl.value;
1885 document.getElementById(
'popupNameVariableCancelButton').onclick =
function()
1887 popupNameVariableEl.style.display =
"none";
1888 document.getElementById(
"nameVariable").value =
"";
1892 if(currentVal !=
"..." && isReadResultField)
1894 document.getElementById(
'popupNameVariableSaveButton').style.display =
"none";
1895 document.getElementById(
'popupNameVariableYesButton').style.display =
"inline-block";
1896 document.getElementById(
'nameVariable').style.display =
"none";
1897 nameVariablePromptEl.innerHTML =
"Would you like to remove this field as a variable?";
1898 document.getElementById(
'popupNameVariableYesButton').onclick =
function() {
1899 div.style.backgroundColor =
"#002a52";
1900 textareaEl.value =
"...";
1901 var x = arrayOfCommandsForEdit[seqID].split(
":");
1903 arrayOfCommandsForEdit[seqID] = x.join(
":");
1904 document.getElementById(
'popupNameVariableSaveButton').style.display =
"inline-block";
1905 document.getElementById(
'popupNameVariableYesButton').style.display =
"none";
1906 document.getElementById(
'nameVariable').style.display =
"inline-block";
1907 popupNameVariableEl.style.display =
"none";
1910 else if(!isNaN(
"0x"+currentVal) || currentVal ==
"" ||
1913 nameVariablePromptEl.innerHTML =
"Setting field to variable! How would you like to name it?";
1914 document.getElementById(
'popupNameVariableSaveButton').onclick =
function() {
1915 var variableName = document.getElementById(
"nameVariable").value.toString();
1916 if(variableName ===
"")
1918 nameVariablePromptEl.innerHTML =
1919 "<span class='red'>Name of the variable cannot be empty.</span>";
1922 else if(!isNaN(
"0x"+variableName))
1924 nameVariablePromptEl.innerHTML =
1925 "<span class='red'>Name of the variable cannot be a valid hex number.</span>";
1928 div.style.backgroundColor =
"#ff0101";
1929 textareaEl.value = variableName;
1930 textareaEl.disabled =
true;
1931 var x = arrayOfCommandsForEdit[seqID].split(
":");
1932 x[index] = variableName;
1933 arrayOfCommandsForEdit[seqID] = x.join(
":");
1934 document.getElementById(
"nameVariable").value =
"";
1935 popupNameVariableEl.style.display =
"none";
1940 nameVariablePromptEl.innerHTML =
"Would you like a set value instead of a variable?";
1941 document.getElementById(
'popupNameVariableSaveButton').onclick =
function() {
1942 var variableName = document.getElementById(
"nameVariable").value.toString();
1943 if(variableName ===
"")
1945 nameVariablePromptEl.innerHTML =
1946 "<span class='red'>Name of the variable cannot be empty.</span>";
1949 else if(isNaN(
"0x"+variableName))
1951 nameVariablePromptEl.innerHTML =
1952 "<span class='red'>The value has to be a valid hex number.</span>";
1955 div.style.backgroundColor =
"#002a52";
1956 textareaEl.value = variableName;
1957 textareaEl.disabled =
false;
1958 var x = arrayOfCommandsForEdit[seqID].split(
":");
1959 x[index] = variableName;
1960 arrayOfCommandsForEdit[seqID] = x.join(
":");
1961 document.getElementById(
"nameVariable").value =
"";
1962 popupNameVariableEl.style.display =
"none";
1968 function dealWithVariables(stringOfCommands,macroName,LSBF)
1970 if (LSBF ==
"true") runningMacroLSBF = 1;
1971 if (LSBF ==
"false") runningMacroLSBF = 2;
1973 var reminderEl = document.getElementById(
'reminder');
1974 var waitForUserInputFlag = 0;
1975 var copyOfStringOfCommands = stringOfCommands.slice();
1977 var commandToChange = 0;
1978 var newCommand = [];
1979 var dictionary = {};
1980 var globalIndex = 0;
1981 var isAddressField =
true;
1983 reminderEl.innerHTML =
"Please wait till the current macro ends";
1984 else if(isArrayAllZero(selected))
1985 Debug.log(
"Please select at least one interface from the list",Debug.HIGH_PRIORITY);
1988 isMacroRunning =
true;
1989 var promptEl = document.getElementById(
'popupAskForVariableValue');
1990 timeIntervalID = setInterval(
function()
1992 if(i < stringOfCommands.length && waitForUserInputFlag === 0)
1994 var Command = stringOfCommands[i].split(
":");
1995 function setValue(index,isReadAddress)
1997 globalIndex = index;
1998 if(isReadAddress && Command[index] !==
"")
2000 readoutDictionary.push(Command[index].toString());
2002 else if (dictionary[Command[index].toString()] !== undefined)
2004 newCommand = copyOfStringOfCommands[i].split(
":");
2005 newCommand[index] = dictionary[Command[index].toString()];
2006 copyOfStringOfCommands[i] = newCommand.join(
":");
2008 else if (isNaN(
"0x"+Command[index]) && Command[index] !==
"")
2010 if(readoutDictionary.indexOf(Command[index].toString()) !== -1)
2016 waitForUserInputFlag = 1;
2017 newCommand = copyOfStringOfCommands[i].split(
":");
2018 var variableNameAtRunTime = Command[index];
2019 commandToChange = i;
2020 if(waitForUserInputFlag === 0)
2024 promptEl.style.display =
"block";
2025 document.getElementById(
'assignValuePrompt').innerHTML
2026 =
"What value would you assign to variable <span id=\"variableNameAtRunTime\" class=\"red\"></span>?</h4>"
2027 document.getElementById(
'variableNameAtRunTime').innerHTML = variableNameAtRunTime;
2032 if (Command[1] ==
"w")
2038 isAddressField =
false;
2043 isAddressField =
true;
2046 else if (Command[1] ==
"r")
2052 isAddressField =
false;
2057 isAddressField =
true;
2063 else if(i == stringOfCommands.length && waitForUserInputFlag === 0)
2065 clearInterval(timeIntervalID);
2066 console.log(
"Final command to send to run: " + copyOfStringOfCommands);
2067 runMacro(copyOfStringOfCommands, macroName);
2072 document.getElementById(
'popupAskForVariableValueContinue').onclick =
function()
2074 var variableValue = document.getElementById(
"valueAtRunTime").value.toString();
2075 if(isNaN(
"0x"+variableValue))
2077 document.getElementById(
"assignValuePrompt").innerHTML =
2078 "<span class='red'>The value has to be a hex number.</span>";
2083 dictionary[newCommand[globalIndex].toString()] = variableValue;
2084 newCommand[globalIndex] = variableValue;
2085 promptEl.style.display =
"none";
2086 copyOfStringOfCommands[commandToChange] = newCommand.join(
":");
2087 document.getElementById(
"valueAtRunTime").value =
"";
2088 waitForUserInputFlag = 0;