You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

149 lines
3.5 KiB

const actModel = require('../func/actModel.js').actModel;
var liv = (zone, interface) => {
var o = {
id: 'liv',
num: 0,
numAct: 0,
MaxNum: 5,
state: false,
LastSwiTime: 0,
LastActTime: new Date().valueOf(),
MaxSensitTime: 1000 * 60 * 2,
extTime: 0,
isNight: false,
func: {
peopleIn: [],
peopleOut: [],
},
on: (event, handler)=>{
if(event == 'peopleIn'){
o.func.peopleIn.push(handler);
}
if(event == 'peopleOut'){
o.func.peopleOut.push(handler);
}
},
act: {
rate: 0,
maxDetectTime: 1000 * 60 * 25,
actTimeArray: []
}
};
var pLimiter = ()=>{
if(o.num < 0) o.num = 0;
if(o.num > o.MaxNum) o.num = o.MaxNum;
o.LastActTime = new Date().valueOf();
}
var pIn = ()=>{
o.num = 1;
pLimiter();
console.log(new Date().toTimeString() + ' - liv = ' + o.num + ' ++ ACT: '+o.act.rate);
o.func.peopleIn.forEach((item)=>{
item();
});
}
var pOut = ()=>{
o.num = 0;
pLimiter();
console.log(new Date().toTimeString() + ' - liv = ' + o.num + ' -- ACT: '+o.act.rate);
o.func.peopleOut.forEach((item)=>{
item();
});
}
/* 正常触发 */
interface.dl.on('forward', ()=>{
//pIn();
});
interface.dl.on('backward', ()=>{
//if(!o.isNight || o.num != 1 ) pOut();
})
/* 超时衰减 */
setInterval(()=>{
if( new Date().getHours() >= 19 && new Date().getHours() <= 21 ) o.isNight = true;
else o.isNight = false;
/*
let r = 0.3;
if(new Date().getHours() == 19) {
r = 0.1;
o.act.maxDetectTime = 1000 * 60 * 20;
}else if(new Date().getHours() == 20) {
r = 0.05;
o.act.maxDetectTime = 1000 * 60 * 30;
}else if(new Date().getHours() == 21) {
r = 0.05;
o.act.maxDetectTime = 1000 * 60 * 20;
}else{
r = 0.3;
o.act.maxDetectTime = 1000 * 60 * 20;
}
*/
if(o.act.rate > .35){
//if(!o.num) pIn();
}
if(o.act.rate < .001){
//if((o.num || o.state) && o.LastSwiTime < new Date().valueOf() - 1000*60*40) pOut();
}
o.extTime = ((o.num == 1) && o.isNight)*1000*60*12;
if(o.num
&& o.LastActTime + o.MaxSensitTime * o.act.rate + o.extTime< new Date().valueOf()){
//pOut();
}
}, 1000);
/* 意外触发 */
zone.liv[1].on('peopleIn', ()=>{
if(o.isNight && !o.num){
if(o.LastActTime > new Date().valueOf() - o.MaxSensitTime * o.act.rate){
//pIn();
//pIn();
}
}
});
/* 活跃度监测 */
/*zone.liv.forEach((item)=>{
item.on('toggle', ()=>{
o.act.actTimeArray.push(new Date().valueOf());
});
});*/
setInterval(()=>{
if(zone.liv[0].actNum || zone.liv[1].actNum){
o.act.actTimeArray.push(new Date().valueOf());
o.numAct = 1;
}else{
o.numAct = 0;
}
while(o.act.actTimeArray[0] < new Date().valueOf() - o.act.maxDetectTime){
o.act.actTimeArray.shift();
}
o.act.rate = o.act.actTimeArray.length * 1000 / o.act.maxDetectTime;
}, 1000);
return o;
}
exports.liv = liv;