summaryrefslogtreecommitdiff
path: root/hdmicap.html
diff options
context:
space:
mode:
Diffstat (limited to 'hdmicap.html')
-rw-r--r--hdmicap.html327
1 files changed, 327 insertions, 0 deletions
diff --git a/hdmicap.html b/hdmicap.html
new file mode 100644
index 0000000..11c60b8
--- /dev/null
+++ b/hdmicap.html
@@ -0,0 +1,327 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+ <meta charset=utf-8 http-equiv="Content-Language" content="en"/>
+ <title>hdmicap</title>
+<style type="text/css">
+ td { font-size:8pt; font: Arial; font-weight:normal; text-align:center; color:#404040; text-align:center; background:#efefff; padding:1px; -webkit-border-radius:1px; -moz-border-radius:1px; border-radius:1px;white-space:nowrap;}
+ td.dump { font-size:8pt; font: Arial; font-weight:normal; text-align:center; color:#404040; vertical-align:top; background:#efefff; padding:1px; -webkit-border-radius:1px; -moz-border-radius:1px; border-radius:1px;}
+
+ div.title { font-size:12pt; font: Arial; font-weight:normal; text-align:center; color:#000000; background:#d8d8e8; }
+
+ div.capdata { font-size:10pt; font: Arial; font-weight:normal; text-align:center; color:#000000; vertical-align:middle; text-align:center; background:#e0e0f0; padding:1px; -webkit-border-radius:1px; -moz-border-radius:1px; border-radius:1px;}
+ div.capdata_cea { font-size:10pt; font: Arial; font-weight:normal; text-align:center; color:#000000; vertical-align:middle; text-align:center; background:#e0ffe0; padding:1px; -webkit-border-radius:1px; -moz-border-radius:1px; border-radius:1px;}
+ .browser { font-size:18pt; font: Arial; font-weight:normal; text-align:center; color:#ffff00; vertical-align:middle; text-align:center; background:#d0b070; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px;}
+ .tr-enabled { font-size:10pt; font: Arial; font-weight:normal; text-align:center; color:#000000; vertical-align:middle; text-align:center; background:#d0d0ff; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px;}
+ .tr-disabled { font-size:10pt; font: Arial; font-weight:normal; text-align:center; color:#808080; vertical-align:middle; text-align:center; background:#c0c0c0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px;}
+
+ .group2 { width:600px; vertical-align:middle; text-align:center; background:#f0f0e0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; }
+ .explain { vertical-align:middle; text-align:center; background:#f0f0c0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; color:#404000; }
+ .content { vertical-align:top; text-align:center; background:#fffff0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; }
+ .canvas { vertical-align:top; text-align:center; background:#efefd0; padding:12px; -webkit-border-radius:10px; -moz-border-radius:10px; border-radius:10px; }
+</style>
+</head>
+<body>
+<header></header>
+<article>
+<table><tr style="vertical-align:top"><td style="vertical-align:top">
+ <table width="100%" style="vertical-align:top"><tr style="vertical-align:top"><td style="vertical-align:top">
+ <table style="vertical-align:top"><tr style="vertical-align:top"><td style="vertical-align:top"><a href="http://libwebsockets.org">
+ <img src="/hdmicap.png"></a><td></td>
+ <tr><td class="td.dump">
+ <table>
+ <tr><td colspan="4" align="center"><div class="title">HDMI clock<div></td></tr>
+ <tr><td width="99%">PLL lock</td>
+ <td colspan="2" tip="Whether PLL could lock to perform pixel clock recovery"><div id="pll_locked" class="capdata"></div></td><td></td></tr>
+ <tr id="cea-info" class="tr-enabled" tip="VIC code reported in AVI infoframe"><td>AVI VIC</td>
+ <td></td><td><div id="vic_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="clock-info" class="tr-enabled" tip="HDMI pixel clock rate"><td>Clock rate</td>
+ <td><div id="clk_rate" class="capdata"></div></td><td><div id="clk_rate_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="dlq"><td colspan="4" align="center"><div class="title">Data lane quality<div></td></tr>
+ <tr id="lane-info" class="tr-enabled" tip="ctrl symbol detection probability, numbers depend on mode blanking content, ch0 may have slightly smaller results."><td>Ctrl symbols</td><td colspan="2" align="center">
+ <table>
+ <tr><td>ch0</td><td>ch1</td><td>ch2</td></tr>
+ <tr><td><div id="ctrl_ch0_pc" class="capdata"></div></td>
+ <td><div id="ctrl_ch1_pc" class="capdata"></div></td>
+ <td><div id="ctrl_ch2_pc" class="capdata"></div></td></tr>
+ </table>
+ </td><td></td></tr>
+
+ <tr id="vt"><td colspan="4" align="center"><div class="title">Video Timing<div></td></tr>
+ <tr id="vsl"tip="HSYNC and VSYNC are detected and polarity confirmed"><td>Video Sync</td>
+ <td id="sync-info"><div id="video_syncs" class="capdata"></div></td><td id="sync-info_cea"><div id="video_syncs_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="ar" tip="HACT x VACT, active video region"><td>Active region</td><td><div id="active_details" class="capdata"></div></td><td><div id="active_details_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="hsr"><td>HSYNC rate</td><td><div id="hsync_rate" class="capdata"></div></td><td><div id="hsync_rate_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="ot" tip="Frame refresh rate"><td>VSYNC rate</td><td><div id="vsync_rate" class="capdata"></div></td><td><div id="vsync_rate_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="tfs" tip="HTOT x VTOT, Active and blanking area combined"><td>Total frame</td><td><div id="total_details" class="capdata"></div></td><td><div id="total_details_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="apv" tip="Measured number of pixel-times in a frame"><td style="padding-left:10px;">Px between VSYNCs</td><td style="padding-left:10px;"><div id="total_px_details" class="capdata"></div></td><td style="padding-left:10px;"><div id="total_px_details_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="hif" tip="The number of HTOT periods should exactly match VTOT"><td style="padding-left:20px;">Frame HTOT</td><td style="padding-left:10px;"><div id="total_px1_details" class="capdata"></div></td><td style="padding-left:10px;"><div id="total_px1_details_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="vhp" tip="VSYNC should come on the last line at 0 offset from HSYNC (ie, at HTOT + 1 on the last line)"><td style="padding-left:20px;">VSYNC HPOS</td><td style="padding-left:10px;"><div id="vsync_hpos" class="capdata"></div></td><td style="padding-left:10px;"><div id="vsync_hpos_cea" class="capdata_cea"></div></td><td></td></tr>
+
+ <tr id="thb" tip="HBLANK = HFP + HSA + HBP, pixels on a line without active data"><td>HBLANK</td><td><div id="hblank" class="capdata"></div></td><td><div id="hblank_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="thfp" tip="HFP, Horizontal Front Porch (aka Right Margin) timing"><td style="padding-left:10px;">HFP</td><td style="padding-left:10px;"><div id="hfp" class="capdata"></div></td><td style="padding-left:10px;"><div id="hfp_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="thsa" tip="HSA, HSYNC Active timing"><td style="padding-left:10px;">HSA</td><td style="padding-left:10px;"><div id="hsa" class="capdata"></div></td><td style="padding-left:10px;"><div id="hsa_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="thbp" tip="HBP, Horizontal Back Porch (aka Left Margin) timing"><td style="padding-left:10px;">HBP</td><td style="padding-left:10px;"><div id="hbp" class="capdata"></div></td><td style="padding-left:10px;"><div id="hbp_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="tvb" tip="VBLANK = VFP + VSA + VBP, lines in a frame without active data"><td>Total V blanking</td><td><div id="vblank" class="capdata"></div></td><td><div id="vblank_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="tvfp" tip="VFP, Vertical Front Porch (aka Bottom Margin) lines"><td style="padding-left:10px;">VFP</td><td style="padding-left:10px;"><div id="vfp" class="capdata"></div></td><td style="padding-left:10px;"><div id="vfp_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="tvsa" tip="VSA, VSYNC Active lines"><td style="padding-left:10px;">VSA</td><td style="padding-left:10px;"><div id="vsa" class="capdata"></div></td><td style="padding-left:10px;"><div id="vsa_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="tvbp" tip="VBP, Vertical Back Porch (aka Top Margin) lines"><td style="padding-left:10px;">VBP</td><td style="padding-left:10px;"><div id="vbp" class="capdata"></div></td><td style="padding-left:10px;"><div id="vbp_cea" class="capdata_cea"></div></td><td></td></tr>
+ <tr id="md"><td colspan="4" align="center"><div class="title">Frame Metadata<div></td></tr>
+ <tr id="dif" tip="Blanking px used for data in active region"><td>Data in active</td>
+ <td id="dia-info"><div id="data_active" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="div" tip="VBLANK px used for data"><td>Data in VBLANK</td>
+ <td id="div-info"><div id="data_vblank" class="capdata"></div></td><td></td><td></td></tr>
+
+ <tr id="di0" tip="Data island types per frame"><td>NULL data pkts</td>
+ <td id="tdd0"><div id="ddi0" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di1" tip="Data island types per frame"><td>ACR pkts</td>
+ <td id="tdd1"><div id="ddi1" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di2" tip="Data island types per frame"><td>Audio pkts</td>
+ <td id="tdd2"><div id="ddi2" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di3" tip="Data island types per frame"><td>General Control pkts</td>
+ <td id="tdd3"><div id="ddi3" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di4" tip="Data island types per frame"><td>ACP</td>
+ <td id="tdd4"><div id="ddi4" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di5" tip="Data island types per frame"><td>ISRC1</td>
+ <td id="tdd5"><div id="ddi5" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di6" tip="Data island types per frame"><td>ISRC2</td>
+ <td id="tdd6"><div id="ddi6" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di7" tip="Data island types per frame"><td>1-bit Audio</td>
+ <td id="tdd7"><div id="ddi7" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di8" tip="Data island types per frame"><td>DST Audio</td>
+ <td id="tdd8"><div id="ddi8" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di9" tip="Data island types per frame"><td>HBR Audio</td>
+ <td id="tdd9"><div id="ddi9" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di10" tip="Data island types per frame"><td>Gamut</td>
+ <td id="tdd10"><div id="ddi10" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di11" tip="Data island types per frame"><td>Vendor IF</td>
+ <td id="tdd11"><div id="ddi11" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di12" tip="Data island types per frame"><td>AVI IF</td>
+ <td id="tdd12"><div id="ddi12" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di13" tip="Data island types per frame"><td>SPD IF</td>
+ <td id="tdd13"><div id="ddi13" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di14" tip="Data island types per frame"><td>Audio IF</td>
+ <td id="tdd14"><div id="ddi14" class="capdata"></div></td><td></td><td></td></tr>
+ <tr id="di15" tip="Data island types per frame"><td>MPEG SRC IF</td>
+ <td id="tdd15"><div id="ddi15" class="capdata"></div></td><td></td><td></td></tr>
+ </table>
+ </td></tr>
+ </table>
+ </td></tr>
+ </table>
+ </td><td id="show" class="td.dump" width="99%" style="display:none"><div id="dump"></div><div id="capture"><img id="imgtag" style="object-fit:none;max-device-width=864;" src="/dump.png"></div></td></tr>
+</table>
+</article>
+
+<script>
+
+
+ var tds_pll = [ "cea-info", "clock-info", "dlq", "lane-info" ];
+ var tds_syncs = [ "vt", "vsl" ];
+ var tds_sane = [ "ar", "hsr", "ot", "tfs", "apv", "hif", "vhp", "thb", "thfp", "thsa", "thbp",
+ "tvb", "tvfp", "tvsa", "tvbp", "md", "dif", "div", "show",
+ "di0", "di1", "di2", "di3", "di4", "di5", "di6", "di7", "di8", "di9", "di10", "di11", "di12",
+ "di13", "di14", "di15"];
+
+ var tds_cea = [ "vic_cea", "clk_rate_cea", "video_syncs_cea",
+ "active_details_cea", "hsync_rate_cea",
+ "vsync_rate_cea", "total_details_cea",
+ "total_px_details_cea", "total_px1_details_cea",
+ "vsync_hpos_cea", "hblank_cea", "hbp_cea", "hsa_cea",
+ "hfp_cea", "vblank_cea", "vbp_cea", "vsa_cea",
+ "vfp_cea" ];
+
+ var tds_compare = [ "clk_rate", "video_syncs", "active_details",
+ "hsync_rate", "vsync_rate", "total_details",
+ "total_px_details", "total_px1_details",
+ "vsync_hpos", "hblank", "hbp", "hsa", "hfp",
+ "vblank", "vbp", "vsa", "vfp" ];
+
+var pos = 0;
+
+function get_appropriate_ws_url()
+{
+ var pcol;
+ var u = document.URL;
+
+ if (u.substring(0, 5) == "https") {
+ pcol = "wss://";
+ u = u.substr(8);
+ } else {
+ pcol = "ws://";
+ if (u.substring(0, 4) == "http")
+ u = u.substr(7);
+ }
+
+ u = u.split('/');
+
+ /* + "/xxx" bit is for IE10 workaround */
+ return pcol + u[0] + "/xxx";
+}
+
+var connection = 0;
+var obj;
+var png_frame;
+
+function conn_retry()
+{
+ var r1, r2, r3, x, y, chan, z, block, channel_data = 0, tpt, tot;
+
+ if (connection)
+ return;
+
+ socket = new WebSocket(get_appropriate_ws_url(), "linaro.hdmicap");
+
+ try {
+ socket.onopen = function() {
+ connection = 1;
+ }
+
+ socket.onmessage = function got_packet(msg) {
+ //document.getElementById("dump").textContent = msg.data;
+ obj = JSON.parse(msg.data);
+ if (obj.metadata.pll_locked == 0){
+ document.getElementById("pll_locked").textContent = "No";
+ for (n = 0; n < tds_pll.length; n++)
+ document.getElementById(tds_pll[n]).style.display = "none";
+ for (n = 0; n < tds_syncs.length; n++)
+ document.getElementById(tds_syncs[n]).style.display = "none";
+ for (n = 0; n < tds_sane.length; n++)
+ document.getElementById(tds_sane[n]).style.display = "none";
+ return;
+ }
+ document.getElementById("pll_locked").textContent = "Yes";
+ document.getElementById("clk_rate").textContent = obj.metadata.pxclk_MHz + "MHz";
+ tot = Number(obj.metadata.ctrl_ch0_pc) + Number(obj.metadata.ctrl_ch1_pc) + Number(obj.metadata.ctrl_ch2_pc);
+ document.getElementById("ctrl_ch0_pc").textContent = ((Number(obj.metadata.ctrl_ch0_pc) * 100) / tot).toPrecision(2) + "%";
+ document.getElementById("ctrl_ch1_pc").textContent = ((Number(obj.metadata.ctrl_ch1_pc) * 100) / tot).toPrecision(2) + "%";
+ document.getElementById("ctrl_ch2_pc").textContent = ((Number(obj.metadata.ctrl_ch2_pc) * 100) / tot).toPrecision(2) + "%";
+
+ for (n = 0; n < tds_pll.length; n++)
+ document.getElementById(tds_pll[n]).style.display = "table-row";
+ if (obj.metadata.sync_detected == 0){
+ document.getElementById("video_syncs").textContent = "No";
+ for (n = 0; n < tds_syncs.length; n++)
+ document.getElementById(tds_syncs[n]).style.display = "none";
+ for (n = 0; n < tds_sane.length; n++)
+ document.getElementById(tds_sane[n]).style.display = "none";
+ document.getElementById("imgtag").style.display = "none";
+ return;
+ }
+
+ document.getElementById("video_syncs").textContent =
+ "H"+obj.metadata.hpol+", V"+obj.metadata.vpol;
+ for (n = 0; n < tds_syncs.length; n++)
+ document.getElementById(tds_syncs[n]).style.display = "table-row";
+
+ if (obj.metadata.sanity == 0) {
+ for (n = 0; n < tds_sane.length; n++)
+ document.getElementById(tds_sane[n]).style.display = "none";
+ document.getElementById("imgtag").style.display = "none";
+ return;
+ }
+ for (n = 0; n < tds_sane.length; n++)
+ document.getElementById(tds_sane[n]).style.display = "table-row";
+
+ document.getElementById("active_details").innerHTML = "<b>"+obj.metadata.hact + "x" +
+ obj.metadata.vact + "</b>";
+ document.getElementById("hsync_rate").textContent = obj.metadata.hrate_kHz + "kHz";
+ document.getElementById("vsync_rate").textContent = obj.metadata.vrate_Hz + "Hz";
+ document.getElementById("total_details").textContent = obj.metadata.htot + "x" +
+ obj.metadata.vtot;
+ document.getElementById("total_px_details").textContent = obj.metadata.px_in_frame;
+ document.getElementById("total_px1_details").textContent = obj.metadata.htot_in_frame;
+ document.getElementById("vsync_hpos").textContent = "+" + obj.metadata.vsync_onset_hpx + " px";
+ document.getElementById("hblank").textContent = obj.metadata.hbl;
+ document.getElementById("hbp").textContent = obj.metadata.hbp;
+ document.getElementById("hsa").textContent = obj.metadata.hsa;
+ document.getElementById("hfp").textContent = obj.metadata.hfp;
+
+ document.getElementById("vblank").textContent = obj.metadata.vbl;
+ document.getElementById("vbp").textContent = obj.metadata.vbp;
+ document.getElementById("vsa").textContent = obj.metadata.vsa;
+ document.getElementById("vfp").textContent = obj.metadata.vfp;
+
+ document.getElementById("data_active").textContent = obj.metadata.data_px_active;
+ document.getElementById("data_vblank").textContent = obj.metadata.data_vb;
+
+ //document.getElementById("blanking_px").textContent =;
+ //document.getElementById("").textContent = obj.metadata.data_px_active;
+ document.getElementById("dump").textContent = obj.png_frame;
+ if (obj.png_frame != png_frame) {
+ png_frame = obj.png_frame;
+ document.getElementById("imgtag").src = "/dump.png?x=" + png_frame;
+ document.getElementById("imgtag").style.display = "table-row";
+ }
+
+ document.getElementById("ddi0").textContent = obj.data_islands.stats.Null;
+ document.getElementById("ddi1").textContent = obj.data_islands.stats.ACR;
+ document.getElementById("ddi2").textContent = obj.data_islands.stats.Audio;
+ document.getElementById("ddi3").textContent = obj.data_islands.stats.Gencon;
+ document.getElementById("ddi4").textContent = obj.data_islands.stats.ACP;
+ document.getElementById("ddi5").textContent = obj.data_islands.stats.ISRC1;
+ document.getElementById("ddi6").textContent = obj.data_islands.stats.ISRC2;
+ document.getElementById("ddi7").textContent = obj.data_islands.stats.onebit;
+ document.getElementById("ddi8").textContent = obj.data_islands.stats.DST;
+ document.getElementById("ddi9").textContent = obj.data_islands.stats.HBR;
+ document.getElementById("ddi10").textContent = obj.data_islands.stats.Gamut;
+ document.getElementById("ddi11").textContent = obj.data_islands.stats.VendorIF;
+ document.getElementById("ddi12").textContent = obj.data_islands.stats.AVIIF;
+ document.getElementById("ddi13").textContent = obj.data_islands.stats.SPDIF + " (" + obj.data_islands.spd.spd_name + ")";
+ document.getElementById("ddi14").textContent = obj.data_islands.stats.AudioIF;
+ document.getElementById("ddi15").textContent = obj.data_islands.stats.MPEGIF;
+
+ if (obj.data_islands.avi.cea != 0) {
+ document.getElementById("vic_cea").textContent = obj.data_islands.avi.cea;
+ document.getElementById("clk_rate_cea").textContent = obj.data_islands.avi.pxclk_MHz + "MHz";
+ document.getElementById("video_syncs_cea").textContent = "H"+obj.data_islands.avi.hpol + ", V"+obj.data_islands.avi.vpol;
+
+ document.getElementById("active_details_cea").innerHTML = "<b>"+obj.data_islands.avi.hact + "x" +
+ obj.data_islands.avi.vact + "</b>";
+ document.getElementById("hsync_rate_cea").textContent = obj.data_islands.avi.hrate_kHz + "kHz";
+ document.getElementById("vsync_rate_cea").textContent = obj.data_islands.avi.vrate_Hz + "Hz";
+ document.getElementById("total_details_cea").textContent = obj.data_islands.avi.htot + "x" +
+ obj.data_islands.avi.vtot;
+ document.getElementById("total_px_details_cea").textContent = obj.data_islands.avi.px_in_frame;
+ document.getElementById("total_px1_details_cea").textContent = obj.data_islands.avi.vtot+".000";
+ document.getElementById("vsync_hpos_cea").textContent = "+0 px";
+ document.getElementById("hblank_cea").textContent = obj.data_islands.avi.hbl;
+ document.getElementById("hbp_cea").textContent = obj.data_islands.avi.hbp;
+ document.getElementById("hsa_cea").textContent = obj.data_islands.avi.hsa;
+ document.getElementById("hfp_cea").textContent = obj.data_islands.avi.hfp;
+
+ document.getElementById("vblank_cea").textContent = obj.data_islands.avi.vbl;
+ document.getElementById("vbp_cea").textContent = obj.data_islands.avi.vbp;
+ document.getElementById("vsa_cea").textContent = obj.data_islands.avi.vsa;
+ document.getElementById("vfp_cea").textContent = obj.data_islands.avi.vfp;
+ } else {
+ for (n = 0; n < tds_cea.length; n++)
+ document.getElementById(tds_cea[n]).textContent = "";
+
+ document.getElementById("vic_cea").textContent = "none";
+ }
+
+ for (n = 0; n < tds_compare.length; n++) {
+ if (document.getElementById(tds_compare[n]).textContent ==
+ document.getElementById(tds_cea[n + 1]).textContent)
+ document.getElementById(tds_compare[n]).style.backgroundColor = "#e0ffe0";
+ else
+ document.getElementById(tds_compare[n]).style.backgroundColor = "#e0e0f0";
+ }
+ }
+
+ socket.onclose = function(){
+ connection = 0;
+ // grayOut(true,{'zindex':'499'});
+ setTimeout("conn_retry();", 1000);
+ }
+ } catch(exception) {
+ setTimeout("conn_retry", 1000);
+ }
+}
+
+conn_retry();
+
+</script>
+</body>
+</html>