Added speedtest.
This commit is contained in:
		
							parent
							
								
									a4e67b9434
								
							
						
					
					
						commit
						3585325fad
					
				
							
								
								
									
										61
									
								
								speedtest/index.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								speedtest/index.php
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,61 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="no"> | ||||
| <head> | ||||
|   <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> | ||||
|   <meta charset="UTF-8"> | ||||
|   <meta name="theme-color" content="#263238"/> | ||||
|   <link rel="icon" type="image/png" href="/dist/favicon.png"> | ||||
|   <link rel="stylesheet" href="../common/main.css"> | ||||
|    | ||||
|   <link rel="stylesheet" href="ui.css"> | ||||
|   <script type="text/javascript" src="./librespeed/speedtest.js"></script> | ||||
|   <script type="text/javascript" src="ui.js"></script> | ||||
|   <script type="text/javascript"></script> | ||||
| </head> | ||||
| <body class="theme-auto"> | ||||
| 
 | ||||
|   <?php include "../common/header.html"; ?>
 | ||||
| 
 | ||||
| <center> | ||||
| 
 | ||||
| <div class="cont"> | ||||
| 
 | ||||
| 	<button id="startStopBtn" onclick="startStop()"></button> | ||||
| 	<div id="test"> | ||||
|         <div class="testGroup"> | ||||
| 			<div class="testArea2"> | ||||
| 				<div class="testName">Ping</div> | ||||
| 				<div id="pingText" class="meterText" style="color:#AA6060"></div> | ||||
| 				<div class="unit">ms</div> | ||||
| 			</div> | ||||
| 			<div class="testArea2"> | ||||
| 				<div class="testName">Jitter</div> | ||||
| 				<div id="jitText" class="meterText" style="color:#AA6060"></div> | ||||
| 				<div class="unit">ms</div> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 		<div class="testGroup"> | ||||
| 			<div class="testArea"> | ||||
| 				<div class="testName">Download</div> | ||||
| 				<canvas id="dlMeter" class="meter"></canvas> | ||||
| 				<div id="dlText" class="meterText"></div> | ||||
| 				<div class="unit">Mbps</div> | ||||
| 			</div> | ||||
| 			<div class="testArea"> | ||||
| 				<div class="testName">Upload</div> | ||||
| 				<canvas id="ulMeter" class="meter"></canvas> | ||||
| 				<div id="ulText" class="meterText"></div> | ||||
| 				<div class="unit">Mbps</div> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 		<div id="ipArea"> | ||||
| 			<span id="ip"></span> | ||||
| 		</div> | ||||
| 	</div> | ||||
| 	<a href="https://github.com/librespeed/speedtest">Source code</a> | ||||
| 
 | ||||
| </div> | ||||
| </center> | ||||
| <script type="text/javascript">setTimeout(function(){initUI()},100);</script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										74
									
								
								speedtest/ui.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								speedtest/ui.css
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,74 @@ | ||||
| 	#startStopBtn:before{ | ||||
| 		content:"Start"; | ||||
| 	} | ||||
| 	#startStopBtn.running:before{ | ||||
| 		content:"Abort"; | ||||
| 	}	 | ||||
| 	#test{ | ||||
| 		margin-top:2em; | ||||
| 		margin-bottom:12em; | ||||
| 	} | ||||
| 	div.testArea{ | ||||
| 		display:inline-block; | ||||
| 		width:16em; | ||||
| 		height:12.5em; | ||||
| 		position:relative; | ||||
| 		box-sizing:border-box; | ||||
| 	} | ||||
| 	div.testArea2{ | ||||
| 		display:inline-block; | ||||
| 		width:14em; | ||||
| 		height:7em; | ||||
| 		position:relative; | ||||
| 		box-sizing:border-box; | ||||
| 		text-align:center; | ||||
| 	} | ||||
| 	div.testArea div.testName{ | ||||
| 		position:absolute; | ||||
| 		top:0.1em; left:0; | ||||
| 		width:100%; | ||||
| 		font-size:1.4em; | ||||
| 		z-index:9; | ||||
| 	} | ||||
| 	div.testArea2 div.testName{ | ||||
|         display:block; | ||||
|         text-align:center; | ||||
|         font-size:1.4em; | ||||
| 	} | ||||
| 	div.testArea div.meterText{ | ||||
| 		position:absolute; | ||||
| 		bottom:1.55em; left:0; | ||||
| 		width:100%; | ||||
| 		font-size:2.5em; | ||||
| 		z-index:9; | ||||
| 	} | ||||
| 	div.testArea2 div.meterText{ | ||||
|         display:inline-block; | ||||
|         font-size:2.5em; | ||||
| 	} | ||||
| 	div.meterText:empty:before{ | ||||
| 		content:"0.00"; | ||||
| 	} | ||||
| 	div.testArea div.unit{ | ||||
| 		position:absolute; | ||||
| 		bottom:2em; left:0; | ||||
| 		width:100%; | ||||
| 		z-index:9; | ||||
| 	} | ||||
| 	div.testArea2 div.unit{ | ||||
| 		display:inline-block; | ||||
| 	} | ||||
| 	div.testArea canvas{ | ||||
| 		position:absolute; | ||||
| 		top:0; left:0; width:100%; height:100%; | ||||
| 		z-index:1; | ||||
| 	} | ||||
| 	div.testGroup{ | ||||
| 		display:block; | ||||
|         margin: 0 auto; | ||||
| 	} | ||||
| 	@media all and (max-width:40em){ | ||||
| 		body{ | ||||
| 			font-size:0.8em; | ||||
| 		} | ||||
| 	} | ||||
							
								
								
									
										101
									
								
								speedtest/ui.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										101
									
								
								speedtest/ui.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,101 @@ | ||||
| function I(i){return document.getElementById(i);} | ||||
| //INITIALIZE SPEEDTEST
 | ||||
| var s=new Speedtest(); //create speedtest object
 | ||||
| 
 | ||||
| var meterBk=/Trident.*rv:(\d+\.\d+)/i.test(navigator.userAgent)?"#EAEAEA":"#80808040"; | ||||
| var dlColor="#6060AA", | ||||
| 	ulColor="#616161"; | ||||
| var progColor=meterBk; | ||||
| 
 | ||||
| //CODE FOR GAUGES
 | ||||
| function drawMeter(c,amount,bk,fg,progress,prog){ | ||||
| 	var ctx=c.getContext("2d"); | ||||
| 	var dp=window.devicePixelRatio||1; | ||||
| 	var cw=c.clientWidth*dp, ch=c.clientHeight*dp; | ||||
| 	var sizScale=ch*0.0055; | ||||
| 	if(c.width==cw&&c.height==ch){ | ||||
| 		ctx.clearRect(0,0,cw,ch); | ||||
| 	}else{ | ||||
| 		c.width=cw; | ||||
| 		c.height=ch; | ||||
| 	} | ||||
| 	ctx.beginPath(); | ||||
| 	ctx.strokeStyle=bk; | ||||
| 	ctx.lineWidth=12*sizScale; | ||||
| 	ctx.arc(c.width/2,c.height-58*sizScale,c.height/1.8-ctx.lineWidth,-Math.PI*1.1,Math.PI*0.1); | ||||
| 	ctx.stroke(); | ||||
| 	ctx.beginPath(); | ||||
| 	ctx.strokeStyle=fg; | ||||
| 	ctx.lineWidth=12*sizScale; | ||||
| 	ctx.arc(c.width/2,c.height-58*sizScale,c.height/1.8-ctx.lineWidth,-Math.PI*1.1,amount*Math.PI*1.2-Math.PI*1.1); | ||||
| 	ctx.stroke(); | ||||
| 	if(typeof progress !== "undefined"){ | ||||
| 		ctx.fillStyle=prog; | ||||
| 		ctx.fillRect(c.width*0.3,c.height-16*sizScale,c.width*0.4*progress,4*sizScale); | ||||
| 	} | ||||
| } | ||||
| function mbpsToAmount(s){ | ||||
| 	return 1-(1/(Math.pow(1.3,Math.sqrt(s)))); | ||||
| } | ||||
| function format(d){ | ||||
|     d=Number(d); | ||||
|     if(d<10) return d.toFixed(2); | ||||
|     if(d<100) return d.toFixed(1); | ||||
|     return d.toFixed(0); | ||||
| } | ||||
| 
 | ||||
| //UI CODE
 | ||||
| var uiData=null; | ||||
| function startStop(){ | ||||
|     if(s.getState()==3){ | ||||
| 		//speedtest is running, abort
 | ||||
| 		s.abort(); | ||||
| 		data=null; | ||||
| 		I("startStopBtn").className=""; | ||||
| 		initUI(); | ||||
| 	}else{ | ||||
| 		//test is not running, begin
 | ||||
| 		I("startStopBtn").className="running"; | ||||
| 		s.onupdate=function(data){ | ||||
|             uiData=data; | ||||
| 		}; | ||||
| 		s.onend=function(aborted){ | ||||
|             I("startStopBtn").className=""; | ||||
|             updateUI(true); | ||||
| 		}; | ||||
| 		s.start(); | ||||
| 	} | ||||
| } | ||||
| //this function reads the data sent back by the test and updates the UI
 | ||||
| function updateUI(forced){ | ||||
| 	if(!forced&&s.getState()!=3) return; | ||||
| 	if(uiData==null) return; | ||||
| 	var status=uiData.testState; | ||||
| 	I("ip").textContent=uiData.clientIp; | ||||
| 	I("dlText").textContent=(status==1&&uiData.dlStatus==0)?"...":format(uiData.dlStatus); | ||||
| 	drawMeter(I("dlMeter"),mbpsToAmount(Number(uiData.dlStatus*(status==1?oscillate():1))),meterBk,dlColor,Number(uiData.dlProgress),progColor); | ||||
| 	I("ulText").textContent=(status==3&&uiData.ulStatus==0)?"...":format(uiData.ulStatus); | ||||
| 	drawMeter(I("ulMeter"),mbpsToAmount(Number(uiData.ulStatus*(status==3?oscillate():1))),meterBk,ulColor,Number(uiData.ulProgress),progColor); | ||||
| 	I("pingText").textContent=format(uiData.pingStatus); | ||||
| 	I("jitText").textContent=format(uiData.jitterStatus); | ||||
| } | ||||
| function oscillate(){ | ||||
| 	return 1+0.02*Math.sin(Date.now()/100); | ||||
| } | ||||
| //update the UI every frame
 | ||||
| window.requestAnimationFrame=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.msRequestAnimationFrame||(function(callback,element){setTimeout(callback,1000/60);}); | ||||
| function frame(){ | ||||
| 	requestAnimationFrame(frame); | ||||
| 	updateUI(); | ||||
| } | ||||
| frame(); //start frame loop
 | ||||
| //function to (re)initialize UI
 | ||||
| function initUI(){ | ||||
| 	drawMeter(I("dlMeter"),0,meterBk,dlColor,0); | ||||
| 	drawMeter(I("ulMeter"),0,meterBk,ulColor,0); | ||||
| 	I("dlText").textContent=""; | ||||
| 	I("ulText").textContent=""; | ||||
| 	I("pingText").textContent=""; | ||||
| 	I("jitText").textContent=""; | ||||
| 	I("ip").textContent=""; | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user