00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063 var ADMIN_PERMISSION_THRESHOLD = 255;
00064 var userPermission = 10;
00065 var CMDHISTDIVINDEX = 0;
00066 var SEQINDEX = 0;
00067 var MACROINDEX = 0;
00068 var FEELEMENTS = [];
00069 var macroString = [];
00070 var sortable;
00071 var stringOfAllMacros = [];
00072 var tempString = [];
00073 var readoutDictionary = [];
00074 var namesOfAllMacros = [];
00075
00076 var theAddressStrForRead = "";
00077 var isOnMacroMakerPage = false;
00078 var isOnPrivateMacros = false;
00079 var timeIntervalID;
00080 var isMacroRunning = false;
00081 var waitForCurrentCommandToComeBack = false;
00082 var putReadResultInBoxFlag = false;
00083 var runningMacroLSBF = 0;
00084 var SEQFORMAT = "hex";
00085
00086 var arrayOfCommandsForEdit = [];
00087 var oldMacroNameForEdit = "";
00088 var newMacroNameForEdit = "";
00089 var macroDateForEdit = "";
00090 var macroNotesForEdit = "";
00091
00092 var lastDeletedMacro = "";
00093 var boxOfFreshVar = "";
00094 var barWidth = 0;
00095 var barIncrement = 0;
00096
00097
00098
00099 function init()
00100 {
00101 Debug.log("init() was called");
00102 DesktopContent.XMLHttpRequest("Request?RequestType=FElist","",FElistHandler);
00103 DesktopContent.XMLHttpRequest("Request?RequestType=getPermission","",getPermissionHandler);
00104 block1El = document.getElementById('fecList');
00105 block2El = document.getElementById('macroLib');
00106 block3El = document.getElementById('main');
00107
00108 block4El = document.getElementById('progressBarOuter');
00109 block4El.style.display = "none";
00110
00111 block5El = document.getElementById('history');
00112 block6El = document.getElementById('sequence');
00113 block7El = document.getElementById('maker');
00114 block8El = document.getElementById('popupEditMacro');
00115 historybox = document.getElementById('historyContent');
00116 sequencebox = document.getElementById('sequenceContent');
00117 privateMacroBox = document.getElementById('listOfPrivateMacros');
00118 publicMacroBox = document.getElementById('listOfPublicMacros');
00119 window.onresize = redrawWindow;
00120 redrawWindow();
00121 loadExistingMacros();
00122 loadUserHistory();
00123 toggleDisplay(0);
00124 toggleMacroPublicity(0);
00125 }
00126
00127
00128
00129 function initLite()
00130 {
00131 DesktopContent.XMLHttpRequest("Request?RequestType=FElist","",
00132 FElistHandler);
00133 loadUserHistory();
00134 }
00135
00136
00137
00138 function redrawWindow()
00139 {
00140 Debug.log("Window redraw to " + window.innerWidth + " - " + window.innerHeight);
00141
00142 var w = window.innerWidth;
00143 var h = window.innerHeight;
00144 if(w < 550){
00145 w = 550;
00146 }
00147
00148
00149 var _MARGIN = 5;
00150
00151 var b1 = [_MARGIN, _MARGIN+4*_MARGIN, w/3, h/2-_MARGIN];
00152 var b2 = [_MARGIN, h/2+2*_MARGIN, w/3-_MARGIN, h/2-_MARGIN];
00153 var b3 = [w/3, _MARGIN+4*_MARGIN, w/3, h/2-_MARGIN];
00154 var b4 = [w/3, h/2+2*_MARGIN, w/3, h/2-_MARGIN];
00155 var b5 = [w*2/3,_MARGIN+4*_MARGIN,w/3-_MARGIN, h-2*_MARGIN];
00156 var b6 = [_MARGIN, _MARGIN+4*_MARGIN,w/3-2*_MARGIN, h-2*_MARGIN];
00157 var b7 = [w/3, _MARGIN+4*_MARGIN, w/3, h/2-_MARGIN];
00158 var b8 = [w/2-200,h/5,2*w/3,3*h/5+15];
00159
00160 block1El.style.left = b1[0] + "px";
00161 block1El.style.top = b1[1] + "px";
00162 block1El.style.width = b1[2] + "px";
00163 block1El.style.height = b1[3] + "px";
00164
00165 block2El.style.left = b2[0] + "px";
00166 block2El.style.top = b2[1] + "px";
00167 block2El.style.width = b2[2] + "px";
00168 block2El.style.height = b2[3] + "px";
00169
00170 block3El.style.left = b3[0] + "px";
00171 block3El.style.top = b3[1] + "px";
00172 block3El.style.width = b3[2] + "px";
00173 block3El.style.height = b3[3] + "px";
00174
00175 block4El.style.left = b4[0] + "px";
00176 block4El.style.top = b4[1] + "px";
00177 block4El.style.width = b4[2] + "px";
00178 block4El.style.height = b4[3] + "px";
00179
00180 block5El.style.left = b5[0] + "px";
00181 block5El.style.top = b5[1] + "px";
00182 block5El.style.width = b5[2] + "px";
00183 block5El.style.height = b5[3] + "px";
00184
00185 block6El.style.left = b6[0] + "px";
00186 block6El.style.top = b6[1] + "px";
00187 block6El.style.width = b6[2] + "px";
00188 block6El.style.height = b6[3] + "px";
00189
00190 block7El.style.left = b7[0] + "px";
00191 block7El.style.top = b7[1] + "px";
00192 block7El.style.width = b7[2] + "px";
00193 block7El.style.height = b7[3] + "px";
00194
00195 block8El.style.left = b8[0] + "px";
00196 block8El.style.top = b8[1] + "px";
00197 block8El.style.height = b8[3] + "px";
00198
00199 historybox.style.height = (h-_MARGIN*2-54) + "px";
00200 sequencebox.style.height = (h-_MARGIN*2-54) + "px";
00201 privateMacroBox.style.height = (h/2-_MARGIN*2-54-2) + "px";
00202 publicMacroBox.style.height = (h/2-_MARGIN*2-54-2) + "px";
00203
00204 initLite();
00205 }
00206
00207
00208 function FElistHandler(req)
00209 {
00210 Debug.log("FElistHandler() was called. ");
00211
00212 FEELEMENTS = req.responseXML.getElementsByTagName("FE");
00213 var listoffecs = document.getElementById('list');
00214 if(FEELEMENTS.length === 0)
00215 listoffecs.innerHTML = "<p class='red'>" +
00216 "<br>No Front-End interfaces were found. <br><br>Otsdaq must be configured with Front-ends, then " +
00217 "click " +
00218 "<a href='#' onclick='initLite(); return false;' >refresh</a>" +
00219 " (also in the upper-right of Macro Maker).</p>";
00220 else
00221 {
00222
00223 var w = document.getElementById("fecList").offsetWidth - 76;
00224 w /= 7;
00225 w -= 3;
00226
00227
00228 var noMultiSelect = false;
00229
00230 var keys = [];
00231 var vals = [];
00232 var types = [];
00233 var fullnames = [];
00234
00235
00236 for(var i=0;i<FEELEMENTS.length;++i)
00237 {
00238 keys[i] = "one";
00239 fullnames[i] = FEELEMENTS[i].getAttribute("value");
00240 var sp = fullnames[i].split(":");
00241
00242
00243 display = sp[2] + ":" + sp[0] + ":" + sp[1];
00244
00245 if(display.length > w)
00246 display = display.substr(0,w-4) + "..." + display.substr(display.length - 4);
00247
00248 vals[i] = "<abbr title='" + (sp[2] + ":" + sp[0] + ":" + sp[1]) + "'>"+display+"</abbr>";
00249
00250
00251
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264
00265 types[i] = "number";
00266 Debug.log(vals[i]);
00267 }
00268 listoffecs.innerHTML = "";
00269 MultiSelectBox.createSelectBox(listoffecs,
00270 "box1",
00271 "Please select from below:",
00272 vals,keys,types,"listSelectionHandler",noMultiSelect,
00273 0,
00274 0,
00275 0,
00276 0,
00277 true,
00278 0
00279 );
00280
00281 }
00282
00283 MultiSelectBox.initMySelectBoxes();
00284 }
00285
00286
00287 function getPermissionHandler(req)
00288 {
00289 Debug.log("getPermissionHandler() was called. ");
00290
00291 userPermission = DesktopContent.getXMLValue(req, "Permission");
00292 console.log("User Permission: " + userPermission);
00293 }
00294
00295
00296 function listSelectionHandler(listoffecs)
00297 {
00298 var splits = listoffecs.id.split('_');
00299 elementIndex = splits[splits.length-1] | 0;
00300 MultiSelectBox.dbg("Chosen element index:",elementIndex);
00301 }
00302
00303
00304 function callWrite(address,data)
00305 {
00306 var reminderEl = document.getElementById('reminder');
00307 if(isArrayAllZero(selected))
00308 Debug.log("Please select at least one interface from the list",Debug.HIGH_PRIORITY);
00309 else
00310 {
00311 var addressFormatStr = document.getElementById("addressFormat").value;
00312 var dataFormatStr = document.getElementById("dataFormat").value;
00313 if(isMacroRunning == true)
00314 {
00315 addressFormatStr = "hex";
00316 dataFormatStr = "hex";
00317 }
00318
00319 if (typeof address === 'undefined')
00320 {
00321 var addressStr = document.getElementById('addressInput').value.toString();
00322 var dataStr = document.getElementById('dataInput').value.toString();
00323 if(addressStr == "")
00324 {
00325 reminderEl.innerHTML = "Please enter an address to write to";
00326 return;
00327 }
00328 else if(dataStr == "")
00329 {
00330 reminderEl.innerHTML = "Please enter your data";
00331 return;
00332 }
00333 }
00334 else
00335 {
00336 var addressStr = address.toString();
00337 var dataStr = data.toString();
00338 }
00339
00340 if (addressStr.substr(0,2)=="0x") addressStr = addressStr.substr(2);
00341 if (dataStr.substr(0,2)=="0x") dataStr = dataStr.substr(2);
00342
00343 var selectionStrArray = [];
00344 var supervisorIndexArray = [];
00345 var interfaceIndexArray = [];
00346 for (var i = 0; i < selected.length; i++)
00347 {
00348 if (selected[i]!==0)
00349 {
00350 var oneInterface = FEELEMENTS[i].getAttribute("value")
00351 selectionStrArray.push(oneInterface);
00352 supervisorIndexArray.push(oneInterface.split(":")[1]);
00353 interfaceIndexArray.push(oneInterface.split(":")[2]);
00354 }
00355 }
00356 var contentEl = document.getElementById('historyContent');
00357 var innerClass = "class=\"innerClass1\"";
00358 if (CMDHISTDIVINDEX%2) innerClass = "class=\"innerClass2\"";
00359
00360 var reverse = document.getElementById("lsbFirst").checked;
00361 if(runningMacroLSBF == 1) reverse = true;
00362 if(runningMacroLSBF == 2) reverse = false;
00363
00364 var update = "<div " + innerClass + " id = \"" + CMDHISTDIVINDEX + "\" title=\"" + "Entered: "
00365 + Date().toString() + "\nSelected interface: " + selectionStrArray
00366 + "\" onclick=\"histCmdWriteDivOnclick(" + "'" + addressStr + "','" + dataStr + "','"
00367 + addressFormatStr + "','" + dataFormatStr + "')\">Write [" + dataFormatStr + "] <b>"
00368 + dataStr + LSBchecker(reverse) + "</b> into register [" + addressFormatStr + "] <b> "
00369 + addressStr + LSBchecker(reverse) + "</b></div>";
00370
00371
00372 var convertedAddress = reverseLSB(convertToHex(addressFormatStr,addressStr),reverse);
00373 var convertedData = reverseLSB(convertToHex(dataFormatStr,dataStr),reverse);
00374
00375 DesktopContent.XMLHttpRequest("Request?RequestType=writeData" +
00376 "&Address=" + convertedAddress +
00377 "&Data=" + convertedData +
00378 "&supervisorIndex=" + supervisorIndexArray +
00379 "&interfaceIndex=" + interfaceIndexArray +
00380 "&time=" + Date().toString() +
00381 "&addressFormatStr=" + addressFormatStr +
00382 "&dataFormatStr=" + dataFormatStr,
00383
00384 "interfaces=" + selectionStrArray,
00385 writeHandler);
00386 contentEl.innerHTML += update;
00387 CMDHISTDIVINDEX++;
00388 contentEl.scrollTop = contentEl.scrollHeight;
00389 reminderEl.innerHTML = "Data successfully written!";
00390 }
00391 }
00392
00393
00394 function callRead(address)
00395 {
00396 var reminderEl = document.getElementById('reminder');
00397 if(isArrayAllZero(selected))
00398 Debug.log("Please select at least one interface from the list",Debug.HIGH_PRIORITY);
00399 else
00400 {
00401 var addressFormatStr = document.getElementById("addressFormat").value;
00402 var dataFormatStr = document.getElementById("dataFormat").value;
00403
00404 if (typeof address === 'undefined')
00405 {
00406 theAddressStrForRead = document.getElementById('addressInput').value.toString();
00407 if(theAddressStrForRead === "")
00408 {
00409 reminderEl.innerHTML = "Please enter an address to read from";
00410 return;
00411 }
00412 }
00413 else
00414 theAddressStrForRead = address.toString();
00415
00416 if (theAddressStrForRead.substr(0,2)=="0x") theAddressStrForRead = theAddressStrForRead.substr(2);
00417
00418 var selectionStrArray = [];
00419 var supervisorIndexArray = [];
00420 var interfaceIndexArray = [];
00421 for (var i = 0; i < selected.length; i++)
00422 {
00423 if (selected[i]!==0)
00424 {
00425 var oneInterface = FEELEMENTS[i].getAttribute("value");
00426 if (selected[i]!==0) selectionStrArray.push(FEELEMENTS[i].getAttribute("value"));
00427 supervisorIndexArray.push(oneInterface.split(":")[1]);
00428 interfaceIndexArray.push(oneInterface.split(":")[2]);
00429 }
00430 }
00431 var reverse = document.getElementById("lsbFirst").checked;
00432 if(runningMacroLSBF == 1) reverse = true;
00433 if(runningMacroLSBF == 2) reverse = false;
00434
00435 var convertedAddress = reverseLSB(convertToHex(addressFormatStr,theAddressStrForRead),reverse);
00436
00437 DesktopContent.XMLHttpRequest("Request?RequestType=readData" +
00438 "&Address=" + convertedAddress +
00439 "&supervisorIndex=" + supervisorIndexArray +
00440 "&interfaceIndex=" + interfaceIndexArray +
00441 "&time=" + Date().toString() +
00442 "&addressFormatStr=" + addressFormatStr +
00443 "&dataFormatStr=" + dataFormatStr,
00444
00445 "interfaces=" + selectionStrArray,
00446 readHandler);
00447 }
00448 }
00449
00450
00451 function toggleReadBitField(fromLink)
00452 {
00453 var el = document.getElementById("enableReadBitField");
00454 if(fromLink)
00455 el.checked = !el.checked;
00456
00457 var val = el.checked;
00458
00459 Debug.log("checkbox val " + val);
00460 document.getElementById("readBitFieldTable").style.display = val?"block":"none";
00461 }
00462
00463
00464 function writeHandler(req)
00465 {
00466 Debug.log("writeHandler() was called.");
00467
00468 var runningPercentageEl = document.getElementById('macroRunningPercentage');
00469 var barEl = document.getElementById('macroRunningBar');
00470 barWidth += barIncrement;
00471 barEl.style.width = barWidth + '%';
00472 runningPercentageEl.innerHTML = Math.round(barWidth*10)/10 + '%';
00473 waitForCurrentCommandToComeBack = false;
00474
00475 }
00476
00477
00478 function readHandler(req)
00479 {
00480 Debug.log("readHandler() was called.");
00481
00482 var addressFormatStr = document.getElementById("addressFormat").value;
00483 var dataFormatStr = document.getElementById("dataFormat").value;
00484 var extractBitField = document.getElementById("enableReadBitField").checked && !isMacroRunning;
00485
00486 if(isMacroRunning == true)
00487 {
00488 addressFormatStr = "hex";
00489 dataFormatStr = "hex";
00490 }
00491
00492 var reminderEl = document.getElementById('reminder');
00493
00494 var dataOutput = DesktopContent.getXMLValue(req,"readData");
00495 if(putReadResultInBoxFlag) boxOfFreshVar = dataOutput;
00496
00497 var convertedOutput;
00498
00499 var reverse = document.getElementById("lsbFirst").checked;
00500 if(runningMacroLSBF == 1) reverse = true;
00501 if(runningMacroLSBF == 2) reverse = false;
00502
00503 var argOutput;
00504 if (isNaN("0x"+dataOutput))
00505 {
00506 convertedOutput = "<span class='red'>" + dataOutput + "</span>";
00507 argOutput = "";
00508 }
00509 else
00510 {
00511 convertedOutput = convertFromHex(dataFormatStr,reverseLSB(dataOutput,reverse),extractBitField);
00512 argOutput = convertedOutput;
00513 }
00514
00515 var selectionStrArray = [];
00516 for (var i = 0; i < selected.length; i++)
00517 {
00518 if (selected[i]!==0) selectionStrArray.push(FEELEMENTS[i].getAttribute("value"));
00519 }
00520 var innerClass = "class=\"innerClass1\"";
00521 if (CMDHISTDIVINDEX%2) innerClass = "class=\"innerClass2\"";
00522 var contentEl = document.getElementById('historyContent');
00523
00524 var update = "<div " + innerClass + " id = \"" + CMDHISTDIVINDEX + "\" title=\"" + "Entered: " + Date().toString()
00525 + "\nSelected interface: " + selectionStrArray + "\" onclick=\"histCmdReadDivOnclick(" +
00526 "'" + theAddressStrForRead + "','" + argOutput + "'" +
00527 ",'" + addressFormatStr + "','" + dataFormatStr + "'" +
00528 ")\">Read [" + dataFormatStr + "] <b>"
00529 + convertedOutput + LSBchecker(reverse)
00530 + "</b> from register [" + addressFormatStr + "]<b>" +
00531 theAddressStrForRead + LSBchecker(reverse) + "</b></div>";
00532
00533 theAddressStrForRead = "";
00534 contentEl.innerHTML += update;
00535 CMDHISTDIVINDEX++;
00536 contentEl.scrollTop = contentEl.scrollHeight;
00537 reminderEl.innerHTML = "Data read: " + convertedOutput;
00538 var runningPercentageEl = document.getElementById('macroRunningPercentage');
00539 var barEl = document.getElementById('macroRunningBar');
00540 barWidth += barIncrement;
00541 barEl.style.width = barWidth + '%';
00542 runningPercentageEl.innerHTML = Math.round(barWidth*10)/10 + '%';
00543 waitForCurrentCommandToComeBack = false;
00544 }
00545
00546
00547 function isArrayAllZero(arr)
00548 {
00549 for(var j = 0; j < arr.length; j++)
00550 {
00551 if (arr[j]!==0) return false;
00552 }
00553 return true;
00554 }
00555
00556
00557 function convertToHex(format,target)
00558 {
00559 switch (format)
00560 {
00561 case "hex":
00562 return target;
00563 case "dec":
00564 return Number(target).toString(16);
00565 case "ascii":
00566 var output = [];
00567 for(var i = target.length-1; i>=0; i--)
00568 output.push(target.charCodeAt(i).toString(16));
00569 return output.join('');
00570 }
00571 }
00572
00573
00574 function convertFromHex(format,target,extractBitField)
00575 {
00576 if(extractBitField)
00577 {
00578 Debug.log("Extracting Bit-Field");
00579 var startPos = document.getElementById("readBitFieldStartPos").value | 0;
00580 var fieldSz = document.getElementById("readBitFieldLength").value | 0;
00581 Debug.log("Extracting Bit-Field start/size = " + startPos + " / " + fieldSz);
00582
00583 while(((startPos/4)|0) && target.length)
00584 {
00585 target = target.substr(0,target.length-1);
00586 Debug.log("div4 target " + target);
00587 startPos -= 4;
00588 }
00589
00590 Debug.log("target " + target);
00591
00592 var size = Math.ceil((startPos+fieldSz)/4);
00593 target = target.substr(target.length-size);
00594
00595 Debug.log("sized target " + target);
00596
00597 if(target.length == 0) target = "0";
00598
00599
00600
00601 var num = parseInt(target,16);
00602 Debug.log("num " + num);
00603
00604 var mask = 0;
00605 for(var i=0;i<fieldSz;++i)
00606 mask |= (1<<i);
00607 Debug.log("mask " + mask);
00608 num = (num >> startPos) & mask;
00609
00610 Debug.log("final num " + num);
00611 target = num.toString(16).toUpperCase();
00612
00613 Debug.log("final target " + target);
00614 }
00615
00616 switch(format)
00617 {
00618 case "hex":
00619 return target;
00620 case "dec":
00621 return parseInt(target,16).toString();
00622 case "ascii":
00623 var str = '';
00624 for (var i = 0; i < target.length; i += 2)
00625 str += String.fromCharCode(parseInt(target.substr(i, 2), 16));
00626 return str;
00627 }
00628 }
00629
00630
00631 function reverseLSB(original, execute)
00632 {
00633 if(execute)
00634 {
00635 var str = '';
00636 if(original.length%2)
00637 original = "0"+original;
00638 for (var i = original.length-2; i > -2; i -= 2)
00639 str += original.substr(i,2);
00640 return str;
00641 }
00642 else return original;
00643 }
00644
00645
00646 function LSBchecker(LSBF)
00647 {
00648 if(LSBF) return "*";
00649 else return "";
00650 }
00651
00652
00653 function toggleDisplay(onMacro)
00654 {
00655 var fecListEl = document.getElementById("fecList");
00656 var macroLibEl = document.getElementById("macroLib");
00657 var sequenceEl = document.getElementById("sequence");
00658 var progressBarOuterEl = document.getElementById("progressBarOuter");
00659 var mainEl = document.getElementById("main");
00660 var makerEl = document.getElementById("maker");
00661
00662 if (onMacro) {
00663 isOnMacroMakerPage = true;
00664 fecListEl.style.display = "none";
00665 macroLibEl.style.display = "none";
00666 sequenceEl.style.display = "block";
00667 progressBarOuterEl.style.display = "none";
00668 mainEl.style.display = "none";
00669 makerEl.style.display = "block";
00670 document.getElementById("page1tag").style.fontWeight = "400";
00671 document.getElementById("page2tag").style.fontWeight = "900";
00672 document.getElementById("page2tag").style.background = "#002a52";
00673 document.getElementById("page1tag").style.background = "#001626";
00674
00675 }
00676 else
00677 {
00678 isOnMacroMakerPage = false;
00679 fecListEl.style.display = "block";
00680 macroLibEl.style.display = "block";
00681 sequenceEl.style.display = "none";
00682 progressBarOuterEl.style.display = "none";
00683 mainEl.style.display = "block";
00684 makerEl.style.display = "none";
00685 document.getElementById("page2tag").style.fontWeight = "400";
00686 document.getElementById("page1tag").style.fontWeight = "900";
00687 document.getElementById("page1tag").style.background = "#002a52";
00688 document.getElementById("page2tag").style.background = "#001626";
00689
00690
00691 }
00692 }
00693
00694
00695 function toggleMacroPublicity(onPublic)
00696 {
00697 var privateEl = document.getElementById("listOfPrivateMacros");
00698 var publicEl = document.getElementById("listOfPublicMacros");
00699 if(onPublic) {
00700 privateEl.style.display = "none";
00701 publicEl.style.display = "block";
00702 document.getElementById("publicTag").style.fontWeight = "900";
00703 document.getElementById("privateTag").style.fontWeight = "400";
00704 document.getElementById("publicTag").style.background = "#002a52";
00705 document.getElementById("privateTag").style.background = "#001626";
00706
00707 isOnPrivateMacros = false;
00708 }
00709 else
00710 {
00711 privateEl.style.display = "block";
00712 publicEl.style.display = "none";
00713 document.getElementById("privateTag").style.fontWeight = "900";
00714 document.getElementById("publicTag").style.fontWeight = "400";
00715 document.getElementById("privateTag").style.background = "#002a52";
00716 document.getElementById("publicTag").style.background = "#001626";
00717
00718 isOnPrivateMacros = true;
00719 }
00720 }
00721
00722
00723 function addCommand(command,address,data)
00724 {
00725 var contentEl = document.getElementById('sequenceContent');
00726 var macroReminderEl = document.getElementById('macroReminder');
00727 macroReminderEl.innerHTML = "";
00728 var formatMarkerHead, formatMarkerTail = "";
00729 if(SEQFORMAT == "hex") formatMarkerHead = "0x";
00730 else if(SEQFORMAT == "ascii")
00731 {
00732 formatMarkerHead = "\"";
00733 formatMarkerTail = "\"";
00734 }
00735 else
00736 {
00737 formatMarkerHead = "";
00738 formatMarkerTail = "";
00739 }
00740 switch(command)
00741 {
00742 case 'w':
00743 if (typeof address === 'undefined')
00744 {
00745 var addressStrBefore = document.getElementById('macroAddressInput').value.toString();
00746 var dataStrBefore = document.getElementById('macroDataInput').value.toString();
00747 if(addressStrBefore === "")
00748 {
00749 macroReminderEl.innerHTML = "Please enter an address to write to";
00750 return;
00751 }
00752 else if(dataStrBefore === "")
00753 {
00754 macroReminderEl.innerHTML = "Please enter your data";
00755 return;
00756 }
00757 var addressFormatStr = document.getElementById("macroAddressFormat").value;
00758 var dataFormatStr = document.getElementById("macroDataFormat").value;
00759 var reverse = document.getElementById("lsbFirst").checked;
00760 var addressStr = reverseLSB(convertToHex(addressFormatStr,addressStrBefore),reverse);
00761 var dataStr = reverseLSB(convertToHex(dataFormatStr,dataStrBefore),reverse);
00762 }
00763 else
00764 {
00765 var addressStr = address.toString();
00766 var dataStr = data.toString();
00767 }
00768 var update = "<div id = \"seq" + SEQINDEX + "\" data-id =" + SEQINDEX
00769 + " onmouseout=\"hideDeletex(" + SEQINDEX + ")\" onmouseover=\"showDeletex("
00770 + SEQINDEX + ")\" ondragstart=\"hideDeletex(" + SEQINDEX
00771 + ")\" ondragend=\"getOrder()\" class=\"seqDiv\"><p class=\"insideSEQ textSEQ\">Write <b>"
00772 + formatMarkerHead + convertFromHex(SEQFORMAT,dataStr) + formatMarkerTail + "</b> into <b>"
00773 + formatMarkerHead + convertFromHex(SEQFORMAT,addressStr) + formatMarkerTail
00774 + "</b></p><img src=\"/WebPath/images/windowContentImages/macromaker-delete.png\" id=\"deletex"
00775 + SEQINDEX + "\" class=\"insideSEQ deletex\" onclick=\"removeCommand("
00776 + SEQINDEX + ")\"></></div>";
00777 var writeMacroString = SEQINDEX + ":w:" + addressStr + ":" + dataStr;
00778 macroString.push(writeMacroString);
00779 break;
00780 case 'r':
00781 if (typeof address === 'undefined')
00782 {
00783 var addressStrBefore = document.getElementById('macroAddressInput').value.toString();
00784 if(addressStrBefore === "")
00785 {
00786 macroReminderEl.innerHTML = "Please enter an address to read from";
00787 return;
00788 }
00789 var addressFormatStr = document.getElementById("macroAddressFormat").value;
00790 var reverse = document.getElementById("lsbFirst").checked;
00791 var addressStr = reverseLSB(convertToHex(addressFormatStr,addressStrBefore),reverse);
00792 }
00793 else var addressStr = address.toString();
00794 var update = "<div id = \"seq" + SEQINDEX + "\" data-id =" + SEQINDEX
00795 + " onmouseout=\"hideDeletex(" + SEQINDEX + ")\" onmouseover=\"showDeletex("
00796 + SEQINDEX + ")\" ondragstart=\"hideDeletex(" + SEQINDEX
00797 + ")\" ondragend=\"getOrder()\" class=\"seqDiv\"><p class=\"insideSEQ\">Read from <b>"
00798 + formatMarkerHead + convertFromHex(SEQFORMAT,addressStr) + formatMarkerTail
00799 + "</b></p><img src=\"/WebPath/images/windowContentImages/macromaker-delete.png\" id=\"deletex"
00800 + SEQINDEX + "\" class=\"insideSEQ deletex\" onclick=\"removeCommand("
00801 + SEQINDEX + ")\"></></div>";
00802 var readMacroString = SEQINDEX+":r:"+addressStr+":";
00803 macroString.push(readMacroString);
00804 break;
00805 case 'd':
00806 if (typeof address === 'undefined')
00807 {
00808 var delayStr = document.getElementById('delayInput').value.toString();
00809 if(delayStr === "")
00810 {
00811 macroReminderEl.innerHTML = "Please enter a delay";
00812 return;
00813 }
00814 else if (isNaN(delayStr))
00815 {
00816 macroReminderEl.innerHTML = "Delay has to be a numerical number";
00817 return;
00818 }
00819 if(document.getElementById("delayUnit").value === "s") delayStr = Number(delayStr)*1000;
00820
00821 }
00822 else
00823 var delayStr = address.toString();
00824 var update = "<div id = \"seq" + SEQINDEX + "\" data-id =" + SEQINDEX
00825 + " onmouseout=\"hideDeletex(" + SEQINDEX + ")\" onmouseover=\"showDeletex("
00826 + SEQINDEX + ")\" ondragstart=\"hideDeletex(" + SEQINDEX
00827 + ")\" ondragend=\"getOrder()\" class=\"seqDiv\"><p class=\"insideSEQ\">Delay <b>"
00828 + delayStr + "</b> ms</p><img src=\"/WebPath/images/windowContentImages/macromaker-delete.png\" id=\"deletex"
00829 + SEQINDEX + "\" class=\"insideSEQ deletex\" onclick=\"removeCommand(" + SEQINDEX
00830 + ")\"></></div>";
00831 var delayMacroString = SEQINDEX+":d:"+delayStr;
00832 macroString.push(delayMacroString);
00833 break;
00834 default:
00835 Debug.log("So if it's not write, read, or delay, what is it??");
00836 }
00837 contentEl.innerHTML += update;
00838 SEQINDEX++;
00839 contentEl.scrollTop = contentEl.scrollHeight;
00840 sortable = Sortable.create(contentEl,{
00841 chosenClass: 'chosenClassInSequence',
00842 ghostClass:'ghostClassInSequence'
00843 });
00844 getOrder();
00845 }
00846
00847
00848 function hideDeletex(seqIndex)
00849 {
00850 var deleteID = "deletex"+seqIndex;
00851 document.getElementById(deleteID).style.display = "none";
00852 }
00853
00854
00855 function showDeletex(seqIndex)
00856 {
00857 var deleteID = "deletex"+seqIndex;
00858 var deleteEl = document.getElementById(deleteID);
00859 deleteEl.style.top = (deleteEl.parentNode.offsetTop + 1) + "px";
00860 deleteEl.style.left = (deleteEl.parentNode.offsetLeft +
00861 deleteEl.parentNode.offsetWidth - 20) + "px";
00862 deleteEl.style.display = "block";
00863 }
00864
00865
00866 function getOrder()
00867 {
00868 tempString = [];
00869 var order = sortable.toArray();
00870
00871 var sorting = order.slice();
00872 sorting.sort(function(a,b){ return a-b;});
00873
00874
00875 for(var i = 0; i < macroString.length; i++)
00876 tempString.push(macroString[sorting.indexOf(order[i])]);
00877 }
00878
00879
00880 function removeCommand(seqIndex)
00881 {
00882 document.getElementById("undoDelete").disabled = false;
00883 var child = document.getElementById("seq"+seqIndex);
00884 var parent = document.getElementById('sequenceContent');
00885 parent.removeChild(child);
00886 for (var i = 0; i < macroString.length; i++)
00887 {
00888 if (seqIndex == macroString[i].split(":")[0])
00889 {
00890 lastDeletedMacro = macroString[i];
00891 macroString.splice(i,1);
00892 }
00893 }
00894 getOrder();
00895 }
00896
00897
00898 function undoDelete()
00899 {
00900 addCommand(lastDeletedMacro.split(":")[1],lastDeletedMacro.split(":")[2],lastDeletedMacro.split(":")[3]);
00901 document.getElementById("undoDelete").disabled = true;
00902 }
00903
00904
00905 function showPopupClearAllConfirm()
00906 {
00907 var popupClearAllConfirm = document.getElementById("popupClearAllConfirm");
00908 popupClearAllConfirm.style.display = "block";
00909 }
00910
00911
00912 function showPopupClearHistoryConfirm()
00913 {
00914 var popupClearAllConfirm = document.getElementById("popupClearHistoryConfirm");
00915 popupClearAllConfirm.style.display = "block";
00916 }
00917
00918
00919 function clearAll(el)
00920 {
00921 var contentEl = document.getElementById('sequenceContent');
00922 contentEl.innerHTML = "";
00923 macroString = [];
00924 hideSmallPopup(el);
00925 }
00926
00927
00928 function clearHistory(el)
00929 {
00930 DesktopContent.XMLHttpRequest("Request?RequestType=clearHistory","",clearHistoryHandler);
00931 var contentEl = document.getElementById('historyContent');
00932 contentEl.innerHTML = "";
00933 hideSmallPopup(el);
00934 }
00935
00936
00937 function clearHistoryHandler(req)
00938 {
00939 Debug.log("clearHistoryHandler() was called.");
00940
00941 loadUserHistory();
00942 }
00943
00944
00945 function hideSmallPopup(el)
00946 {
00947 var wholeDiv = el.parentNode.parentNode.parentNode;
00948 wholeDiv.style.display = "none";
00949 }
00950
00951
00952 function saveMacro()
00953 {
00954 if (macroString.length === 0)
00955 document.getElementById('macroReminder').innerHTML = "Macro sequence cannot be empty";
00956 else
00957 {
00958 document.getElementById("popupSaveMacro").style.display = "block";
00959 if (userPermission == ADMIN_PERMISSION_THRESHOLD)
00960 document.getElementById("makeMacroPublic").style.display = "block";
00961 }
00962 }
00963
00964
00965 function hidePopupSaveMacro()
00966 {
00967 var popupSaveMacro = document.getElementById("popupSaveMacro");
00968 popupSaveMacro.style.display = "none";
00969 document.getElementById("macroName").value="";
00970 document.getElementById("macroNotes").value="";
00971 document.getElementById('macroReminder').innerHTML = "Macro successfully saved!";
00972 }
00973
00974
00975 function hidePopupEditMacro()
00976 {
00977 var popupEditMacro = document.getElementById("popupEditMacro");
00978 popupEditMacro.style.display = "none";
00979 arrayOfCommandsForEdit = [];
00980 }
00981
00982
00983 function saveAsMacro()
00984 {
00985 getOrder();
00986 var macroName = document.getElementById("macroName").value;
00987
00988 var Regex = /^[a-zA-Z0-9\_]+$/g;
00989 if (!Regex.test(macroName))
00990 document.getElementById("popupIllegalNaming").style.display = "block";
00991 else
00992 {
00993 var macroNotes = document.getElementById("macroNotes").value;
00994 if(macroNotes.indexOf("@") >= 0 || macroNotes.indexOf("#") >= 0 || macroNotes.indexOf("..") >= 0)
00995 {
00996 document.getElementById("popupIllegalNotes").style.display = "block";
00997 return;
00998 }
00999 var macroLibEl = document.getElementById('listOfPrivateMacros');
01000 stringOfAllMacros[MACROINDEX] = tempString;
01001 var isMacroPublic = document.getElementById("isMacroPublic").checked;
01002 var isMacroLSBF = document.getElementById("isMacroLSBF").checked;
01003
01004 if(namesOfAllMacros.indexOf(macroName) !== -1)
01005 {
01006 document.getElementById("popupMacroAlreadyExists").style.display = "block";
01007 document.getElementById("duplicateName").innerHTML = macroName;
01008 document.getElementById("popupMacroAlreadyExistsCancel").onclick = function(){
01009 hideSmallPopup(this);
01010 return;
01011 };
01012
01013 document.getElementById('popupMacroAlreadyExistsOverwrite').onclick = function(){
01014 DesktopContent.XMLHttpRequest("Request?RequestType=editMacro" +
01015 "&isPublic=" + isMacroPublic +
01016 "&isLSBF=" + isMacroLSBF +
01017
01018 "oldMacroName=" + macroName +
01019 "&newMacroName=" + macroName +
01020 "&Sequence=" + tempString +
01021 "&Time=" + Date().toString() +
01022 "&Notes=" + encodeURIComponent(macroNotes),
01023 saveChangedMacroHandler ,
01024 macroName );
01025
01026 hideSmallPopup(this);
01027 hidePopupSaveMacro();
01028 macroLibEl.scrollTop = macroLibEl.scrollHeight - macroLibEl.clientHeight;
01029 };
01030 }
01031 else
01032 {
01033 DesktopContent.XMLHttpRequest("Request?RequestType=createMacro" +
01034 "&isPublic="+isMacroPublic+
01035 "&isLSBF="+isMacroLSBF,
01036
01037 "Name=" + macroName +
01038 "&Sequence=" + tempString +
01039 "&Time=" + Date().toString() +
01040 "&Notes=" + encodeURIComponent(macroNotes),
01041 createMacroHandler ,
01042 macroName );
01043
01044 hidePopupSaveMacro();
01045 macroLibEl.scrollTop = macroLibEl.scrollHeight - macroLibEl.clientHeight;
01046 }
01047 }
01048 }
01049
01050
01051 function createMacroHandler(req,macroName)
01052 {
01053 Debug.log("createMacroHandler() was called for " + macroName);
01054
01055 Debug.log("Your Macro '" + macroName + "' was succesfully saved!",Debug.INFO_PRIORITY);
01056 loadExistingMacros();
01057
01058 }
01059
01060
01061 function runMacro(stringOfCommands,macroName)
01062 {
01063 var contentEl = document.getElementById('historyContent');
01064 var progressBarInnerEl = document.getElementById('progressBarInner');
01065 var progressBarOuterEl = document.getElementById("progressBarOuter");
01066
01067 var start = "<p class=\"red\"><b><small>-- Start of Macro: " + macroName + " --</small></b></p>";
01068 contentEl.innerHTML += start;
01069 contentEl.scrollTop = contentEl.scrollHeight;
01070
01071 progressBarInnerEl.style.display = "block";
01072 progressBarOuterEl.style.display = "block";
01073 var barEl = document.getElementById('macroRunningBar');
01074 barEl.style.width = '0%';
01075 barIncrement = 100/stringOfCommands.length;
01076 var i = 0;
01077 var copyOfStringOfCommands = stringOfCommands.slice();
01078 timeIntervalID = setInterval(function(){
01079 if(!waitForCurrentCommandToComeBack)
01080 {
01081 if(i == stringOfCommands.length)
01082 {
01083 var end = "<p class=\"red\"><b><small>-- End of Macro: " + macroName + " --</small></b></p>";
01084 contentEl.innerHTML += end;
01085 contentEl.scrollTop = contentEl.scrollHeight;
01086 isMacroRunning = false;
01087 setTimeout(function(){
01088 progressBarInnerEl.style.display = "none";
01089 progressBarOuterEl.style.display = "none";
01090 }, 150);
01091 barWidth = 0;
01092 barIncrement = 0;
01093 runningMacroLSBF = 0;
01094 clearInterval(timeIntervalID);
01095 }
01096 else
01097 {
01098 var Command = copyOfStringOfCommands[i].split(":")
01099 var commandType = Command[1];
01100 if(commandType=='w'){
01101 callWrite(Command[2],Command[3]);
01102 waitForCurrentCommandToComeBack = true;
01103 }else if(commandType=='r'){
01104 if(readoutDictionary.indexOf(Command[3].toString()) !== -1)
01105 {
01106 if(boxOfFreshVar === "")
01107 {
01108 putReadResultInBoxFlag = true;
01109 callRead(Command[2])
01110 waitForCurrentCommandToComeBack = true;
01111 i--;
01112 }
01113 else
01114 {
01115 for(var j = i+1; j < copyOfStringOfCommands.length; j++)
01116 {
01117 if(copyOfStringOfCommands[j].split(":")[2] == Command[3])
01118 {
01119 var newCommand = copyOfStringOfCommands[j].split(":");
01120 newCommand[2] = boxOfFreshVar;
01121 copyOfStringOfCommands[j] = newCommand.join(":");
01122 }
01123
01124 if(copyOfStringOfCommands[j].split(":")[3] == Command[3])
01125 {
01126 var newCommand = copyOfStringOfCommands[j].split(":");
01127 newCommand[3] = boxOfFreshVar;
01128 copyOfStringOfCommands[j] = newCommand.join(":");
01129 }
01130 }
01131 boxOfFreshVar = "";
01132 putReadResultInBoxFlag = false;
01133 console.log("final command after 2nd replacement" + copyOfStringOfCommands);
01134 }
01135 }
01136 else
01137 {
01138 callRead(Command[2]);
01139 waitForCurrentCommandToComeBack = true;
01140 }
01141 }
01142 else if(commandType=='d'){
01143 waitForCurrentCommandToComeBack = true;
01144 setTimeout(function(){delay();},Number(Command[2]));
01145 function delay(){
01146
01147 var contentEl = document.getElementById('historyContent');
01148 var innerClass = "class=\"innerClass1\"";
01149 if (CMDHISTDIVINDEX%2) innerClass = "class=\"innerClass2\"";
01150 var selectionStrArray = [];
01151 for (var i = 0; i < selected.length; i++)
01152 {
01153 if (selected[i]!==0) selectionStrArray.push(FEELEMENTS[i].getAttribute("value"));
01154 }
01155 var update = "<div " + innerClass + " id = \"" + CMDHISTDIVINDEX + "\" title=\"" + "Entered: " + Date().toString()
01156 + "\nSelected interface: " + selectionStrArray + "\" onclick=\"histCmdDelayDivOnclick(" + Command[2]
01157 + ")\">Delay <b>" + Command[2] + "</b> ms</div>";
01158 contentEl.innerHTML += update;
01159 contentEl.scrollTop = contentEl.scrollHeight;
01160 CMDHISTDIVINDEX++;
01161 var runningPercentageEl = document.getElementById('macroRunningPercentage');
01162 var barEl = document.getElementById('macroRunningBar');
01163 barWidth += barIncrement;
01164 barEl.style.width = barWidth + '%';
01165 runningPercentageEl.innerHTML = Math.round(barWidth*10)/10 + '%';
01166 waitForCurrentCommandToComeBack = false;
01167 }
01168 }else
01169 console.log("ERROR! Command type "+commandType+" not found");
01170 i++;
01171 }
01172 }
01173 },200);
01174 }
01175
01176
01177 function loadExistingMacros()
01178 {
01179 DesktopContent.XMLHttpRequest("Request?RequestType=loadMacros","",loadingMacrosHandler);
01180 }
01181
01182
01183 function loadUserHistory()
01184 {
01185 DesktopContent.XMLHttpRequest("Request?RequestType=loadHistory","",loadingHistHandler);
01186 }
01187
01188
01189 function loadingMacrosHandler(req)
01190 {
01191 Debug.log("loadingMacrosHandler() was called.");
01192
01193 var hugeStringOfMacros = DesktopContent.getXMLValue(req,"returnMacroStr");
01194 var hugeStringOfPublicMacros = DesktopContent.getXMLValue(req,"returnPublicStr");
01195 namesOfAllMacros = [];
01196 if (hugeStringOfMacros && hugeStringOfMacros.length > 0)
01197 {
01198 var macrosArray = hugeStringOfMacros.split("@");
01199 var out = "";
01200 var finalOutput = "";
01201 for(var i = 0; i < macrosArray.length; i++)
01202 {
01203 var arr = JSON.parse(macrosArray[i]);
01204 namesOfAllMacros.push(arr.name);
01205 var macroString = arr.sequence.split(",");
01206 var forDisplay = [];
01207 for (var j = 0; j < macroString.length; j++)
01208 forDisplay.push(macroString[j].split(":").slice(1).filter(Boolean).join(":"));
01209
01210 stringOfAllMacros[MACROINDEX] = macroString;
01211 out += "<div title='Sequence: " + forDisplay.join(",") + "\nNotes: "
01212 + arr.notes + "\nCreated: " + arr.time + "\nLSBF: " + arr.LSBF
01213 + "\' class='macroDiv' data-id=\"" + arr.name + "\" data-sequence=\""
01214 + macroString + "\" data-notes=\"" + arr.notes + "\" data-time=\""
01215 + arr.time + "\" data-LSBF=\"" + arr.LSBF
01216 + "\" onclick='dealWithVariables(stringOfAllMacros["
01217 + MACROINDEX + "],\"" + arr.name + "\",\"" + arr.LSBF + "\")'><b>" + arr.name + "</b></br></div>";
01218 MACROINDEX++;
01219 }
01220
01221 document.getElementById("listOfPrivateMacros").innerHTML = out;
01222 }
01223 else
01224 document.getElementById("listOfPrivateMacros").innerHTML = "";
01225 if (hugeStringOfPublicMacros && hugeStringOfPublicMacros.length > 0)
01226 {
01227 var publicMacrosArray = hugeStringOfPublicMacros.split("@");
01228 var out = "";
01229 var finalOutput = "";
01230 for(var i = 0; i < publicMacrosArray.length; i++)
01231 {
01232 var arr = JSON.parse(publicMacrosArray[i]);
01233 namesOfAllMacros.push(arr.name);
01234 var macroString = arr.sequence.split(",");
01235 var forDisplay = [];
01236 for (var j = 0; j < macroString.length; j++)
01237 forDisplay.push(macroString[j].split(":").slice(1).filter(Boolean).join(":"));
01238
01239 stringOfAllMacros[MACROINDEX] = macroString;
01240 out += "<div title='Sequence: " + forDisplay.join(",") + "\nNotes: "
01241 + arr.notes + "\nCreated: " + arr.time + "\nLSBF: " + arr.LSBF
01242 + "\' class='macroDiv' data-id=\"" + arr.name + "\" data-sequence=\""
01243 + macroString + "\" data-notes=\""
01244 + arr.notes + "\" data-time=\"" + arr.time
01245 + "\" data-LSBF=\"" + arr.LSBF
01246 + "\" onclick='dealWithVariables(stringOfAllMacros["
01247 + MACROINDEX + "],\"" + arr.name + "\",\"" + arr.LSBF + "\")'><b>" + arr.name + "</b></br></div>";
01248
01249 MACROINDEX++;
01250 }
01251 document.getElementById("listOfPublicMacros").innerHTML = out;
01252 }
01253 else
01254 document.getElementById("listOfPublicMacros").innerHTML = "";
01255 console.log(namesOfAllMacros);
01256 }
01257
01258
01259 function loadingHistHandler(req)
01260 {
01261 Debug.log("loadingHistHandler() was called.");
01262
01263 var hugeStringOfHistory = DesktopContent.getXMLValue(req,"returnHistStr");
01264 var contentEl = document.getElementById('historyContent');
01265 if ( !hugeStringOfHistory ) return;
01266
01267 var commandHistArray = hugeStringOfHistory.split("#");
01268 var out = "";
01269 var finalOutPut = "";
01270 for(var i = 0; i < commandHistArray.length; i++)
01271 {
01272 var innerClass = "class=\"innerClass1\"";
01273 if (CMDHISTDIVINDEX%2) innerClass = "class=\"innerClass2\"";
01274
01275 var arr = JSON.parse(commandHistArray[i]);
01276 var oneCommand = arr.Command.split(":");
01277 var commandType = oneCommand[0];
01278 var addressFormat = arr.Format.split(":")[0];
01279 var dataFormat = arr.Format.split(":")[1];
01280 var convertedAddress = convertFromHex(addressFormat,oneCommand[1]);
01281 var convertedData = convertFromHex(dataFormat,oneCommand[2]);
01282 if (isNaN('0x'+oneCommand[2]))
01283 {
01284 convertedData = "<span class='red'>" + oneCommand[2] + "</span>";
01285 argData = "";
01286 }
01287 else
01288 argData = convertedData;
01289
01290 if(commandType=='w')
01291 {
01292 out = "<div " + innerClass + " id = \"" + CMDHISTDIVINDEX + "\" title=\"" + "Entered: "
01293 + arr.Time + "\nSelected interface: " + arr.Interfaces
01294 + "\" onclick=\"histCmdWriteDivOnclick(" + "'" + convertedAddress +
01295 "','" + argData + "','"
01296 + addressFormat + "','" + dataFormat + "')\">Write [" + dataFormat + "] <b>"
01297 + convertedData + "</b> into register [" + addressFormat + "] <b> "
01298 + convertedAddress + "</b></div>";
01299 finalOutPut += decodeURI(out);
01300 CMDHISTDIVINDEX++;
01301 }
01302 else if(commandType=='r')
01303 {
01304 out = "<div " + innerClass + " id = \"" + CMDHISTDIVINDEX + "\" title=\"" + "Entered: "
01305 + arr.Time + "\nSelected interface: " + arr.Interfaces + "\" onclick=\"histCmdReadDivOnclick(" +
01306 "'" + convertedAddress + "','" + argData + "'" +
01307 ",'" + addressFormat + "','" + dataFormat + "'" +
01308 ")\">Read [" + dataFormat + "] <b>"
01309 + convertedData + "</b> from register [" + addressFormat + "] <b>" + convertedAddress + "</b></div>";
01310 finalOutPut += decodeURI(out);
01311 CMDHISTDIVINDEX++;
01312 }
01313 else
01314 Debug.log("ERROR! Command type "+commandType+" not found", Debug.HIGH_PRIORITY);
01315
01316 }
01317
01318 contentEl.innerHTML = finalOutPut;
01319 contentEl.scrollTop = contentEl.scrollHeight;
01320 }
01321
01322 function histCmdWriteDivOnclick(addressStr, dataStr, addressFormatStr, dataFormatStr)
01323 {
01324 var reverse = document.getElementById("lsbFirst").checked;
01325 var convertedAddress = reverseLSB(convertToHex(addressFormatStr,addressStr),reverse);
01326 var convertedData = reverseLSB(convertToHex(dataFormatStr,dataStr),reverse);
01327
01328
01329 try
01330 {
01331 document.getElementById('addressInput').value = convertedAddress;
01332 document.getElementById('macroAddressInput').value = convertedAddress;
01333 document.getElementById('dataInput').value = convertedData;
01334 document.getElementById('macroDataInput').value = convertedData;
01335 }
01336 catch(e)
01337 {
01338 Debug.log("Error capturing address/data into input fields: " + e);
01339 }
01340
01341
01342 if(isOnMacroMakerPage)
01343 {
01344 addCommand("w",convertedAddress,convertedData);
01345 }
01346 else
01347 callWrite(addressStr, dataStr);
01348
01349 }
01350
01351
01352 function histCmdReadDivOnclick(addressStr, outputStr,
01353 addressFormatStr, outputFormatStr)
01354 {
01355 var reverse = document.getElementById("lsbFirst").checked;
01356 var convertedAddress = reverseLSB(convertToHex(addressFormatStr,addressStr),reverse);
01357
01358
01359
01360 try
01361 {
01362 var convertedData = reverseLSB(convertToHex(outputFormatStr,outputStr),reverse);
01363
01364 document.getElementById('addressInput').value = convertedAddress;
01365 document.getElementById('macroAddressInput').value = convertedAddress;
01366 document.getElementById('dataInput').value = convertedData;
01367 document.getElementById('macroDataInput').value = convertedData;
01368 }
01369 catch(e)
01370 {
01371 Debug.log("Error capturing address/data into input fields: " + e);
01372 }
01373
01374 if(isOnMacroMakerPage)
01375 {
01376 addCommand("r",convertedAddress)
01377 }
01378 else
01379 callRead(addressStr);
01380
01381 }
01382
01383 function histCmdDelayDivOnclick(delayStr)
01384 {
01385 if(isOnMacroMakerPage)
01386 {
01387 addCommand("d",delayStr);
01388 }
01389 else return;
01390 }
01391
01392 function macroActionOnRightClick(macroName, macroAction, macroSequence, macroNotes, macroDate, macroLSBF)
01393 {
01394 Debug.log("macroName=" + macroName + " macroAction=" + macroAction +
01395 " macroSequence=" + macroSequence + " macroNotes=" + macroNotes +
01396 " macroDate=" + macroDate);
01397 var isMacroPublic = !isOnPrivateMacros;
01398 switch(macroAction)
01399 {
01400 case "Delete":
01401 if (userPermission != ADMIN_PERMISSION_THRESHOLD && isMacroPublic)
01402 document.getElementById("popupNoDeletePermission").style.display = "block";
01403 else
01404 {
01405 document.getElementById('popupDeleteMacroConfirm').style.display = "block";
01406 document.getElementById('macroNameForDelete').innerHTML = macroName;
01407 document.getElementById('popupDeleteMacroConfirmYes').onclick = function(){
01408 DesktopContent.XMLHttpRequest("Request?RequestType=deleteMacro" +
01409 "&isPublic=" + isMacroPublic +
01410 "&MacroName=" + macroName,
01411
01412 "",
01413 deleteMacroHandler);
01414 hideSmallPopup(this);
01415 };
01416 document.getElementById('popupDeleteMacroConfirmCancel').onclick = function(){hideSmallPopup(this)};
01417 }
01418 break;
01419 case "Edit":
01420 if (userPermission != ADMIN_PERMISSION_THRESHOLD && isMacroPublic)
01421 document.getElementById("popupNoEditPermission").style.display = "block";
01422 else
01423 {
01424 var popupEditMacro = document.getElementById("popupEditMacro");
01425 popupEditMacro.style.display = "block";
01426
01427 oldMacroNameForEdit = macroName;
01428 macroNotesForEdit = macroNotes;
01429 macroDateForEdit = macroDate;
01430 var seqID = 0;
01431
01432 var macroSequenceEditEl = document.getElementById("macroSequenceEdit");
01433 arrayOfCommandsForEdit = macroSequence.split(",");
01434 var output = "";
01435
01436 for (var i = 0; i < arrayOfCommandsForEdit.length; i++)
01437 {
01438 var Command = arrayOfCommandsForEdit[i].split(":")
01439 var commandType = Command[1];
01440 var markColor = "1";
01441 var disable = "";
01442 var markColorData = "1";
01443 var disableData = "";
01444 var readResult = "...";
01445 if(commandType=='w'){
01446 if(isNaN('0x'+Command[2]))
01447 {
01448 markColor = "2";
01449 disable = "disabled";
01450 }
01451 if(isNaN('0x'+Command[3]))
01452 {
01453 markColorData = "2";
01454 disableData = "disabled";
01455 }
01456 var writeEdit = "<lable>Write <textarea " + disableData +
01457 " class=\"JStextarea\" onchange=\"editCommands(this," +
01458 seqID + ",3)\">" + Command[3]
01459 + "</textarea><div class='variableMark" + markColorData +
01460 "' title='Set field to variable' onclick='setFieldToVariable(this," + seqID
01461 + ",3)'>V</div> into address <textarea " + disable +
01462 " class=\"JStextarea\" onchange=\"editCommands(this," + seqID + ",2)\">" + Command[2]
01463 + "</textarea><div class='variableMark" + markColor + "' title='Set field to variable' onclick='setFieldToVariable(this," + seqID
01464 + ",2)'>V</div><br/></lable>";
01465 seqID++;
01466 output += writeEdit;
01467 }else if(commandType=='r'){
01468 if(isNaN('0x'+Command[2]))
01469 {
01470 markColor = "2";
01471 disable = "disabled";
01472 }
01473 if(Command[3] !== "")
01474 {
01475 markColorData = "2";
01476 readResult = Command[3];
01477 }
01478 var readEdit = "<lable>Read <textarea disabled class=\"JStextarea\" onchange=\"editCommands(this," + seqID + ",3)\">" + readResult
01479 + "</textarea><div class='variableMark" + markColorData + "' title='Set field to variable' onclick='setFieldToVariable(this," + seqID
01480 + ",3,1)'>V</div> from address <textarea " + disable + " class=\"JStextarea\" onchange=\"editCommands(this," + seqID + ",2)\">" + Command[2]
01481 + "</textarea><div class='variableMark" + markColor + "' title='Set field to variable' onclick='setFieldToVariable(this," + seqID
01482 + ",2)'>V</div><br/></lable>";
01483 seqID++;
01484 output += readEdit;
01485 }else if(commandType=='d'){
01486 if(isNaN(Command[2]))
01487 {
01488 markColor = "2";
01489 disable = "disabled";
01490 }
01491 var delayEdit = "<lable>Delay <textarea " + disable + " class=\"JStextarea\" onchange=\"editCommands(this," + seqID + ",2)\">" + Command[2]
01492 + "</textarea><div class='variableMark" + markColor + "' title='Set field to variable' onclick='setFieldToVariable(this," + seqID
01493 + ",2)'>V</div> milliseconds<br/></lable>";
01494 seqID++;
01495 output += delayEdit;
01496 }else
01497 console.log("ERROR! Command type "+commandType+" not found");
01498 }
01499 macroSequenceEditEl.innerHTML = output;
01500 if(macroLSBF == "true")
01501 document.getElementById("isMacroEditLSBF").checked = true;
01502 else
01503 document.getElementById("isMacroEditLSBF").checked = false;
01504
01505
01506 var macroNameEl = document.getElementById("macroNameEdit");
01507 macroNameEl.value = macroName;
01508 var macroNotesEl = document.getElementById("macroNotesEdit");
01509 var date = new Date();
01510 var minutes = "";
01511 if(date.getMinutes() < 10)
01512 minutes = "0"+date.getMinutes().toString();
01513 else minutes = date.getMinutes();
01514 var time = date.getHours() + ":" + minutes + " " + date.toLocaleDateString();
01515 macroNotesForEdit = "[Modified " + time + "] " + macroNotes;
01516 macroNotesEl.value = macroNotesForEdit;
01517 document.getElementById("editFormat").selectedIndex = 0;
01518 }
01519 break;
01520 case "Start":
01521 var sequenceContentEl = document.getElementById("sequenceContent");
01522 var temp = sequenceContentEl.innerHTML;
01523 sequenceContentEl.innerHTML = "";
01524 var arrayOfCommands = macroSequence.split(",");
01525 for (var i = 0; i < arrayOfCommands.length; i++)
01526 {
01527 var Command = arrayOfCommands[i].split(":");
01528 addCommand(Command[1],Command[2],Command[3]);
01529 }
01530 sequenceContentEl.innerHTML += temp;
01531 getOrder();
01532 toggleDisplay(1);
01533 break;
01534 case "End":
01535 var arrayOfCommands = macroSequence.split(",");
01536 for (var i = 0; i < arrayOfCommands.length; i++)
01537 {
01538 var Command = arrayOfCommands[i].split(":");
01539 addCommand(Command[1],Command[2],Command[3]);
01540 }
01541 toggleDisplay(1);
01542 break;
01543 case "Export":
01544 DesktopContent.XMLHttpRequest("Request?RequestType=exportMacro" +
01545 "&MacroName=" + macroName,
01546
01547 "MacroSequence=" + macroSequence +
01548 "&MacroNotes=" + encodeURIComponent(macroNotes),
01549 exportMacroHandler);
01550 break;
01551 case "FEExport":
01552 Debug.log("FE Macro Export...");
01553 exportFEMacro(macroName,macroSequence,macroNotes);
01554 break;
01555 default:
01556 Debug.log("Impossible!? macroAction=" + macroAction);
01557 }
01558 }
01559
01560
01561 function exportFEMacro(macroName,macroSequence,macroNotes)
01562 {
01563 Debug.log("exportFEMacro()");
01564
01565 var targetFEPluginName = "";
01566 var targetCnt = 0;
01567 try
01568 {
01569 for (var i = 0; i < selected.length; i++)
01570 if(selected[i] !== 0)
01571 {
01572 if(targetCnt == 0)
01573 {
01574 targetFEPluginName = FEELEMENTS[i].getAttribute("value").split(":")[0];
01575 }
01576
01577 ++targetCnt;
01578 }
01579 }
01580 catch(e)
01581 {
01582 Debug.log("Error occured during FE Macro export: " + e, Debug.HIGH_PRIORITY);
01583 return;
01584 }
01585 if(targetCnt != 1)
01586 {
01587 Debug.log("Error! To export the Macro to a FE plugin, please select " +
01588 "a single FE target from FE list. There are currently " +
01589 targetCnt + " selected.", Debug.HIGH_PRIORITY);
01590 return;
01591 }
01592
01593
01594 Debug.log("Exporting to plugin " + targetFEPluginName);
01595 console.log("macroName",macroName);
01596 console.log("macroSequence",macroSequence);
01597 console.log("macroNotes",macroNotes);
01598
01599
01600 DesktopContent.XMLHttpRequest("Request?RequestType=exportFEMacro" +
01601 "&MacroName=" + macroName +
01602 "&PluginName=" + targetFEPluginName,
01603
01604 "MacroSequence=" + macroSequence +
01605 "&MacroNotes=" + encodeURIComponent(macroNotes),
01606 function(req)
01607 {
01608 var err = DesktopContent.getXMLValue(req,"Error");
01609 if(err)
01610 {
01611 Debug.log("To view your front-end plugin " +
01612 "source code files...\n" +
01613 "(Click " +
01614 "<a onclick='DesktopContent.openNewBrowserTab(" +
01615 "\"Code Editor\",\"\"," +
01616 "\"/WebPath/html/CodeEditor.html?startFilePrimary=" +
01617 headerFile + "&startFileSecondary=" +
01618 sourceFile + "&startViewMode=1\",0 /*unique*/);' " +
01619 "title='Click to open a new browser tab with both source files in the Code Editor.'>" +
01620 "here</a> to open them in the Code Editor)" +
01621 "\n\n" +
01622
01623 "<a onclick='DesktopContent.openNewWindow(" +
01624 "\"Code Editor\",\".h\"," +
01625 "\"/WebPath/html/CodeEditor.html?startFilePrimary=" +
01626 headerFile + "\",0 /*unique*/);' " +
01627 "title='Click to open this header file in the Code Editor.'>" +
01628 headerFile + "</a>\n\nand...\n\n" +
01629
01630
01631 "<a onclick='DesktopContent.openNewWindow(" +
01632 "\"Code Editor\",\".cc\"," +
01633 "\"/WebPath/html/CodeEditor.html?startFilePrimary=" +
01634 sourceFile + "\",0 /*unique*/);' " +
01635 "title='Click to open this source file in the Code Editor.'>" +
01636 sourceFile + "</a>\n\n" +
01637
01638 "Click the links above to open the source code files in the Code Editor.\n\n"
01639 +
01640
01641 "If you would like to run existing FE Macros, try doing so here...\n" +
01642 "(You MUST compile the plugin, and reconfigure otsdaq for FE Macro changes to take effect!): " +
01643 "<a onclick='DesktopContent.openNewWindow(" +
01644 "\"FE Macro Test\",\".h\"," +
01645 "\"/WebPath/html/FEMacroTest.html?urn=" +
01646 DesktopContent._localUrnLid +
01647 "\",0 /*unique*/);' " +
01648 "title='Click to open the FE Macro Test web app.'>" +
01649 "FE Macro Test" + "</a>\n\n"
01650 ,
01651 Debug.HIGH_PRIORITY);
01652
01653 Debug.log("Error! Something went wrong with your FE Macro export: " +
01654 err,Debug.HIGH_PRIORITY);
01655
01656 return;
01657 }
01658
01659 var headerFile = DesktopContent.getXMLValue(req,"headerFile");
01660 var sourceFile = DesktopContent.getXMLValue(req,"sourceFile");
01661 if(headerFile && sourceFile)
01662 {
01663 Debug.log("Your FE Macro was succesfully exported to the front-end plugin " +
01664 "source code files...\n" +
01665 "(Click " +
01666 "<a onclick='DesktopContent.openNewBrowserTab(" +
01667 "\"Code Editor\",\"\"," +
01668 "\"/WebPath/html/CodeEditor.html?startFilePrimary=" +
01669 headerFile + "&startFileSecondary=" +
01670 sourceFile + "&startViewMode=1\",0 /*unique*/);' " +
01671 "title='Click to open a new browser tab with both source files in the Code Editor.'>" +
01672 "here</a> to open them in the Code Editor)" +
01673 "\n\n" +
01674
01675 "<a onclick='DesktopContent.openNewWindow(" +
01676 "\"Code Editor\",\".h\"," +
01677 "\"/WebPath/html/CodeEditor.html?startFilePrimary=" +
01678 headerFile + "\",0 /*unique*/);' " +
01679 "title='Click to open this header file in the Code Editor.'>" +
01680 headerFile + "</a>\n\nand...\n\n" +
01681
01682
01683 "<a onclick='DesktopContent.openNewWindow(" +
01684 "\"Code Editor\",\".cc\"," +
01685 "\"/WebPath/html/CodeEditor.html?startFilePrimary=" +
01686 sourceFile + "\",0 /*unique*/);' " +
01687 "title='Click to open this source file in the Code Editor.'>" +
01688 sourceFile + "</a>\n\n" +
01689
01690 "Click the links above to open the source code files in the Code Editor.\n\n"
01691 +
01692
01693 "If you would like to run your new FE Macro, try doing so here...\n" +
01694 "(You MUST compile the plugin, and reconfigure otsdaq for your FE Macro changes to take effect!): " +
01695 "<a onclick='DesktopContent.openNewWindow(" +
01696 "\"FE Macro Test\",\".h\"," +
01697 "\"/WebPath/html/FEMacroTest.html?urn=" +
01698 DesktopContent._localUrnLid +
01699 "\",0 /*unique*/);' " +
01700 "title='Click to open the FE Macro Test web app.'>" +
01701 "FE Macro Test" + "</a>\n\n"
01702 ,
01703 Debug.INFO_PRIORITY);
01704 }
01705 else
01706 Debug.log("Error! Something went wrong with your FE Macro export." +
01707 " Please check the logs to understand the error.",
01708 Debug.HIGH_PRIORITY);
01709
01710 },
01711 0 , 0 , true );
01712
01713 }
01714
01715
01716 function exportMacroHandler(req)
01717 {
01718 Debug.log("exportMacroHandler() was called. ");
01719
01720 var exportFile = DesktopContent.getXMLValue(req,"ExportFile");
01721 if(exportFile)
01722 Debug.log("Your Macro was succesfully exported!" +
01723 " It was saved to...\n\n" + exportFile
01724 ,Debug.INFO_PRIORITY);
01725 }
01726
01727
01728 function editCommands(textarea, seqID, index)
01729 {
01730 var x = arrayOfCommandsForEdit[seqID].split(":");
01731 if(isNaN("0x" + textarea.value) && textarea.value !== "")
01732 {
01733 document.getElementById("popupIllegalEdit").style.display = "block";
01734 textarea.value = x[index];
01735 }
01736 else
01737 {
01738 x[index] = textarea.value;
01739 arrayOfCommandsForEdit[seqID] = x.join(":");
01740 }
01741 }
01742
01743
01744 function deleteMacroHandler(req)
01745 {
01746 Debug.log("deleteMacroHandler() was called. ");
01747
01748 loadExistingMacros();
01749
01750 var deletedMacroName = DesktopContent.getXMLValue(req,"deletedMacroName");
01751 var reminderEl = document.getElementById('reminder');
01752 reminderEl.innerHTML = "Successfully deleted " + decodeURI(deletedMacroName);
01753 }
01754
01755
01756 function saveChangedMacro()
01757 {
01758 newMacroNameForEdit = document.getElementById("macroNameEdit").value;
01759
01760 var Regex = /^[a-zA-Z0-9\_]+$/g;
01761 var Regex2 = /^[a-z0-9]+$/i;
01762 if (!Regex.test(newMacroNameForEdit))
01763 document.getElementById("popupIllegalNaming").style.display = "block";
01764 else
01765 {
01766 if(document.getElementById("editFormat").value == "dec")
01767 {
01768 var nodeListOfTextareas=document.getElementsByTagName('textarea');
01769 for(var i=1;i<nodeListOfTextareas.length-1;i++)
01770 {
01771 if(!isNaN('0x'+nodeListOfTextareas[i].value))
01772 nodeListOfTextareas[i].innerHTML = convertToHex("dec",nodeListOfTextareas[i].value);
01773 }
01774 }
01775 for(var i = 0; i < arrayOfCommandsForEdit.length; i++)
01776 {
01777 var eachCommand = arrayOfCommandsForEdit[i].split(":");
01778 for (var j = 1; j < eachCommand.length; j++)
01779 {
01780 if(!Regex2.test(eachCommand[j]) && eachCommand[j] !== '')
01781 {
01782 document.getElementById("popupIllegalInput").style.display = "block";
01783 document.getElementById("illegalInputValue").innerHTML = eachCommand[j];
01784 return;
01785 }
01786 else if (eachCommand[j] === '')
01787 {
01788 if(eachCommand[j-2] == 'r') continue;
01789 else
01790 {
01791 document.getElementById("popupEmptyInput").style.display = "block";
01792 return;
01793 }
01794 }
01795 }
01796 }
01797
01798 macroNotesForEdit = document.getElementById('macroNotesEdit').value;
01799 if(macroNotesForEdit.indexOf("@") >= 0 || macroNotesForEdit.indexOf("#") >= 0 || macroNotesForEdit.indexOf("..") >= 0)
01800 {
01801 document.getElementById("popupIllegalNotes").style.display = "block";
01802 return;
01803 }
01804 var isMacroLSBF = document.getElementById('isMacroEditLSBF').checked;
01805 var isMacroPublic = !isOnPrivateMacros;
01806 DesktopContent.XMLHttpRequest("Request?RequestType=editMacro" +
01807 "&isPublic=" + isMacroPublic +
01808 "&isLSBF=" + isMacroLSBF,
01809
01810 "Sequence=" + arrayOfCommandsForEdit +
01811 "&oldMacroName=" + oldMacroNameForEdit +
01812 "&newMacroName=" + newMacroNameForEdit +
01813 "&Time=" + macroDateForEdit +
01814 "&Notes=" + encodeURIComponent(macroNotesForEdit),
01815 saveChangedMacroHandler ,
01816 newMacroNameForEdit );
01817 hidePopupEditMacro();
01818 }
01819 }
01820
01821
01822 function saveChangedMacroHandler(req,macroName)
01823 {
01824 Debug.log("saveChangedMacroHandler() was called.");
01825
01826 Debug.log("Your Macro '" + macroName + "' was succesfully saved!",Debug.INFO_PRIORITY);
01827 loadExistingMacros();
01828 }
01829
01830
01831 function reloadMacroSequence()
01832 {
01833 var sequenceContentEl = document.getElementById("sequenceContent");
01834 sequenceContentEl.innerHTML = "";
01835 macroString = [];
01836 SEQFORMAT = document.getElementById("sequenceFormat").value;
01837 var macroStringForReload = tempString.slice();
01838 for (var i = 0; i < macroStringForReload.length; i++)
01839 {
01840 var Command = macroStringForReload[i].split(":");
01841 addCommand(Command[1],Command[2],Command[3]);
01842 }
01843 }
01844
01845
01846 function reloadEditSequence()
01847 {
01848
01849 var nodeListOfTextareas=document.getElementsByTagName('textarea');
01850 if(document.getElementById("editFormat").value == "dec")
01851 {
01852 for(var i=1;i<nodeListOfTextareas.length-1;i++)
01853 {
01854 if(!isNaN('0x'+nodeListOfTextareas[i].value))
01855 nodeListOfTextareas[i].innerHTML = convertFromHex("dec",nodeListOfTextareas[i].value);
01856 }
01857 }
01858
01859
01860
01861
01862
01863
01864
01865
01866 else
01867 {
01868 for(var i=1;i<nodeListOfTextareas.length-1;i++)
01869 {
01870 if(!isNaN('0x'+nodeListOfTextareas[i].value))
01871 nodeListOfTextareas[i].innerHTML = convertToHex("dec",nodeListOfTextareas[i].value);
01872 }
01873 }
01874 }
01875
01876
01877 function setFieldToVariable(div, seqID, index,isReadResultField)
01878 {
01879 Debug.log("setFieldToVariable");
01880
01881 var popupNameVariableEl = document.getElementById("popupNameVariable");
01882 popupNameVariableEl.style.display = "block";
01883
01884 var nameVariablePromptEl = document.getElementById("nameVariablePrompt");
01885 var textareaEl = div.previousSibling;
01886 var currentVal = textareaEl.value;
01887
01888 document.getElementById('popupNameVariableCancelButton').onclick = function()
01889 {
01890 popupNameVariableEl.style.display = "none";
01891 document.getElementById("nameVariable").value = "";
01892 return;
01893 };
01894
01895 if(currentVal != "..." && isReadResultField)
01896 {
01897 document.getElementById('popupNameVariableSaveButton').style.display = "none";
01898 document.getElementById('popupNameVariableYesButton').style.display = "inline-block";
01899 document.getElementById('nameVariable').style.display = "none";
01900 nameVariablePromptEl.innerHTML = "Would you like to remove this field as a variable?";
01901 document.getElementById('popupNameVariableYesButton').onclick = function() {
01902 div.style.backgroundColor = "#002a52";
01903 textareaEl.value = "...";
01904 var x = arrayOfCommandsForEdit[seqID].split(":");
01905 x[index] = "";
01906 arrayOfCommandsForEdit[seqID] = x.join(":");
01907 document.getElementById('popupNameVariableSaveButton').style.display = "inline-block";
01908 document.getElementById('popupNameVariableYesButton').style.display = "none";
01909 document.getElementById('nameVariable').style.display = "inline-block";
01910 popupNameVariableEl.style.display = "none";
01911 };
01912 }
01913 else if(!isNaN("0x"+currentVal) || currentVal == "" ||
01914 isReadResultField)
01915 {
01916 nameVariablePromptEl.innerHTML = "Setting field to variable! How would you like to name it?";
01917 document.getElementById('popupNameVariableSaveButton').onclick = function() {
01918 var variableName = document.getElementById("nameVariable").value.toString();
01919 if(variableName === "")
01920 {
01921 nameVariablePromptEl.innerHTML =
01922 "<span class='red'>Name of the variable cannot be empty.</span>";
01923 return;
01924 }
01925 else if(!isNaN("0x"+variableName))
01926 {
01927 nameVariablePromptEl.innerHTML =
01928 "<span class='red'>Name of the variable cannot be a valid hex number.</span>";
01929 return;
01930 }
01931 div.style.backgroundColor = "#ff0101";
01932 textareaEl.value = variableName;
01933 textareaEl.disabled = true;
01934 var x = arrayOfCommandsForEdit[seqID].split(":");
01935 x[index] = variableName;
01936 arrayOfCommandsForEdit[seqID] = x.join(":");
01937 document.getElementById("nameVariable").value = "";
01938 popupNameVariableEl.style.display = "none";
01939 };
01940 }
01941 else
01942 {
01943 nameVariablePromptEl.innerHTML = "Would you like a set value instead of a variable?";
01944 document.getElementById('popupNameVariableSaveButton').onclick = function() {
01945 var variableName = document.getElementById("nameVariable").value.toString();
01946 if(variableName === "")
01947 {
01948 nameVariablePromptEl.innerHTML =
01949 "<span class='red'>Name of the variable cannot be empty.</span>";
01950 return;
01951 }
01952 else if(isNaN("0x"+variableName))
01953 {
01954 nameVariablePromptEl.innerHTML =
01955 "<span class='red'>The value has to be a valid hex number.</span>";
01956 return;
01957 }
01958 div.style.backgroundColor = "#002a52";
01959 textareaEl.value = variableName;
01960 textareaEl.disabled = false;
01961 var x = arrayOfCommandsForEdit[seqID].split(":");
01962 x[index] = variableName;
01963 arrayOfCommandsForEdit[seqID] = x.join(":");
01964 document.getElementById("nameVariable").value = "";
01965 popupNameVariableEl.style.display = "none";
01966 };
01967 }
01968 }
01969
01970
01971 function dealWithVariables(stringOfCommands,macroName,LSBF)
01972 {
01973 if (LSBF == "true") runningMacroLSBF = 1;
01974 if (LSBF == "false") runningMacroLSBF = 2;
01975
01976 var reminderEl = document.getElementById('reminder');
01977 var waitForUserInputFlag = 0;
01978 var copyOfStringOfCommands = stringOfCommands.slice();
01979 var i = 0;
01980 var commandToChange = 0;
01981 var newCommand = [];
01982 var dictionary = {};
01983 var globalIndex = 0;
01984 var isAddressField = true;
01985 if(isMacroRunning)
01986 reminderEl.innerHTML = "Please wait till the current macro ends";
01987 else if(isArrayAllZero(selected))
01988 Debug.log("Please select at least one interface from the list",Debug.HIGH_PRIORITY);
01989 else
01990 {
01991 isMacroRunning = true;
01992 var promptEl = document.getElementById('popupAskForVariableValue');
01993 timeIntervalID = setInterval(function()
01994 {
01995 if(i < stringOfCommands.length && waitForUserInputFlag === 0)
01996 {
01997 var Command = stringOfCommands[i].split(":");
01998 function setValue(index,isReadAddress)
01999 {
02000 globalIndex = index;
02001 if(isReadAddress && Command[index] !== "")
02002 {
02003 readoutDictionary.push(Command[index].toString());
02004 }
02005 else if (dictionary[Command[index].toString()] !== undefined)
02006 {
02007 newCommand = copyOfStringOfCommands[i].split(":");
02008 newCommand[index] = dictionary[Command[index].toString()];
02009 copyOfStringOfCommands[i] = newCommand.join(":");
02010 }
02011 else if (isNaN("0x"+Command[index]) && Command[index] !== "")
02012 {
02013 if(readoutDictionary.indexOf(Command[index].toString()) !== -1)
02014 {
02015 return;
02016 }
02017 else
02018 {
02019 waitForUserInputFlag = 1;
02020 newCommand = copyOfStringOfCommands[i].split(":");
02021 var variableNameAtRunTime = Command[index];
02022 commandToChange = i;
02023 if(waitForUserInputFlag === 0)
02024 return;
02025 else
02026 {
02027 promptEl.style.display = "block";
02028 document.getElementById('assignValuePrompt').innerHTML
02029 = "What value would you assign to variable <span id=\"variableNameAtRunTime\" class=\"red\"></span>?</h4>"
02030 document.getElementById('variableNameAtRunTime').innerHTML = variableNameAtRunTime;
02031 }
02032 }
02033 }
02034 }
02035 if (Command[1] == "w")
02036 {
02037 if(isAddressField)
02038 {
02039 setValue(2);
02040 i--;
02041 isAddressField = false;
02042 }
02043 else
02044 {
02045 setValue(3);
02046 isAddressField = true;
02047 }
02048 }
02049 else if (Command[1] == "r")
02050 {
02051 if(isAddressField)
02052 {
02053 setValue(2);
02054 i--;
02055 isAddressField = false;
02056 }
02057 else
02058 {
02059 setValue(3,1);
02060 isAddressField = true;
02061 }
02062 }
02063 else setValue(2);
02064 i++;
02065 }
02066 else if(i == stringOfCommands.length && waitForUserInputFlag === 0)
02067 {
02068 clearInterval(timeIntervalID);
02069 console.log("Final command to send to run: " + copyOfStringOfCommands);
02070 runMacro(copyOfStringOfCommands, macroName);
02071 }
02072 },200);
02073 }
02074
02075 document.getElementById('popupAskForVariableValueContinue').onclick = function()
02076 {
02077 var variableValue = document.getElementById("valueAtRunTime").value.toString();
02078 if(isNaN("0x"+variableValue))
02079 {
02080 document.getElementById("assignValuePrompt").innerHTML =
02081 "<span class='red'>The value has to be a hex number.</span>";
02082 return;
02083 }
02084 else
02085 {
02086 dictionary[newCommand[globalIndex].toString()] = variableValue;
02087 newCommand[globalIndex] = variableValue;
02088 promptEl.style.display = "none";
02089 copyOfStringOfCommands[commandToChange] = newCommand.join(":");
02090 document.getElementById("valueAtRunTime").value = "";
02091 waitForUserInputFlag = 0;
02092 return;
02093 }
02094 };
02095 }
02096
02097
02098
02099
02100
02101
02102
02103
02104
02105
02106
02107
02108
02109
02110