edit_reference.html 42 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960
  1. <!DOCTYPE html>
  2. <html lang="en" xml:lang="en">
  3. <head>
  4. <title>Reference Image</title>
  5. <meta charset="utf-8"/>
  6. <style>
  7. h1 {font-size: 2em;}
  8. h2 {font-size: 1.5em; margin-block-start: 0.0em; margin-block-end: 0.2em;}
  9. h3 {font-size: 1.2em;}
  10. p {font-size: 1em;}
  11. input[type=number] {
  12. width: 60px;
  13. margin-right: 10px;
  14. padding: 3px 5px;
  15. display: inline-block;
  16. border: 1px solid #ccc;
  17. font-size: 16px;
  18. vertical-align: middle;
  19. }
  20. input:out-of-range {
  21. background-color: rgba(255, 0, 0, 0.25);
  22. border: 1px solid red;
  23. }
  24. input:invalid {
  25. background-color: rgba(255, 0, 0, 0.25);
  26. border: 1px solid red;
  27. }
  28. .expert {
  29. background-color: #ffefef;
  30. font-size: 16px;
  31. }
  32. .button {
  33. padding: 5px 10px;
  34. width: 205px;
  35. font-size: 16px;
  36. }
  37. th, td {
  38. padding: 5px 5px 5px 5px;
  39. }
  40. table {
  41. width: 660px;
  42. padding: 5px;
  43. }
  44. .tooltip {
  45. position: relative;
  46. display: inline-block;
  47. }
  48. .tooltip .tooltiptext {
  49. visibility: hidden;
  50. width: 600px;
  51. background-color: #fcfcfc;
  52. padding: 5px;
  53. padding-bottom: 0;
  54. border: solid black 2px;
  55. /* Position the tooltip */
  56. position: absolute;
  57. z-index: 1;
  58. top: 100%;
  59. left: 100%;
  60. margin-left: -600px;
  61. }
  62. .tooltip:hover .tooltiptext {
  63. visibility: visible;
  64. }
  65. .tooltip-content {
  66. width: calc(100% - 2px);
  67. height: calc(100% - 2px);
  68. padding: 1px;
  69. }
  70. </style>
  71. <link href="firework.css?v=$COMMIT_HASH" rel="stylesheet">
  72. <script type="text/javascript" src="jquery-3.6.0.min.js?v=$COMMIT_HASH"></script>
  73. <script type="text/javascript" src="firework.js?v=$COMMIT_HASH"></script>
  74. </head>
  75. <body style="font-family: arial; padding: 0px 10px;">
  76. <h2>Reference Image</h2>
  77. <details id="desc_details" style="font-size:16px">
  78. <summary><b>CLICK HERE</b> for usage description. More infos in documentation:
  79. <a href=https://jomjol.github.io/AI-on-the-edge-device-docs/Reference-Image/ target=_blank>Reference Image</a>
  80. </summary>
  81. <p>
  82. The reference image is the base image on which the alignment markers, digit ROIs and anlog ROIs will be defined.
  83. </p>
  84. <p>
  85. Firstly the actual saved reference image is shown. If you start with the setup from scratch a default image is shown as placeholder.
  86. Use the button <b>"Create New Reference"</b> to start creation of your own reference image. After selecting the button a new image will be taken
  87. all configured parameter will be applied to the shown image. With the button <b>"Update Image"</b> you can update the image again (still all parameter
  88. get applied to the new image).
  89. </p>
  90. <p>
  91. To have reliable evaluation processing a properly horizontal aligned evaluation area is mandatory. Using the parameters "Rotation angle" and
  92. "Rotation angle (Fine-tune)" the image can be rotated in both directions. The resulting rotation anlge is used to prerotate the image before
  93. the alignment algorithm is processed to compensate only small misalignments. Further information can be found in documenation:
  94. <a href=https://jomjol.github.io/AI-on-the-edge-device-docs/Reference-Image/ target=_blank>Reference Image</a>
  95. </p>
  96. <p>
  97. After setting up your reference image don't forget to save with the <b>"Save New Reference"</b> button!<br>
  98. <b>NOTE:</b> There is no need to perform a reboot after every saving or step. It's sufficient to reboot after all configuration steps
  99. (reference image, alignment, ROI configuration) are completed to activate new configuration.
  100. </p>
  101. </details>
  102. <hr />
  103. <table>
  104. <colgroup>
  105. <col span="1" style="width: 33.3%;">
  106. <col span="1" style="width: 33.3%;">
  107. <col span="1" style="width: 33.3%;">
  108. </colgroup>
  109. <tr>
  110. <td class="indent1">
  111. <input style="margin-top:12px;margin-bottom:12px" type="checkbox" id="ExpertModus_enabled" value="1" onclick='UpdateExpertModus()' unchecked>
  112. <label for="ExpertModus_enabled">Expert View</label>
  113. </td>
  114. <td>
  115. <button style="display:none;" class="button" id="Edit_Config_Direct" onclick="editConfigDirect()">Edit "Config.ini" File</button>
  116. </td>
  117. <td>
  118. </td>
  119. </tr>
  120. <tr>
  121. <td><input class="button" type="button" value="Show Actual Reference" onclick="showReference(param)"></td>
  122. <td><input class="button" type="button" id="startreference" value="Create New Reference" onclick="loadRawImage(false)"></td>
  123. <td><input class="button" type="submit" id="take" onclick="doTake()" value="Update Image">
  124. </tr>
  125. </table>
  126. <table>
  127. <colgroup>
  128. <col span="1" style="width: 32%;">
  129. <col span="1" style="width: 28%;">
  130. <col span="1" style="width: 18%;">
  131. <col span="1" style="width: 22%;">
  132. </colgroup>
  133. <tr class="expert">
  134. <td>
  135. <label for="zoom" id="labelzoom">Enable zoom:</label></td>
  136. <td>
  137. <input type="checkbox" id="zoom" name="zoom" value="0"></td>
  138. <td>$TOOLTIP_TakeImage_Zoom</td>
  139. <td>
  140. <label for="zoomoffsetx">Zoom offset X:</label></td>
  141. <td>
  142. <input required type="number" id="zoomoffsetx" name="zoomoffsetx" value="0" min="0" max="1280" step="1"
  143. oninput="(!validity.rangeOverflow||(value=1280)) && (!validity.rangeUnderflow||(value=0)) &&
  144. (!validity.stepMismatch||(value=parseInt(this.value)));">
  145. </td>
  146. <td>$TOOLTIP_TakeImage_ZoomOffsetX</td>
  147. </tr>
  148. <tr class="expert">
  149. <td>
  150. <label for="zoommode" id="labelzoommode">Zoom mode:</label></td>
  151. <td>
  152. <input required type="number" id="zoommode" name="zoommode" value="0" min="0" max="1" step="1"
  153. oninput="(!validity.rangeOverflow||(value=1)) && (!validity.rangeUnderflow||(value=0)) &&
  154. (!validity.stepMismatch||(value=parseInt(this.value)));">
  155. </td>
  156. <td>$TOOLTIP_TakeImage_ZoomMode</td>
  157. <td>
  158. <label for="zoomoffsety">Zoom offset Y:</label></td>
  159. <td>
  160. <input required type="number" id="zoomoffsety" name="zoomoffsety" value="0" min="0" max="960" step="1"
  161. oninput="(!validity.rangeOverflow||(value=960)) && (!validity.rangeUnderflow||(value=0)) &&
  162. (!validity.stepMismatch||(value=parseInt(this.value)));">
  163. </td>
  164. <td>$TOOLTIP_TakeImage_ZoomOffsetY</td>
  165. </tr>
  166. <tr>
  167. <td>
  168. <label for="mirror" id="labelmirror">Mirror image:</label></td>
  169. <td>
  170. <input type="checkbox" id="mirror" name="mirror" value="1" onchange="drawRotated()"></td>
  171. <td>$TOOLTIP_Alignment_InitialMirror</td>
  172. <td>
  173. <class id="TakeImage_LEDIntensity_text" style="color:black;">LED intensity:</class>
  174. </td>
  175. <td>
  176. <input required style="clear: both" type="number" id="TakeImage_LEDIntensity_value1" size="13" value="0" min="0" max="100"
  177. oninput="(!validity.rangeOverflow||(value=100)) && (!validity.rangeUnderflow||(value=0)) &&
  178. (!validity.stepMismatch||(value=parseInt(this.value)));">
  179. </td>
  180. <td>$TOOLTIP_TakeImage_LEDIntensity</td>
  181. </tr>
  182. <tr>
  183. <td>
  184. <label for="flip" id="labelflip">Flip image size:</label></td>
  185. <td>
  186. <input type="checkbox" id="flip" name="flip" value="1" onchange="drawRotated()"></td>
  187. <td>$TOOLTIP_Alignment_FlipImageSize</td>
  188. <td>
  189. <class id="TakeImage_Brightness_text" style="color:black;">Brightness:</class>
  190. </td>
  191. <td>
  192. <input style="clear: both; width: 80%;vertical-align:middle" type="range" id="TakeImage_Brightness_value1" size="13" value=0 min="-2" max="2" oninput="this.nextElementSibling.value = this.value">
  193. <output id="TakeImage_Brightness_value1_output" style="vertical-align:middle; min-width:15px; padding-right:5px; text-align:right; float:left">0</output>
  194. </td>
  195. <td>$TOOLTIP_TakeImage_Brightness</td>
  196. </tr>
  197. <tr>
  198. <td><label for="prerotateangle">Rotation angle:</label></td>
  199. <td>
  200. <input required type="number" id="prerotateangle" name="prerotateangle" value="0" min="-360" max="360" onchange="drawRotated()"
  201. oninput="(!validity.rangeOverflow||(value=360)) && (!validity.rangeUnderflow||(value=-360)) &&
  202. (!validity.stepMismatch||(value=parseInt(this.value)));">degree
  203. </td>
  204. <td>$TOOLTIP_Alignment_InitialRotate</td>
  205. <td>
  206. <class id="TakeImage_Contrast_text" style="color:black;">Contrast:</class>
  207. </td>
  208. <td>
  209. <input style="clear: both; width: 80%;vertical-align:middle" type="range" id="TakeImage_Contrast_value1" size="13" value=0 min="-2" max="2" oninput="this.nextElementSibling.value = this.value">
  210. <output id="TakeImage_Contrast_value1_output" style="vertical-align:middle; min-width:15px; padding-right:5px; text-align:right; float:left">0</output>
  211. </td>
  212. <td>$TOOLTIP_TakeImage_Contrast</td>
  213. </tr>
  214. <tr>
  215. <td><label for="finerotate">(Fine-tune):</label></td>
  216. <td>
  217. <input required type="number" id="finerotate" name="finerotate" value=0.0 min="-1" max="1" step="0.1" onchange="drawRotated()"
  218. oninput="(!validity.rangeOverflow||(value=1)) && (!validity.rangeUnderflow||(value=-1)) &&
  219. (!validity.stepMismatch||(value=parseInt(this.value)));">degree
  220. </td>
  221. <td></td>
  222. <td>
  223. <class id="TakeImage_Saturation_text" style="color:black;">Saturation:</class>
  224. </td>
  225. <td>
  226. <input style="clear: both; width: 80%;vertical-align:middle" type="range" id="TakeImage_Saturation_value1" size="13" value=0 min="-2" max="2" oninput="this.nextElementSibling.value = this.value">
  227. <output id="TakeImage_Saturation_value1_output" style="vertical-align:middle; min-width:15px; padding-right:5px; text-align:right; float:left">0</output>
  228. </td>
  229. <td>$TOOLTIP_TakeImage_Saturation</td>
  230. </tr>
  231. <tr class="expert">
  232. <td>
  233. <label for="grayscale" id="labelgrayscale">Grayscale:</label></td>
  234. <td>
  235. <input type="checkbox" id="grayscale" name="grayscale" value="0"></td>
  236. <td>$TOOLTIP_TakeImage_Grayscale</td>
  237. <td>
  238. <label for="aec2" id="labelaec2">Auto Exposure Control 2:</label></td>
  239. <td>
  240. <input type="checkbox" id="aec2" name="aec2" value="0"></td>
  241. <td>$TOOLTIP_TakeImage_Aec2</td>
  242. </tr>
  243. <tr class="expert">
  244. <td>
  245. <label for="negative" id="labelnegative">Negative:</label></td>
  246. <td>
  247. <input type="checkbox" id="negative" name="negative" value="0" onchange="drawRotated()"></td>
  248. <td>$TOOLTIP_TakeImage_Negative</td>
  249. <td>
  250. <class id="TakeImage_AutoExposureLevel_text" style="color:black;">Auto Exposure Level:</class>
  251. </td>
  252. <td>
  253. <input style="clear: both; width: 80%;vertical-align:middle" type="range" id="TakeImage_AutoExposureLevel_value1" size="13" value=0 min="-2" max="2" oninput="this.nextElementSibling.value = this.value">
  254. <output id="TakeImage_AutoExposureLevel_value1_output" style="vertical-align:middle; min-width:15px; padding-right:5px; text-align:right; float:left">0</output>
  255. </td>
  256. <td>$TOOLTIP_TakeImage_AutoExposureLevel</td>
  257. </tr>
  258. <tr class="expert">
  259. <td>
  260. <label for="FixedExposure" id="labelFixedExposure">FixedExposure:</label></td>
  261. <td>
  262. <input type="checkbox" id="FixedExposure" name="FixedExposure" value="0"></td>
  263. <td>$TOOLTIP_TakeImage_FixedExposure</td>
  264. <td>
  265. <class id="TakeImage_Sharpness_text" style="color:black;">Sharpness:</class>
  266. </td>
  267. <td>
  268. <input style="clear: both; width: 80%;vertical-align:middle" type="range" id="TakeImage_Sharpness_value1" size="13" value=0 min="-4" max="3" oninput="this.nextElementSibling.value = this.value">
  269. <output id="TakeImage_Sharpness_value1_output" style="vertical-align:middle; min-width:15px; padding-right:5px; text-align:right; float:left">0</output>
  270. </td>
  271. <td>$TOOLTIP_TakeImage_Sharpness</td>
  272. </tr>
  273. </table>
  274. <table>
  275. <colgroup>
  276. <col span="1" style="width: 33.3%;">
  277. <col span="1" style="width: 33.3%;">
  278. <col span="1" style="width: 33.3%;">
  279. </colgroup>
  280. <tr>
  281. <td style="vertical-align: bottom;"><b>Reference Image:</b></td>
  282. <td></td>
  283. <td>
  284. <input style="font-weight:bold;" class="button" type="button" id="updatereferenceimage" value="Save New Reference" onclick="SaveReference()">
  285. </td>
  286. </tr>
  287. <tr>
  288. <td colspan="3"><canvas id="canvas"></canvas></td>
  289. </tr>
  290. </table>
  291. <script type="text/javascript" src="common.js?v=$COMMIT_HASH"></script>
  292. <script type="text/javascript" src="readconfigcommon.js?v=$COMMIT_HASH"></script>
  293. <script type="text/javascript" src="readconfigparam.js?v=$COMMIT_HASH"></script>
  294. <script language="JavaScript">
  295. var canvas = document.getElementById('canvas'),
  296. ctx = canvas.getContext('2d'),
  297. imageObj = new Image()
  298. domainname = getDomainname();
  299. isActReference = false;
  300. param;
  301. function doReboot() {
  302. if (confirm("Are you sure you want to reboot? Did you save the config?")) {
  303. var stringota = getDomainname() + "/reboot";
  304. window.location = stringota;
  305. window.location.href = stringota;
  306. window.location.assign(stringota);
  307. window.location.replace(stringota);
  308. }
  309. }
  310. function doTake(){
  311. var xhttp = new XMLHttpRequest();
  312. if (param["TakeImage"]["Brightness"].found && param["TakeImage"]["Brightness"].enabled)
  313. {
  314. _grayscale = document.getElementById("grayscale").checked ? "1" : "0";
  315. _negative = document.getElementById("negative").checked ? "1" : "0";
  316. _aec2 = document.getElementById("aec2").checked ? "1" : "0";
  317. _FixedExposure = document.getElementById("FixedExposure").checked ? "1" : "0";
  318. _zoom = document.getElementById("zoom").checked ? "1" : "0";
  319. _zm = document.getElementById("zoommode").value;
  320. if (_zm == "") _zm = "0";
  321. _x = document.getElementById("zoomoffsetx").value;
  322. if (_x == "") _x = "0";
  323. _y = document.getElementById("zoomoffsety").value;
  324. if (_y == "") _y = "0";
  325. _intensity = document.getElementById("TakeImage_LEDIntensity_value1").value;
  326. if (_intensity == "") _intensity = "50";
  327. _brightness = document.getElementById("TakeImage_Brightness_value1").value;
  328. _contrast = document.getElementById("TakeImage_Contrast_value1").value;
  329. _saturation = document.getElementById("TakeImage_Saturation_value1").value;
  330. _sharpness = document.getElementById("TakeImage_Sharpness_value1").value;
  331. _ae = document.getElementById("TakeImage_AutoExposureLevel_value1").value;
  332. url = getDomainname() + "/editflow?task=test_take&bri=" + _brightness;
  333. url = url + "&con=" + _contrast + "&sat=" + _saturation + "&sh=" + _sharpness + "&int=" + _intensity + "&gs=" + _grayscale + "&ne=" + _negative + "&z=" + _zoom;
  334. if (_zoom != '0')
  335. url = url + "&zm=" + _zm + "&x=" + _x + "&y=" + _y;
  336. url = url + "&ae=" + _ae + "&a2=" + _aec2;
  337. }
  338. else
  339. {
  340. url = domainname + "/editflow?task=test_take";
  341. }
  342. if (domainname.length > 0){
  343. url = url + "&host=" + domainname;
  344. }
  345. xhttp.open("GET", url, false);
  346. xhttp.send();
  347. firework.launch('Taking updated image...', 'success', 5000);
  348. loadRawImage(true);
  349. }
  350. function loadRawImage(new_image) {
  351. if (new_image) {
  352. url = getDomainname() + "/img_tmp/raw.jpg" + "?session=" + Math.floor((Math.random() * 1000000) + 1);
  353. document.getElementById("updatereferenceimage").disabled = false;
  354. }
  355. else {
  356. document.getElementById("updatereferenceimage").disabled = true;
  357. doTake();
  358. }
  359. document.getElementById("grayscale").disabled = false;
  360. document.getElementById("negative").disabled = false;
  361. document.getElementById("aec2").disabled = false;
  362. document.getElementById("FixedExposure").disabled = false;
  363. document.getElementById("zoom").disabled = false;
  364. document.getElementById("zoommode").disabled = false;
  365. document.getElementById("zoomoffsetx").disabled = false;
  366. document.getElementById("zoomoffsety").disabled = false;
  367. document.getElementById("TakeImage_AutoExposureLevel_value1").disabled = false;
  368. document.getElementById("finerotate").disabled = false;
  369. document.getElementById("prerotateangle").disabled = false;
  370. document.getElementById("startreference").disabled = true;
  371. document.getElementById("take").disabled = false;
  372. if (param["Alignment"]["InitialMirror"].found)
  373. document.getElementById("mirror").disabled = false;
  374. else
  375. {
  376. document.getElementById("labelmirror").style = "color:lightgrey;";
  377. }
  378. if (param["Alignment"]["FlipImageSize"].found)
  379. document.getElementById("flip").disabled = false;
  380. else
  381. {
  382. document.getElementById("labelflip").style = "color:lightgrey;";
  383. }
  384. if (param["TakeImage"]["Brightness"].found && param["TakeImage"]["Brightness"].enabled)
  385. {
  386. document.getElementById("TakeImage_Brightness_value1").disabled = false;
  387. document.getElementById("TakeImage_Contrast_value1").disabled = false;
  388. document.getElementById("TakeImage_Saturation_value1").disabled = false;
  389. document.getElementById("TakeImage_Sharpness_value1").disabled = false;
  390. document.getElementById("TakeImage_LEDIntensity_value1").disabled = false;
  391. }
  392. else
  393. {
  394. document.getElementById("TakeImage_Brightness_value1").type = "hidden";
  395. document.getElementById("TakeImage_Brightness_text").style.visibility = "hidden";
  396. }
  397. // if (param["TakeImage"]["Saturation"].found)
  398. // document.getElementById("TakeImage_Saturation_value1").disabled = false;
  399. // if (param["TakeImage"]["Contrast"].found)
  400. // document.getElementById("TakeImage_Contrast_value1").disabled = false;
  401. isActReference = false;
  402. loadCanvas(url, true);
  403. }
  404. function showReference(_param){
  405. url = getDomainname() + "/fileserver/config/reference.jpg" + "?session=" + Math.floor((Math.random() * 1000000) + 1);
  406. if (_param["Alignment"]["InitialRotate"].value1 < 0) {
  407. document.getElementById("prerotateangle").value = Math.ceil(_param["Alignment"]["InitialRotate"].value1);
  408. }
  409. else {
  410. document.getElementById("prerotateangle").value = Math.floor(_param["Alignment"]["InitialRotate"].value1);
  411. }
  412. document.getElementById("finerotate").value = (Number(_param["Alignment"]["InitialRotate"].value1) -
  413. Number(document.getElementById("prerotateangle").value)).toFixed(1);
  414. if (_param["Alignment"]["InitialMirror"].found && (_param["Alignment"]["InitialMirror"].value1 == "true"))
  415. document.getElementById("mirror").checked = true;
  416. if (_param["Alignment"]["FlipImageSize"].found && (_param["Alignment"]["FlipImageSize"].value1 == "true"))
  417. document.getElementById("flip").checked = true;
  418. document.getElementById("grayscale").disabled = true;
  419. document.getElementById("negative").disabled = true;
  420. document.getElementById("aec2").disabled = true;
  421. document.getElementById("FixedExposure").disabled = true;
  422. document.getElementById("zoom").disabled = true;
  423. document.getElementById("zoommode").disabled = true;
  424. document.getElementById("zoomoffsetx").disabled = true;
  425. document.getElementById("zoomoffsety").disabled = true;
  426. document.getElementById("TakeImage_AutoExposureLevel_value1").disabled = true;
  427. document.getElementById("finerotate").disabled = true;
  428. document.getElementById("prerotateangle").disabled = true;
  429. document.getElementById("updatereferenceimage").disabled = true;
  430. document.getElementById("startreference").disabled = false;
  431. document.getElementById("take").disabled = true;
  432. document.getElementById("TakeImage_Brightness_value1").disabled = true;
  433. document.getElementById("TakeImage_Saturation_value1").disabled = true;
  434. document.getElementById("TakeImage_Contrast_value1").disabled = true;
  435. document.getElementById("TakeImage_Sharpness_value1").disabled = true;
  436. document.getElementById("TakeImage_LEDIntensity_value1").disabled = true;
  437. document.getElementById("mirror").disabled = false;
  438. document.getElementById("flip").disabled = false;
  439. if (!(param["TakeImage"]["Brightness"].found))
  440. {
  441. document.getElementById("TakeImage_Brightness_value1").type = "hidden";
  442. document.getElementById("TakeImage_Brightness_text").style.visibility = "hidden";
  443. }
  444. document.getElementById("mirror").disabled = true;
  445. document.getElementById("flip").disabled = true;
  446. isActReference = true;
  447. loadCanvas(url, false);
  448. }
  449. function dataURLtoBlob(dataurl) {
  450. var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
  451. bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
  452. while(n--){
  453. u8arr[n] = bstr.charCodeAt(n);
  454. }
  455. return new Blob([u8arr], {type:mime});
  456. }
  457. function SaveReference(){
  458. if (confirm("Are you sure you want to save the new reference image configuration?")) {
  459. param["Alignment"]["InitialRotate"].value1 = (Number(document.getElementById("prerotateangle").value) +
  460. Number(document.getElementById("finerotate").value)).toFixed(1);
  461. if ((param["Alignment"]["InitialMirror"].found == true) && (document.getElementById("mirror").checked))
  462. {
  463. param["Alignment"]["InitialMirror"].value1 = "true";
  464. param["Alignment"]["InitialMirror"]["found"] = true;
  465. param["Alignment"]["InitialMirror"]["enabled"] = true;
  466. }
  467. else
  468. param["Alignment"]["InitialMirror"].value1 = "false";
  469. if ((param["Alignment"]["FlipImageSize"].found == true) && (document.getElementById("flip").checked))
  470. param["Alignment"]["FlipImageSize"].value1 = "true";
  471. else
  472. param["Alignment"]["FlipImageSize"].value1 = "false";
  473. if ((param["TakeImage"]["Grayscale"].found == true) && (document.getElementById("grayscale").checked))
  474. param["TakeImage"]["Grayscale"].value1 = "true";
  475. else
  476. param["TakeImage"]["Grayscale"].value1 = "false";
  477. if ((param["TakeImage"]["Negative"].found == true) && (document.getElementById("negative").checked))
  478. param["TakeImage"]["Negative"].value1 = "true";
  479. else
  480. param["TakeImage"]["Negative"].value1 = "false";
  481. if ((param["TakeImage"]["Aec2"].found == true) && (document.getElementById("aec2").checked))
  482. param["TakeImage"]["Aec2"].value1 = "true";
  483. else
  484. param["TakeImage"]["Aec2"].value1 = "false";
  485. if ((param["TakeImage"]["FixedExposure"].found == true) && (document.getElementById("FixedExposure").checked))
  486. param["TakeImage"]["FixedExposure"].value1 = "true";
  487. else
  488. param["TakeImage"]["FixedExposure"].value1 = "false";
  489. if ((param["TakeImage"]["Zoom"].found == true) && (document.getElementById("zoom").checked))
  490. param["TakeImage"]["Zoom"].value1 = "true";
  491. else
  492. param["TakeImage"]["Zoom"].value1 = "false";
  493. param["TakeImage"]["ZoomMode"].value1 = document.getElementById("zoommode").value;
  494. param["TakeImage"]["ZoomOffsetX"].value1 = document.getElementById("zoomoffsetx").value;
  495. param["TakeImage"]["ZoomOffsetY"].value1 = document.getElementById("zoomoffsety").value;
  496. if (param["TakeImage"]["Brightness"].found && param["TakeImage"]["Brightness"].enabled)
  497. {
  498. ReadParameter(param, "TakeImage", "Brightness", false);
  499. ReadParameter(param, "TakeImage", "Contrast", false);
  500. ReadParameter(param, "TakeImage", "Saturation", false);
  501. ReadParameter(param, "TakeImage", "Sharpness", false);
  502. ReadParameter(param, "TakeImage", "LEDIntensity", false);
  503. ReadParameter(param, "TakeImage", "AutoExposureLevel", false);
  504. }
  505. var canvas = document.getElementById("canvas");
  506. drawRotated(false);
  507. WriteConfigININew();
  508. SaveConfigToServer(getDomainname());
  509. document.getElementById("updatereferenceimage").disabled = true;
  510. SaveCanvasToImage(canvas, "/config/reference.jpg", true, getDomainname());
  511. showReference(param);
  512. //UpdatePage();
  513. firework.launch('Reference image configuration saved. It will get applied after next reboot', 'success', 5000);
  514. }
  515. }
  516. function loadCanvas(dataURL, grid) {
  517. var canvas = document.getElementById('canvas');
  518. var context = canvas.getContext('2d');
  519. imageObj.onload = function() {
  520. canvas.width = this.width;
  521. canvas.height = this.height;
  522. if (grid)
  523. drawRotated(true);
  524. else
  525. drawRotated(false);
  526. };
  527. imageObj.src = dataURL;
  528. }
  529. function getCoords(elem) { // crossbrowser version
  530. var box = elem.getBoundingClientRect();
  531. var body = document.body;
  532. var docEl = document.documentElement;
  533. var scrollTop = window.pageYOffset || docEl.scrollTop || body.scrollTop;
  534. var scrollLeft = window.pageXOffset || docEl.scrollLeft || body.scrollLeft;
  535. var clientTop = docEl.clientTop || body.clientTop || 0;
  536. var clientLeft = docEl.clientLeft || body.clientLeft || 0;
  537. var top = box.top + scrollTop - clientTop;
  538. var left = box.left + scrollLeft - clientLeft;
  539. return { top: Math.round(top), left: Math.round(left) };
  540. }
  541. /* hash #description open the details part of the page */
  542. function openDescription() {
  543. if(window.location.hash) {
  544. var hash = window.location.hash.substring(1); //Puts hash in variable, and removes the # character
  545. if(hash == 'description')
  546. document.getElementById("desc_details").open = true;
  547. }
  548. }
  549. function init() {
  550. openDescription();
  551. canvas.addEventListener('mousemove', mouseMove, false);
  552. loadConfig(getDomainname());
  553. ParseConfig();
  554. param = getConfigParameters();
  555. param["TakeImage"]["AutoExposureLevel"]["enabled"] = true;
  556. param["TakeImage"]["LEDIntensity"]["enabled"] = true;
  557. param["TakeImage"]["Brightness"]["enabled"] = true;
  558. param["TakeImage"]["Contrast"]["enabled"] = true;
  559. param["TakeImage"]["Saturation"]["enabled"] = true;
  560. param["TakeImage"]["Sharpness"]["enabled"] = true;
  561. param["TakeImage"]["Grayscale"]["enabled"] = true;
  562. param["TakeImage"]["Negative"]["enabled"] = true;
  563. param["TakeImage"]["Aec2"]["enabled"] = true;
  564. param["TakeImage"]["FixedExposure"]["enabled"] = true;
  565. param["TakeImage"]["Zoom"]["enabled"] = true;
  566. param["TakeImage"]["ZoomMode"]["enabled"] = true;
  567. param["TakeImage"]["ZoomOffsetX"]["enabled"] = true;
  568. param["TakeImage"]["ZoomOffsetY"]["enabled"] = true;
  569. if (!param["TakeImage"]["Grayscale"]["found"])
  570. {
  571. param["TakeImage"]["Grayscale"]["found"] = true;
  572. param["TakeImage"]["Grayscale"].value1 = "false";
  573. }
  574. if (!param["TakeImage"]["Negative"]["found"])
  575. {
  576. param["TakeImage"]["Negative"]["found"] = true;
  577. param["TakeImage"]["Negative"].value1 = "false";
  578. }
  579. if (!param["TakeImage"]["Aec2"]["found"])
  580. {
  581. param["TakeImage"]["Aec2"]["found"] = true;
  582. param["TakeImage"]["Aec2"].value1 = "false";
  583. }
  584. if (!param["TakeImage"]["FixedExposure"]["found"])
  585. {
  586. param["TakeImage"]["FixedExposure"]["found"] = true;
  587. param["TakeImage"]["FixedExposure"].value1 = "false";
  588. }
  589. if (!param["TakeImage"]["Zoom"]["found"])
  590. {
  591. param["TakeImage"]["Zoom"]["found"] = true;
  592. param["TakeImage"]["Zoom"].value1 = "false";
  593. }
  594. if (!param["TakeImage"]["ZoomMode"]["found"])
  595. {
  596. param["TakeImage"]["ZoomMode"]["found"] = true;
  597. param["TakeImage"]["ZoomMode"].value1 = "0";
  598. }
  599. if (!param["TakeImage"]["ZoomOffsetX"]["found"])
  600. {
  601. param["TakeImage"]["ZoomOffsetX"]["found"] = true;
  602. param["TakeImage"]["ZoomOffsetX"].value1 = "0";
  603. }
  604. if (!param["TakeImage"]["ZoomOffsetY"]["found"])
  605. {
  606. param["TakeImage"]["ZoomOffsetY"]["found"] = true;
  607. param["TakeImage"]["ZoomOffsetY"].value1 = "0";
  608. }
  609. if (!param["TakeImage"]["AutoExposureLevel"]["found"])
  610. {
  611. param["TakeImage"]["AutoExposureLevel"]["found"] = true;
  612. param["TakeImage"]["AutoExposureLevel"]["value1"] = "0";
  613. }
  614. if (!param["TakeImage"]["LEDIntensity"]["found"])
  615. {
  616. param["TakeImage"]["LEDIntensity"]["found"] = true;
  617. param["TakeImage"]["LEDIntensity"]["value1"] = "50";
  618. }
  619. if (!param["TakeImage"]["Brightness"]["found"])
  620. {
  621. param["TakeImage"]["Brightness"]["found"] = true;
  622. param["TakeImage"]["Brightness"]["value1"] = "0";
  623. }
  624. if (!param["TakeImage"]["Contrast"]["found"])
  625. {
  626. param["TakeImage"]["Contrast"]["found"] = true;
  627. param["TakeImage"]["Contrast"]["value1"] = "0";
  628. }
  629. if (!param["TakeImage"]["Saturation"]["found"])
  630. {
  631. param["TakeImage"]["Saturation"]["found"] = true;
  632. param["TakeImage"]["Saturation"]["value1"] = "0";
  633. }
  634. if (!param["TakeImage"]["Sharpness"]["found"])
  635. {
  636. param["TakeImage"]["Sharpness"]["found"] = true;
  637. param["TakeImage"]["Sharpness"]["value1"] = "0";
  638. }
  639. UpdateInput();
  640. showReference(param);
  641. }
  642. function UpdateInput() {
  643. WriteParameter(param, category, "TakeImage", "AutoExposureLevel", false, true);
  644. WriteParameter(param, category, "TakeImage", "Brightness", false, true);
  645. WriteParameter(param, category, "TakeImage", "Contrast", false, true);
  646. WriteParameter(param, category, "TakeImage", "Saturation", false, true);
  647. WriteParameter(param, category, "TakeImage", "Sharpness", false, true);
  648. WriteParameter(param, category, "TakeImage", "LEDIntensity", false);
  649. if (param["TakeImage"]["Grayscale"].value1 == "true") {
  650. document.getElementById("grayscale").checked = true;
  651. } else {
  652. document.getElementById("grayscale").checked = false;
  653. }
  654. if (param["TakeImage"]["Negative"].value1 == "true") {
  655. document.getElementById("negative").checked = true;
  656. } else {
  657. document.getElementById("negative").checked = false;
  658. }
  659. if (param["TakeImage"]["Aec2"].value1 == "true") {
  660. document.getElementById("aec2").checked = true;
  661. } else {
  662. document.getElementById("aec2").checked = false;
  663. }
  664. if (param["TakeImage"]["FixedExposure"].value1 == "true") {
  665. document.getElementById("FixedExposure").checked = true;
  666. } else {
  667. document.getElementById("FixedExposure").checked = false;
  668. }
  669. if (param["TakeImage"]["Zoom"].value1 == "true") {
  670. document.getElementById("zoom").checked = true;
  671. } else {
  672. document.getElementById("zoom").checked = false;
  673. }
  674. document.getElementById("zoommode").value = param["TakeImage"]["ZoomMode"].value1;
  675. document.getElementById("zoomoffsetx").value = param["TakeImage"]["ZoomOffsetX"].value1;
  676. document.getElementById("zoomoffsety").value = param["TakeImage"]["ZoomOffsetY"].value1;
  677. }
  678. function ReadParameter(_param, _cat, _name, _optional, _select = false){
  679. if (_param[_cat][_name]["found"]){
  680. if (_optional) {
  681. _param[_cat][_name]["enabled"] = document.getElementById(_cat+"_"+_name+"_enabled").checked;
  682. }
  683. if (_select) {
  684. var sel = document.getElementById(_cat+"_"+_name+"_value1");
  685. _param[_cat][_name]["value1"] = sel.options[sel.selectedIndex].text;
  686. }
  687. else {
  688. for (var j = 1; j <= _param[_cat][_name]["anzParam"]; ++j) {
  689. _param[_cat][_name]["value"+j] = document.getElementById(_cat+"_"+_name+"_value"+j).value;
  690. }
  691. }
  692. }
  693. }
  694. function WriteParameter(_param, _category, _cat, _name, _optional, outval = false, _select = false, _anzpara = 1){
  695. if (_param[_cat][_name]["found"]){
  696. if (_optional) {
  697. document.getElementById(_cat+"_"+_name+"_enabled").checked = _param[_cat][_name]["enabled"];
  698. for (var j = 1; j <= _anzpara; ++j) {
  699. document.getElementById(_cat+"_"+_name+"_value"+j).disabled = !_param[_cat][_name]["enabled"];
  700. }
  701. }
  702. document.getElementById(_cat+"_"+_name+"_text").style="color:black;"
  703. if (_select) {
  704. var textToFind = _param[_cat][_name]["value1"];
  705. var dd = document.getElementById(_cat+"_"+_name+"_value1");
  706. for (var i = 0; i < dd.options.length; i++) {
  707. if (dd.options[i].text.toLowerCase() === textToFind.toLowerCase()) {
  708. dd.selectedIndex = i;
  709. break;
  710. }
  711. }
  712. }
  713. else {
  714. for (var j = 1; j <= _anzpara; ++j) {
  715. document.getElementById(_cat+"_"+_name+"_value"+j).value = _param[_cat][_name]["value"+j];
  716. }
  717. }
  718. if (outval)
  719. document.getElementById(_cat+"_"+_name+"_value1_output").value = document.getElementById(_cat+"_"+_name+"_value1").value;
  720. }
  721. else {
  722. if (_optional) {
  723. document.getElementById(_cat+"_"+_name+"_enabled").disabled = true;
  724. for (var j = 1; j <= _anzpara; ++j) {
  725. document.getElementById(_cat+"_"+_name+"_value"+j).disabled = true;
  726. }
  727. }
  728. document.getElementById(_cat+"_"+_name+"_text").style="color:lightgrey;"
  729. }
  730. }
  731. function drawRotated(_grid = true) {
  732. finerot= parseFloat(document.getElementById("finerotate").value);
  733. prerot = parseFloat(document.getElementById("prerotateangle").value);
  734. mirror = document.getElementById("mirror").checked;
  735. flip = document.getElementById("flip").checked;
  736. if (finerot == 1) {
  737. prerot+=1
  738. finerot = 0
  739. }
  740. if (finerot == -1) {
  741. prerot-=1
  742. finerot = 0
  743. }
  744. degrees = finerot + prerot;
  745. document.getElementById("finerotate").value = finerot;
  746. document.getElementById("prerotateangle").value = prerot;
  747. var canvas = document.getElementById('canvas');
  748. if (flip == 1)
  749. {
  750. canvas.width = imageObj.height;
  751. canvas.height = imageObj.width;
  752. }
  753. else
  754. {
  755. canvas.width = imageObj.width;
  756. canvas.height = imageObj.height;
  757. }
  758. var canvas = document.getElementById('canvas');
  759. var context = canvas.getContext('2d');
  760. context.clearRect(0,0,canvas.width,canvas.height);
  761. context.save();
  762. negative = document.getElementById("negative").checked;
  763. if (isActReference)
  764. {
  765. context.drawImage(imageObj,0,0);
  766. }
  767. else
  768. {
  769. if (negative) {
  770. context.filter = 'invert(1)';
  771. }
  772. context.translate(canvas.width/2,canvas.height/2);
  773. context.rotate(degrees*Math.PI/180);
  774. if (mirror) {
  775. context.scale(-1, 1);
  776. }
  777. context.drawImage(imageObj,-imageObj.width/2,-imageObj.height/2);
  778. }
  779. context.restore();
  780. if (_grid)
  781. drawGrid();
  782. }
  783. function drawGrid(){
  784. var canvas = document.getElementById('canvas');
  785. var ctx = canvas.getContext('2d');
  786. w = canvas.width;
  787. h = canvas.height;
  788. ctx.save();
  789. ctx.strokeStyle = '#00FF00';
  790. for (i = h/2; i < h; i += 100)
  791. {
  792. ctx.moveTo(0, i);
  793. ctx.lineTo(w, i);
  794. ctx.stroke();
  795. ctx.moveTo(0, h-i);
  796. ctx.lineTo(w, h-i);
  797. ctx.stroke();
  798. }
  799. for (i = w/2; i < w; i += 100)
  800. {
  801. ctx.moveTo(i, 0);
  802. ctx.lineTo(i, h);
  803. ctx.stroke();
  804. ctx.moveTo(w-i, 0);
  805. ctx.lineTo(w-i, h);
  806. ctx.stroke(); }
  807. ctx.restore();
  808. }
  809. function mouseMove(e) {
  810. if (isActReference)
  811. drawRotated(false);
  812. else
  813. drawRotated(true);
  814. var canvas = document.getElementById('canvas');
  815. var context = canvas.getContext('2d');
  816. zw = getCoords(this);
  817. x = e.pageX - zw.left;
  818. y = e.pageY - zw.top;
  819. context.lineWidth = 2;
  820. context.strokeStyle = "#00FF00";
  821. context.beginPath();
  822. context.moveTo(0,y);
  823. context.lineTo(canvas.width, y);
  824. context.moveTo(x, 0);
  825. context.lineTo(x, canvas.height);
  826. context.stroke();
  827. }
  828. init();
  829. UpdateExpertModus();
  830. function UpdateExpertModus()
  831. {
  832. // var _style = 'display:none;';
  833. var _style_pur = 'none';
  834. var _hidden = true;
  835. if (document.getElementById("ExpertModus_enabled").checked) {
  836. // _style = '';
  837. _style_pur = '';
  838. _hidden = false;
  839. firework.launch("Expert view activated. Please use carefully", 'warning', 5000);
  840. }
  841. const expert = document.querySelectorAll(".expert");
  842. for (var i = 0; i < expert.length; i++) {
  843. expert[i].style.display = _style_pur;
  844. // document.getElementById(expert[i].id).style = _style;
  845. }
  846. }
  847. </script>
  848. </body>
  849. </html>