| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 | 
							- /**
 
-  * 跳判断相关脚本代码
 
-  */
 
- function Event() {
 
- 	this.events = {};
 
- }
 
- Event.prototype.addEventListener = function (type, listener) {
 
- 	this.events[type] = this.events[type] || [];
 
- 	this.events[type].push(listener);
 
- };
 
- Event.prototype.trigger = function () {
 
- 	for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
 
- 		args[_key] = arguments[_key];
 
- 	}
 
- 	var type = args[0];
 
- 	var params = args.slice(1);
 
- 	if (!!this.events[type]) {
 
- 		// console.log("type:",type);
 
- 		this.events[type].forEach(function (listener) {
 
- 			try {
 
- 				listener.apply(null, params);
 
- 			} catch (e) {
 
- 				console.error(e);
 
- 			}
 
- 		});
 
- 	}
 
- };
 
- /**
 
-  * 公共部分计算参数
 
-  * 已时间为条件执行
 
-  */
 
- var jumpOpts = {
 
- 	//是否上升的标志位
 
- 	isDirectionUp: false,
 
- 	//持续上升次数
 
- 	continueUpCount: 0,
 
- 	//上一点的持续上升的次数,为了记录波峰的上升次数
 
- 	continueUpFormerCount: 0,
 
- 	continueDownCount: 0,
 
- 	continueDownFormerCount: 0,
 
- 	//上一点的状态,上升还是下降
 
- 	lastStatus: false,
 
- 	//波峰值
 
- 	peakOfWave: 0,
 
- 	//波谷值
 
- 	valleyOfWave: 0,
 
- 	//检测到极快的波动的次数
 
- 	timeOfPeakCount: 0,
 
- 	//开始添加
 
- 	bUpdateTimeOfPeakCount: false,
 
- 	//开始更新的次数
 
- 	startCount: 0,
 
- 	//停止跳
 
- 	bStopJump: false,
 
- 	//上次传感器的值
 
- 	gravityOld: 0,
 
- 	bUpState: false,
 
- 	//开始时间
 
- 	startTime: 0,
 
- 	endTime: 0,
 
- 	startResultant: 0
 
- }
 
- var ActionJump = function ActionJump() {
 
- 	this.jumpOpts = jumpOpts;
 
- 	this.peakOfWaveMaxValue = 0;
 
- 	this.peakOfWaveMaxValueCount = 0;
 
- 	this.valleyOfWaveMinValue = 0;
 
- 	this.valleyOfWaveMinValueCount = 0;
 
- 	this.highestCount = 0;
 
- 	//记录当前传入的数据
 
- 	this.dataArray = [];
 
- 	//获取一个判断数组的数据,比如触发点前后取一定帧数
 
- 	//记录波形的个数,可重复添加
 
- 	this.tempDataArray = [];
 
- 	//记录一个加速计数组
 
- 	this.oriAccArray = [];
 
- 	//陀螺仪
 
- 	this.oriGyroYArray = [];
 
- 	this.event = new Event();
 
- 	this.frameCapacity = 10;
 
- 	this.frame = [];
 
- 	this.frameLength = 5;
 
- 	this.frameOffset = 0;
 
- 	for (var i = 0; i < this.frameCapacity; ++i) {
 
- 		var o = new Object();
 
- 		o.maxValue = 0;
 
- 		o.gyroValue = 0;
 
- 		o.resultant = 0;
 
- 		o.index = -1;
 
- 		o.acc = null;
 
- 		o.gyro = null;
 
- 		this.frame.push(o);
 
- 	}
 
- 	this.frameLog = [];
 
- 	this.LastMS = 0;
 
- 	this.LastTime = 0;
 
- 	this.xA = 0;
 
- 	this.yA = 0;
 
- 	this.zA = 0;
 
- }
 
- ActionJump.prototype.addEventListener = function (type, listener) {
 
- 	this.event.addEventListener(type, listener);
 
- };
 
- /**
 
-  * 更新数据
 
-  */
 
- ActionJump.prototype.updateJump = function () {
 
- 	let data = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
 
- 	//使用三个轴的数据,计算重力轴的加速度。最后减去重力的加速度值
 
- 	/**
 
- 	 * 纠正后使用的轴向
 
- 	 * 	box["acc"] = {
 
- 				ax: -ay,
 
- 				ay: -ax,
 
- 				az: az
 
- 			};
 
- 			box["gyro"] = {
 
- 				gx: -gy,
 
- 				gy: -gx,
 
- 				gz: gz
 
- 			};
 
- 	 */
 
- 	//********加速计********
 
- 	// let {
 
- 	// 	lAccX,
 
- 	// 	lAccY,
 
- 	// 	lAccZ
 
- 	// } = data.linearAcc;
 
- 	// let {
 
- 	// 	oAccX,
 
- 	// 	oAccY,
 
- 	// 	oAccZ
 
- 	// } = data.oriAcc;
 
- 	// let {
 
- 	// 	oGyroX,
 
- 	// 	oGyroY,
 
- 	// 	oGyroZ
 
- 	// } = data.oriGyro;
 
- 	// let {
 
- 	// 	bYAxis
 
- 	// } = data;
 
- 	// //oGyroX 在用的过程中方向相反,所以添加负号
 
- 	// let _tempAxisData = bYAxis ? -oGyroX : oGyroY; //新设备直接使用oGyroY
 
- 	// this.detectorNewStep(data.resultant, lAccX, lAccY, lAccZ, oAccX, oAccY, oAccZ, data.runIndex, _tempAxisData);
 
- 	// oAccZ
 
- 	// this.detectorNewStep(data.resultant, -lAccY, -lAccX, -lAccZ, -oAccY, -oAccX, -oAccZ, data.runIndex,
 
- 	// 	_tempAxisData);
 
- 	//********传感器数值********
 
- 	let { ax, ay, az } = data.acc;
 
- 	let { gx, gy, gz } = data.gyro;
 
- 	let { min, s, ms } = data;
 
- 	let msGap = ms - this.LastMS;
 
- 	if (msGap < 0) {
 
- 		msGap += 1000;
 
- 	}
 
- 	this.LastMS = ms;
 
- 	let _ax = data.acc.ax * 10;
 
- 	let _ay = data.acc.ay * 10;
 
- 	let _az = data.acc.az * 10;
 
- 	//低通滤波分离重力
 
- 	let curTime = new Date().getTime();
 
- 	let alpha = 1000 / (1000 + msGap); // 0.8;
 
- 	this.LastTime = curTime;
 
- 	this.xA = alpha * this.xA + (1 - alpha) * _ax;
 
- 	this.yA = alpha * this.yA + (1 - alpha) * _ay;
 
- 	this.zA = alpha * this.zA + (1 - alpha) * _az;
 
- 	//高通滤波获取线性速度
 
- 	let linear_acceleration_x = _ax - this.xA;
 
- 	let linear_acceleration_y = _ay - this.yA;
 
- 	let linear_acceleration_z = _az - this.zA;
 
- 	let _temp = {
 
- 		oriAcc: {
 
- 			oAccX: _ax,
 
- 			oAccY: _ay,
 
- 			oAccZ: _az
 
- 		},
 
- 		linearAcc: {
 
- 			lAccX: linear_acceleration_x,
 
- 			lAccY: linear_acceleration_y,
 
- 			lAccZ: linear_acceleration_z
 
- 		},
 
- 		gravityAcc: {
 
- 			gravityX: this.xA,
 
- 			gravityY: this.yA,
 
- 			gravityZ: this.zA
 
- 		},
 
- 		bLimitRebound: false,
 
- 		resultant: Math.sqrt(_ax * _ax
 
- 			+ _ay * _ay + _az * _az),
 
- 		runIndex: data.BLEAccIndex,
 
- 		//陀螺仪
 
- 		oriGyro: {
 
- 			oGyroX: gx,
 
- 			oGyroY: gy,
 
- 			oGyroZ: gz
 
- 		},
 
- 		bYAxis: data.isY
 
- 	};
 
- 	this.detectorNewStep(_temp);
 
- };
 
- /*
 
-  *计算跳逻辑
 
-  */
 
- // ActionJump.prototype.detectorNewStep = function(resultant, linearX, linearY, linearZ, oriX, oriY, oriZ, _runIndex,
 
- // 	_oGyroY) 
 
- ActionJump.prototype.detectorNewStep = function (data) {
 
- 	/**
 
- 	 * 把數據返回
 
- 	 */
 
- 	this.event.trigger('resultant', {
 
- 		type: "bUpdateDraw",
 
- 		data: data
 
- 	});
 
- 	let {
 
- 		oAccX,
 
- 		oAccY,
 
- 		oAccZ
 
- 	} = data.oriAcc;
 
- 	let {
 
- 		oGyroX,
 
- 		oGyroY,
 
- 		oGyroZ
 
- 	} = data.oriGyro;
 
- 	let resultant = data.resultant; //合加速度
 
- 	// 记录500个点
 
- 	// 如果超过了,去除第一个点,加入最后一个元素
 
- 	if (this.dataArray.length <= 500) {
 
- 		this.dataArray.push(data);
 
- 	} else {
 
- 		this.dataArray.shift();
 
- 		this.dataArray.push(data);
 
- 	}
 
- 	//判断resultant 一个阀值,简单的检测跳的动作触发幅度
 
- 	let limitResultant = 20;
 
- 	if (resultant > limitResultant && !this.jumpOpts.bUpState) {
 
- 		let currTime = new Date().getTime(); //当前时间
 
- 		// 清空触发的数值
 
- 		this.tempDataArray = [];
 
- 		let diffTime = currTime - this.jumpOpts.endTime; //当前时间减最初时间,得到当前时间差
 
- 		if (Math.abs(diffTime) < 100) {
 
- 			//前一帧到后一帧的间隔忽略 150 / 6 约25帧落地波动
 
- 			return;
 
- 		}
 
- 		this.jumpOpts.bUpState = true;
 
- 		//第一次触发的时间。记录开始时间
 
- 		this.jumpOpts.startTime = new Date().getTime();
 
- 		this.event.trigger('resultant', {
 
- 			type: "log",
 
- 			logType: 'normal',
 
- 			data: "开始时间:" + this.jumpOpts.startTime + ",resultant:" + resultant
 
- 		});
 
- 		//取触发前一定帧数
 
- 		let len = this.dataArray.length;
 
- 		let total = 5;//取倒数5帧
 
- 		if (len != 0) {
 
- 			let newArr = [];
 
- 			//长度超过
 
- 			let limit = len - total;
 
- 			if (limit > 0) {
 
- 				for (let i = len; i > limit; i--) {
 
- 					newArr.push(this.dataArray[i - 1]);
 
- 				}
 
- 				this.tempDataArray.push(newArr);
 
- 			} else {
 
- 				//直接添加数据
 
- 				this.tempDataArray.push(this.dataArray.slice());
 
- 			}
 
- 		}
 
- 		console.log("start bUpState");
 
- 	}
 
- 	if (this.jumpOpts.bUpState) {
 
- 		//取一个时间段为截取时间,计算时间段里面的数据
 
- 		let currTime = new Date().getTime(); //当前时间
 
- 		let diffTime = currTime - this.jumpOpts.startTime; //当前时间减最初时间,得到当前时间差
 
- 		if (diffTime > 400) {
 
- 			// console.log("diffTime:", diffTime);
 
- 			//计算已出发的数据
 
- 			// console.log(this.tempDataArray);
 
- 			for (let i = 0; i < this.tempDataArray.length; i++) {
 
- 				// 计算数据
 
- 				this.resetAll();
 
- 				let _frameMaxValue = 0,
 
- 					_frameMinValue = 0,
 
- 					_frameGyroValue = 0,
 
- 					_frameGyroMinValue = 0;
 
- 				for (let j = 0; j < this.tempDataArray[i].length; j++) {
 
- 					let _data = this.tempDataArray[i][j];
 
- 					if (j < 30) { //取前面30帧判断
 
- 						let _judgmentValue = _data.linearAcc.lAccZ //_data.oriAcc.oAccZ; //判断左右方向用z
 
- 						if (_judgmentValue > 1) {
 
- 							_frameMaxValue += _judgmentValue;
 
- 							if (_judgmentValue > this.peakOfWaveMaxValue) {
 
- 								this.peakOfWaveMaxValue += _judgmentValue;
 
- 								this.peakOfWaveMaxValueCount++;
 
- 							}
 
- 						} else if (_judgmentValue < -1) {
 
- 							_frameMinValue += _judgmentValue;
 
- 							if (_judgmentValue < this.valleyOfWaveMinValue) {
 
- 								this.valleyOfWaveMinValue += _judgmentValue;
 
- 								this.valleyOfWaveMinValueCount++;
 
- 							}
 
- 						}
 
- 						if (_data.oriGyro.oGyroY > 5) {
 
- 							_frameGyroValue += _data.oriGyro.oGyroY;
 
- 						} else if (_data.oriGyro.oGyroY < -5) {
 
- 							_frameGyroMinValue += _data.oriGyro.oGyroY;
 
- 						}
 
- 					}
 
- 				}
 
- 				//后面通用使用这个类型传输数据
 
- 				this.event.trigger('resultant', {
 
- 					type: "stateDataOfJump",
 
- 					currentMaxValue: _frameMaxValue,
 
- 					currentMinValue: _frameMinValue,
 
- 					peakOfWaveMaxValue: this.peakOfWaveMaxValue,
 
- 					valleyOfWaveMinValue: this.valleyOfWaveMinValue,
 
- 					oGyroValue: _frameGyroValue,
 
- 					oGyroMinValue: _frameGyroMinValue,
 
- 					// resultant: resultant,
 
- 					tempIndex: i, //触发了多少次
 
- 					// name: "highestCountEnd"
 
- 				});
 
- 				this.event.trigger('resultant', {
 
- 					type: "stop",
 
- 					tempDataArray: this.tempDataArray
 
- 				});
 
- 			}
 
- 			this.jumpOpts.bUpState = false;
 
- 			this.jumpOpts.endTime = new Date().getTime();
 
- 			console.log("end bUpState");
 
- 		} else {
 
- 			//还在计算时间区间内,记录各帧的数据
 
- 			for (let i = 0; i < this.tempDataArray.length; i++) {
 
- 				let _dataArray = this.tempDataArray[i];
 
- 				_dataArray.push(data);
 
- 			}
 
- 		}
 
- 	}
 
- }
 
- ActionJump.prototype.setEndUpdate = function () {
 
- 	for (let i = 0; i < this.tempDataArray.length; i++) {
 
- 		// 计算数据
 
- 		this.resetAll();
 
- 		let _frameMaxValue = 0,
 
- 			_frameMinValue = 0,
 
- 			_frameGyroValue = 0;
 
- 		for (let j = 0; j < this.tempDataArray[i].length; j++) {
 
- 			let _data = this.tempDataArray[i][j];
 
- 			let _judgmentValue = _data.oriAcc.oAccZ; //判断左右方向用z
 
- 			if (_judgmentValue > 1) {
 
- 				_frameMaxValue += _judgmentValue;
 
- 				if (_judgmentValue > this.peakOfWaveMaxValue) {
 
- 					this.peakOfWaveMaxValue += _judgmentValue;
 
- 					this.peakOfWaveMaxValueCount++;
 
- 				}
 
- 			} else if (_judgmentValue < -1) {
 
- 				_frameMinValue += _judgmentValue;
 
- 				if (_judgmentValue < this.valleyOfWaveMinValue) {
 
- 					this.valleyOfWaveMinValue += _judgmentValue;
 
- 					this.valleyOfWaveMinValueCount++;
 
- 				}
 
- 			}
 
- 			if (Math.abs(_data.oriGyro.oGyroY) > 5) {
 
- 				// this.oriGyroYArray.push(_oGyroY);
 
- 				_frameGyroValue += _data.oriGyro.oGyroY;
 
- 			}
 
- 		}
 
- 		//后面通用使用这个类型传输数据
 
- 		this.event.trigger('resultant', {
 
- 			type: "stateDataOfJump",
 
- 			currentMaxValue: _frameMaxValue,
 
- 			currentMinValue: _frameMinValue,
 
- 			peakOfWaveMaxValue: this.peakOfWaveMaxValue,
 
- 			valleyOfWaveMinValue: this.valleyOfWaveMinValue,
 
- 			oGyroValue: _frameGyroValue,
 
- 			// resultant: resultant,
 
- 			tempIndex: i, //触发了多少次
 
- 			// name: "highestCountEnd"
 
- 		});
 
- 		this.event.trigger('resultant', {
 
- 			type: "stop",
 
- 			arrayData: this.dataArray
 
- 		});
 
- 	}
 
- 	this.jumpOpts.bUpState = false;
 
- 	// 清空触发的数值
 
- 	this.tempDataArray = [];
 
- 	this.jumpOpts.endTime = new Date().getTime();
 
- 	console.log("end bUpState");
 
- }
 
- ActionJump.prototype.setBUpState = function (value) {
 
- 	this.jumpOpts.bUpState = value;
 
- }
 
- //重置对应的参数
 
- ActionJump.prototype.resetAll = function () {
 
- 	console.log("resetAll");
 
- 	this.peakOfWaveMaxValue = 0;
 
- 	this.peakOfWaveMaxValueCount = 0;
 
- 	this.valleyOfWaveMinValue = 0;
 
- 	this.valleyOfWaveMinValueCount = 0;
 
- }
 
- /**
 
-  * 日志
 
-  * @param {Object} data
 
-  * @param {Object} logType
 
-  */
 
- ActionJump.prototype.sendLog = function (data, logType) {
 
- 	this.event.trigger('resultant', {
 
- 		type: "log",
 
- 		logType: logType,
 
- 		data: data
 
- 	});
 
- }
 
- if (typeof module === "object" && typeof module.exports === "object") {
 
- 	module.exports = ActionJump;
 
- }
 
 
  |