Optimize test page
This commit is contained in:
		
							
								
								
									
										337
									
								
								scripts/test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										337
									
								
								scripts/test.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,337 @@
 | 
			
		||||
let canvas = document.getElementById("canvas"); 
 | 
			
		||||
let ctx = canvas.getContext("2d");
 | 
			
		||||
 | 
			
		||||
//Функция изменения размера полотна
 | 
			
		||||
let menu = document.getElementById('menu'); 
 | 
			
		||||
let resizeTimeout;
 | 
			
		||||
function Resize() {
 | 
			
		||||
	clearTimeout(resizeTimeout);
 | 
			
		||||
	resizeTimeout = setTimeout(() => {
 | 
			
		||||
		canvas.width = window.innerWidth - 20;
 | 
			
		||||
		canvas.height = window.innerHeight - 30 - menu.clientHeight;
 | 
			
		||||
	}, 100);
 | 
			
		||||
}
 | 
			
		||||
window.addEventListener("load", Resize, false);
 | 
			
		||||
window.addEventListener("resize", Resize, false);
 | 
			
		||||
 | 
			
		||||
//Флаги для теста
 | 
			
		||||
let chkText   = document.getElementById('PText');
 | 
			
		||||
let chkData   = document.getElementById('DefData');
 | 
			
		||||
let chkRotate = document.getElementById('Rotate');
 | 
			
		||||
let chkloop   = document.getElementById('ChkLoop');
 | 
			
		||||
//Глобальные параметры для теста
 | 
			
		||||
const columnHeightBase = 200;
 | 
			
		||||
const columnWidthBase = 40;
 | 
			
		||||
const rectHeightBase = 40;
 | 
			
		||||
const rectWidthBase = 70;
 | 
			
		||||
 | 
			
		||||
const elementSpacing = 5;
 | 
			
		||||
 | 
			
		||||
//Функция проверки столбцов процесса
 | 
			
		||||
let but1 = document.getElementById('TestPercent'); 
 | 
			
		||||
but1.onclick = function () {
 | 
			
		||||
	ctx.clearRect(0, 0, canvas.width, canvas.height);
 | 
			
		||||
 | 
			
		||||
	let height = columnHeightBase;
 | 
			
		||||
	let width = columnWidthBase;
 | 
			
		||||
 | 
			
		||||
	if (chkRotate.checked){
 | 
			
		||||
		[height, width] = [width, height];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const maxColumnsX = Math.floor((canvas.width - 1) / (width + elementSpacing))
 | 
			
		||||
	const maxColumnsY = Math.floor((canvas.height - 1) / (height + elementSpacing))
 | 
			
		||||
	
 | 
			
		||||
	for (let i = 0; i < maxColumnsX; i++) {
 | 
			
		||||
		for (let j = 0; j < maxColumnsY; j++) {
 | 
			
		||||
			const x = (i * (width + elementSpacing)) + 0.5;
 | 
			
		||||
			const y = (j * (height + elementSpacing)) + 0.5;
 | 
			
		||||
			
 | 
			
		||||
			const t = new PercentColumn(x, y, width, height);
 | 
			
		||||
			if (!chkData.checked){
 | 
			
		||||
				t.Color(getRColor());
 | 
			
		||||
			}
 | 
			
		||||
			t.Percent(Math.random() * 101);
 | 
			
		||||
			t.Rotate(chkRotate.checked);
 | 
			
		||||
			t.Print(ctx);
 | 
			
		||||
			if (chkText.checked){
 | 
			
		||||
				t.PrintText(ctx);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//Функция проверки столбцов статусов
 | 
			
		||||
let but2 = document.getElementById('TestProcess'); 
 | 
			
		||||
but2.onclick = function () {
 | 
			
		||||
	ctx.clearRect(0, 0, canvas.width, canvas.height);
 | 
			
		||||
	
 | 
			
		||||
	let height = columnHeightBase;
 | 
			
		||||
	let width = columnWidthBase;
 | 
			
		||||
	
 | 
			
		||||
	if (chkData.checked){
 | 
			
		||||
		height *= 2;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (chkRotate.checked){
 | 
			
		||||
		[height, width] = [width, height];
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	const count = Math.floor(Math.random() * 6 + 2);
 | 
			
		||||
	const arrPoint = Array.from({ length: count }, () => Math.random() * 5 + 1);
 | 
			
		||||
	const arrColor = Array.from({ length: count }, () => getRColor());
 | 
			
		||||
	
 | 
			
		||||
	const maxColumnsX = Math.floor((canvas.width - 1) / (width + elementSpacing))
 | 
			
		||||
	const maxColumnsY = Math.floor((canvas.height - 1) / (height + elementSpacing))
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
	for (let i = 0; i < maxColumnsX; i++) {
 | 
			
		||||
		for (let j = 0; j < maxColumnsY; j++) {
 | 
			
		||||
			const x = (i * (width + elementSpacing)) + 0.5;
 | 
			
		||||
			const y = (j * (height + elementSpacing)) + 0.5;
 | 
			
		||||
			
 | 
			
		||||
			const t = new ProcessColumn(x, y, width, height);
 | 
			
		||||
			t.Rotate(chkRotate.checked);
 | 
			
		||||
			if (chkData.checked){
 | 
			
		||||
				t.BuildDefault();
 | 
			
		||||
			} else {
 | 
			
		||||
				for (let k = 0; k < count; k++) {
 | 
			
		||||
					t.AddRStat(k, arrPoint[k], arrColor[k]);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			t.Status(Math.floor(Math.random() * (t.StatCount() + 1) - 1));
 | 
			
		||||
			t.Percent(Math.random() * 101);
 | 
			
		||||
			t.Print(ctx);
 | 
			
		||||
			if (chkText.checked) {
 | 
			
		||||
				t.PrintText(ctx);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//Функция проверки мигалки
 | 
			
		||||
let but3 = document.getElementById('TestBlinkStatus');
 | 
			
		||||
but3.onclick = function () {
 | 
			
		||||
	ctx.clearRect(0, 0, canvas.width, canvas.height);
 | 
			
		||||
 | 
			
		||||
	let height = rectHeightBase;
 | 
			
		||||
	let width = rectWidthBase;
 | 
			
		||||
 | 
			
		||||
	if (chkRotate.checked){
 | 
			
		||||
		[height, width] = [width, height];
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const count = Math.floor(Math.random() * 5 + 1);
 | 
			
		||||
	const arrColor = Array.from({ length: count }, () => getRColor());
 | 
			
		||||
 | 
			
		||||
	const maxColumnsX = Math.floor((canvas.width - 1) / (width + elementSpacing));
 | 
			
		||||
	const maxColumnsY = Math.floor((canvas.height - 1) / (height + elementSpacing));
 | 
			
		||||
 | 
			
		||||
	for (let i = 0; i < maxColumnsX; i++) {
 | 
			
		||||
		for (let j = 0; j < maxColumnsY; j++) {
 | 
			
		||||
			const x = (i * (width + elementSpacing)) + 0.5;
 | 
			
		||||
			const y = (j * (height + elementSpacing)) + 0.5;
 | 
			
		||||
			
 | 
			
		||||
			const t = new BlinkStatus( x, y, width, height);
 | 
			
		||||
			t.Rotate(chkRotate.checked);
 | 
			
		||||
			if (chkData.checked) {
 | 
			
		||||
				t.BuildDefault();
 | 
			
		||||
			} else {
 | 
			
		||||
				for (let k = 0; k < count; k++) {
 | 
			
		||||
					t.AddStatus(k, arrColor[k]);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			t.Status(Math.floor(Math.random() * (t.StatCount() + 1) - 1));
 | 
			
		||||
			t.Print(ctx);
 | 
			
		||||
			if (chkText.checked) {
 | 
			
		||||
				t.PrintText(ctx);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//Функция проверки номера
 | 
			
		||||
let but4 = document.getElementById('TestNumberColumn');
 | 
			
		||||
but4.onclick = function () {
 | 
			
		||||
	ctx.clearRect(0, 0, canvas.width, canvas.height);
 | 
			
		||||
	
 | 
			
		||||
	let height = rectHeightBase;
 | 
			
		||||
	let width = rectWidthBase;
 | 
			
		||||
 | 
			
		||||
	if (chkRotate.checked){
 | 
			
		||||
		[height, width] = [width, height];
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	const maxColumnsX = Math.floor((canvas.width - 1) / (width + elementSpacing));
 | 
			
		||||
	const maxColumnsY = Math.floor((canvas.height - 1) / (height + elementSpacing));
 | 
			
		||||
	
 | 
			
		||||
	let num = 0;
 | 
			
		||||
	for (var i = 0; i < maxColumnsX; i++) {
 | 
			
		||||
		for (var j = 0; j < maxColumnsY; j++) {
 | 
			
		||||
			const x = (i * (width + elementSpacing)) + 0.5;
 | 
			
		||||
			const y = (j * (height + elementSpacing)) + 0.5;
 | 
			
		||||
			const t = new NumberColumn(x, y, width, height, num++);
 | 
			
		||||
			t.Rotate(chkRotate.checked);
 | 
			
		||||
			t.Prostoy(Math.random() < 0.5);
 | 
			
		||||
			t.Print(ctx);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
//Переменные для диаграммы
 | 
			
		||||
let cycle;
 | 
			
		||||
let diagTest;
 | 
			
		||||
//Функция цикла
 | 
			
		||||
function cycle_print() {
 | 
			
		||||
	diagTest.RectParam(0.5, 0.5, canvas.width - 1, canvas.height - 1)
 | 
			
		||||
	diagTest.Print(ctx);
 | 
			
		||||
	if (chkText.checked) {
 | 
			
		||||
		diagTest.PrintText(ctx);
 | 
			
		||||
	}
 | 
			
		||||
	if (diagTest.Cycle()) {
 | 
			
		||||
		cycle = setTimeout(cycle_print, 1000);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
let but5 = document.getElementById('TestDiagramStove');
 | 
			
		||||
but5.onclick = function () {
 | 
			
		||||
	ctx.clearRect(0, 0, canvas.width, canvas.height);
 | 
			
		||||
	diagTest = new Diagram(0.5, 0.5, canvas.width - 1, canvas.height - 1);	
 | 
			
		||||
 | 
			
		||||
	if (chkData.checked) {
 | 
			
		||||
		diagTest.BuildDefault();
 | 
			
		||||
		for (let i = 0; i < diagTest.ProcCount(); i++) {
 | 
			
		||||
			diagTest.ChangeStatProc(i,
 | 
			
		||||
				Math.floor(Math.random() * 11),
 | 
			
		||||
				Math.floor(Math.random() * 101));
 | 
			
		||||
			diagTest.ChangeStatBlink(i, Math.floor(Math.random() * 5 - 1));
 | 
			
		||||
			diagTest.ChangeStatNumb(i, Math.random() < 0.5);
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		const countStove = Math.floor(Math.random() * 20 + 30);
 | 
			
		||||
		const countProc = Math.floor(Math.random() * 9 + 1);
 | 
			
		||||
		const countBlink = Math.floor(Math.random() * 4 + 1);
 | 
			
		||||
 | 
			
		||||
		const colorProc = Array.from({ length: countProc }, () => getRColor());
 | 
			
		||||
		const pointProc = Array.from({ length: countProc }, () => Math.random() * 10);
 | 
			
		||||
		const colorBlink = Array.from({ length: countBlink }, () => getRColor());
 | 
			
		||||
 | 
			
		||||
		for (let i = 0; i < countStove; i++) {
 | 
			
		||||
			const tP = new ProcessColumn(0, 0, 0, 0);
 | 
			
		||||
			for (let k = 0; k < countProc; k++) {
 | 
			
		||||
				tP.AddRStat(k, pointProc[k], colorProc[k]);
 | 
			
		||||
			}
 | 
			
		||||
			tP.Status(Math.floor(Math.random() * countProc));
 | 
			
		||||
			tP.Percent(Math.floor(Math.random() * 101));
 | 
			
		||||
			
 | 
			
		||||
			const tB = new BlinkStatus(0, 0, 0, 0);
 | 
			
		||||
			for (let k = 0; k < countBlink; k++) {
 | 
			
		||||
				tB.AddStatus(k, colorBlink[k]);
 | 
			
		||||
			}
 | 
			
		||||
			tB.Status(Math.floor(Math.random() * (countBlink + 1) -1));
 | 
			
		||||
 | 
			
		||||
			const tN = new NumberColumn(0, 0, 0, 0, i + 1);
 | 
			
		||||
			tN.Prostoy(Math.random() < 0.5);
 | 
			
		||||
 | 
			
		||||
			diagTest.AddProc(i, tP, tB, tN);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	diagTest.Rotate(chkRotate.checked);
 | 
			
		||||
 | 
			
		||||
	if (chkloop.checked) {
 | 
			
		||||
		for (let i = 0; i < diagTest.ProcCount(); i++) {
 | 
			
		||||
			const dStart = new Date();
 | 
			
		||||
			const dEnd = new Date();
 | 
			
		||||
			dStart.setSeconds(dStart.getSeconds() + Math.floor(Math.random() * 61 - 50));
 | 
			
		||||
			dEnd.setSeconds(dEnd.getSeconds() + Math.floor(Math.random() * 61 - 10));
 | 
			
		||||
			diagTest.StartDate(i, dStart);
 | 
			
		||||
			diagTest.EndDate(i, dEnd);
 | 
			
		||||
		}
 | 
			
		||||
		diagTest.Cycle(true);
 | 
			
		||||
		cycle_print();
 | 
			
		||||
	} else {
 | 
			
		||||
		diagTest.Print(ctx);
 | 
			
		||||
		if (chkText.checked) {
 | 
			
		||||
			diagTest.PrintText(ctx);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
let but6 = document.getElementById('TestPost');
 | 
			
		||||
let btn6CycleSend;
 | 
			
		||||
 | 
			
		||||
but6.onclick = function () {
 | 
			
		||||
	sendCycleData();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function sendCycleData() {
 | 
			
		||||
	const url = `${window.location.origin}/currcycles`;
 | 
			
		||||
	fetch(url, {
 | 
			
		||||
		method: 'POST',
 | 
			
		||||
	})
 | 
			
		||||
	.then(response => {
 | 
			
		||||
		if (!response.ok) {
 | 
			
		||||
			throw new Error(`${response.status}: ${response.statusText}`);
 | 
			
		||||
		}
 | 
			
		||||
		return response.text();
 | 
			
		||||
	})
 | 
			
		||||
	.then(data => {
 | 
			
		||||
		PrintDiagram(data);
 | 
			
		||||
		handleLoop();
 | 
			
		||||
	})
 | 
			
		||||
	.catch(error => {
 | 
			
		||||
		alert(error.message);
 | 
			
		||||
	});
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function handleLoop() {
 | 
			
		||||
	but6.disabled = chkloop.checked;
 | 
			
		||||
	if (but6.disabled) {
 | 
			
		||||
		btn6CycleSend = setTimeout(sendCycleData, 60000);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function PrintDiagram(pechstatus) {
 | 
			
		||||
	const Pech = JSON.parse(pechstatus);
 | 
			
		||||
	ctx.clearRect(0, 0, canvas.width, canvas.height);
 | 
			
		||||
	cpnst t = new Diagram(0.5, 0.5, canvas.width - 1, canvas.height - 1);
 | 
			
		||||
	t.BuildDefault();
 | 
			
		||||
	t.Rotate(chkRotate.checked);
 | 
			
		||||
 | 
			
		||||
	const cycleMapping = {
 | 
			
		||||
		0: { s: 0, b: -1 },
 | 
			
		||||
		1: { s: 0, b: 1 },
 | 
			
		||||
		2: { s: 1, b: 0 },
 | 
			
		||||
		5: { s: 2, b: 0 },
 | 
			
		||||
		6: { s: 3, b: 0 },
 | 
			
		||||
		7: { s: 4, b: 0 },
 | 
			
		||||
		8: { s: 5, b: 3 },
 | 
			
		||||
		9: { s: 6, b: 3 },
 | 
			
		||||
		10: { s: 7, b: 3 },
 | 
			
		||||
		11: { s: 8, b: 3 },
 | 
			
		||||
		12: { s: 9, b: 3 },
 | 
			
		||||
		14: { s: 1, b: 1 },
 | 
			
		||||
		15: { s: 2, b: 1 },
 | 
			
		||||
		16: { s: 3, b: 1 },
 | 
			
		||||
	};
 | 
			
		||||
	
 | 
			
		||||
	for(const key in Pech.data) {
 | 
			
		||||
		const idx = Pech.data[key].vdp - 1;
 | 
			
		||||
		const cycleInfo = cycleMapping[Pech.data[key].cycle] || { s: 0, b: -1 };
 | 
			
		||||
 | 
			
		||||
		t.ChangeStatProc(idx, cycleInfo.s, 0);
 | 
			
		||||
		t.ChangeStatBlink(idx, cycleInfo.b);
 | 
			
		||||
		t.StartDate(idx, new Date(Pech.data[key].factStart));
 | 
			
		||||
		t.EndDate(idx, new Date(Pech.data[key].thinkEnd));
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	t.Print(ctx);
 | 
			
		||||
	if (chkText.checked) {
 | 
			
		||||
		t.PrintText(ctx);
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
function getRColor() {
 | 
			
		||||
	const letters = '0123456789ABCDEF';
 | 
			
		||||
	const color = '#' + Array.from({ length: 6 }, () => letters[Math.floor(Math.random() * 16)]).join('');
 | 
			
		||||
	return color;
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user