rootfs_enc1v2_hi3520d_20230531
This commit is contained in:
parent
07336a7379
commit
877317826b
|
@ -1,6 +1,7 @@
|
||||||
ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1f01", RUN+="/etc/udev/usb4g.sh"
|
ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="1f01", RUN+="/etc/udev/usb4g.sh"
|
||||||
ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="1a2b", RUN+="/etc/udev/usbWiFi.sh"
|
ATTRS{idVendor}=="0bda", ATTRS{idProduct}=="1a2b", RUN+="/etc/udev/usbWiFi.sh"
|
||||||
SUBSYSTEM=="net", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14db", KERNEL=="eth*", RUN+="/etc/udev/usbUp.sh %k"
|
SUBSYSTEM=="net", ATTRS{idVendor}=="12d1", ATTRS{idProduct}=="14db", KERNEL=="eth*", RUN+="/etc/udev/usbUp.sh %k"
|
||||||
|
SUBSYSTEM=="net", KERNEL=="usb*", RUN+="/etc/udev/usbUp.sh %k"
|
||||||
ACTION=="add", KERNEL=="sd*", SUBSYSTEM=="block", RUN+="/link/shell/mountUsb.sh"
|
ACTION=="add", KERNEL=="sd*", SUBSYSTEM=="block", RUN+="/link/shell/mountUsb.sh"
|
||||||
ACTION=="remove",KERNEL=="sd*", SUBSYSTEM=="block", RUN+="/etc/udev/autounmount.sh"
|
ACTION=="remove",KERNEL=="sd*", SUBSYSTEM=="block", RUN+="/etc/udev/autounmount.sh"
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,314 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"nameCH": "方案 1",
|
||||||
|
"nameEN": "project 1",
|
||||||
|
"used": true,
|
||||||
|
"btns": [
|
||||||
|
{
|
||||||
|
"icon": "fa-power-off",
|
||||||
|
"code": 3944021760,
|
||||||
|
"tapCH": "关闭 Hdmi/Vga",
|
||||||
|
"tapEN": "Close Hdmi/Vga",
|
||||||
|
"pressCH": "开启 Hdmi/Vga",
|
||||||
|
"pressEN": "Open Hdmi/Vga"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-bars",
|
||||||
|
"code": 3960733440,
|
||||||
|
"tapCH": "开启 Hdmi/Vga",
|
||||||
|
"tapEN": "Open Hdmi/Vga",
|
||||||
|
"pressCH": "关闭 Hdmi/Vga",
|
||||||
|
"pressEN": "Close Hdmi/Vga"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-up",
|
||||||
|
"code": 4228120320,
|
||||||
|
"tapCH": "开启全平台推流",
|
||||||
|
"tapEN": "Stop Platform Push",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-down",
|
||||||
|
"code": 4244832000,
|
||||||
|
"tapCH": "关闭全平台推流",
|
||||||
|
"tapEN": "Stop Platform Push",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-left",
|
||||||
|
"code": 4044291840,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-right",
|
||||||
|
"code": 3843751680,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "my-ok",
|
||||||
|
"code": 4161273600,
|
||||||
|
"tapCH": "开启录制",
|
||||||
|
"tapEN": "Start Record",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-down",
|
||||||
|
"code": 2807627520,
|
||||||
|
"tapCH": "开启 Dhcp",
|
||||||
|
"tapEN": "Open Dhcp",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-clone",
|
||||||
|
"code": 2740780800,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-up",
|
||||||
|
"code": 4094426880,
|
||||||
|
"tapCH": "关闭 Dhcp",
|
||||||
|
"tapEN": "Close Dhcp",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-reply",
|
||||||
|
"code": 4261543680,
|
||||||
|
"tapCH": "关闭录制",
|
||||||
|
"tapEN": "Stop Record",
|
||||||
|
"pressCH": "重启机器",
|
||||||
|
"pressEN": "Restart"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-home",
|
||||||
|
"code": 3075014400,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "恢复出厂设置",
|
||||||
|
"pressEN": "Factory Data Reset"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"nameCH": "方案 2",
|
||||||
|
"nameEN": "project 2",
|
||||||
|
"used": false,
|
||||||
|
"btns": [
|
||||||
|
{
|
||||||
|
"icon": "fa-power-off",
|
||||||
|
"code": 3944021760,
|
||||||
|
"tapCH": "开启Mix直播",
|
||||||
|
"tapEN": "Start Mix Live",
|
||||||
|
"pressCH": "关闭Mix直播",
|
||||||
|
"pressEN": "Stop Mix Live"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-bars",
|
||||||
|
"code": 3960733440,
|
||||||
|
"tapCH": "关闭全平台推流",
|
||||||
|
"tapEN": "Stop Platform Push",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-up",
|
||||||
|
"code": 4228120320,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-down",
|
||||||
|
"code": 4244832000,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-left",
|
||||||
|
"code": 4044291840,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-right",
|
||||||
|
"code": 3843751680,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "my-ok",
|
||||||
|
"code": 4161273600,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-down",
|
||||||
|
"code": 2807627520,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-clone",
|
||||||
|
"code": 2740780800,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-up",
|
||||||
|
"code": 4094426880,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-reply",
|
||||||
|
"code": 4261543680,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-home",
|
||||||
|
"code": 3075014400,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"nameCH": "方案 3",
|
||||||
|
"nameEN": "project 3",
|
||||||
|
"used": false,
|
||||||
|
"btns": [
|
||||||
|
{
|
||||||
|
"icon": "fa-power-off",
|
||||||
|
"code": 3944021760,
|
||||||
|
"tapCH": "开启Mix直播",
|
||||||
|
"tapEN": "Start Mix Live",
|
||||||
|
"pressCH": "关闭Mix直播",
|
||||||
|
"pressEN": "Stop Mix Live"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-bars",
|
||||||
|
"code": 3960733440,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-up",
|
||||||
|
"code": 4228120320,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-down",
|
||||||
|
"code": 4244832000,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-left",
|
||||||
|
"code": 4044291840,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-right",
|
||||||
|
"code": 3843751680,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "my-ok",
|
||||||
|
"code": 4161273600,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-down",
|
||||||
|
"code": 2807627520,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-clone",
|
||||||
|
"code": 2740780800,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-up",
|
||||||
|
"code": 4094426880,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-reply",
|
||||||
|
"code": 4261543680,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-home",
|
||||||
|
"code": 3075014400,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,92 @@
|
||||||
|
{
|
||||||
|
"mods1":[
|
||||||
|
{
|
||||||
|
"titleCH":"录播模块",
|
||||||
|
"titleEN":"Broadcast",
|
||||||
|
"func":[
|
||||||
|
{
|
||||||
|
"ch":"开启Mix直播",
|
||||||
|
"en":"Start Mix Live"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭Mix直播",
|
||||||
|
"en":"Stop Mix Live"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"开启Mix推流",
|
||||||
|
"en":"Start Mix Push"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭Mix推流",
|
||||||
|
"en":"Stop Mix Push"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"开启录制",
|
||||||
|
"en":"Start Record"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭录制",
|
||||||
|
"en":"Stop Record"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"开启全平台推流",
|
||||||
|
"en":"Stop Platform Push"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭全平台推流",
|
||||||
|
"en":"Stop Platform Push"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"mods2":[
|
||||||
|
{
|
||||||
|
"titleCH":"系统模块",
|
||||||
|
"titleEN":"Network",
|
||||||
|
"func":[
|
||||||
|
{
|
||||||
|
"ch":"开启 Dhcp",
|
||||||
|
"en":"Open Dhcp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭 Dhcp",
|
||||||
|
"en":"Close Dhcp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"重启机器",
|
||||||
|
"en":"Restart"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"恢复出厂设置",
|
||||||
|
"en":"Factory Data Reset"
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"titleCH":"输出模块",
|
||||||
|
"titleEN":"Output",
|
||||||
|
"func":[
|
||||||
|
{
|
||||||
|
"ch":"开启 Hdmi/Vga",
|
||||||
|
"en":"Open Hdmi/Vga"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭 Hdmi/Vga",
|
||||||
|
"en":"Close Hdmi/Vga"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"titleCH":"",
|
||||||
|
"titleEN":"",
|
||||||
|
"func":[
|
||||||
|
{
|
||||||
|
"ch":"未启用",
|
||||||
|
"en":"None"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"btnId": 1,
|
||||||
|
"remoteCode": 3944021760,
|
||||||
|
"btnNameCN": "按键1",
|
||||||
|
"btnNameEN": "Button1",
|
||||||
|
"icon": "fa-power-off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 2,
|
||||||
|
"remoteCode": 3960733440,
|
||||||
|
"btnNameCN": "按键 2",
|
||||||
|
"btnNameEN": "Button 2",
|
||||||
|
"icon": "fa-bars"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 3,
|
||||||
|
"remoteCode": 4228120320,
|
||||||
|
"btnNameCN": "按键 3",
|
||||||
|
"btnNameEN": "Button 3",
|
||||||
|
"icon": "fa-caret-up"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 4,
|
||||||
|
"remoteCode": 4244832000,
|
||||||
|
"btnNameCN": "按键 4",
|
||||||
|
"btnNameEN": "Button 4",
|
||||||
|
"icon": "fa-caret-down"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 5,
|
||||||
|
"remoteCode": 4044291840,
|
||||||
|
"btnNameCN": "按键 5",
|
||||||
|
"btnNameEN": "Button 5",
|
||||||
|
"icon": "fa-caret-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 6,
|
||||||
|
"remoteCode": 3843751680,
|
||||||
|
"btnNameCN": "按键 6",
|
||||||
|
"btnNameEN": "Button 6",
|
||||||
|
"icon": "fa-caret-right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 7,
|
||||||
|
"remoteCode": 4161273600,
|
||||||
|
"btnNameCN": "按键 7",
|
||||||
|
"btnNameEN": "Button 7",
|
||||||
|
"icon": "my-ok"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 8,
|
||||||
|
"remoteCode": 2807627520,
|
||||||
|
"btnNameCN": "按键 8",
|
||||||
|
"btnNameEN": "Button 8",
|
||||||
|
"icon": "fa-volume-down"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 9,
|
||||||
|
"remoteCode": 2740780800,
|
||||||
|
"btnNameCN": "按键 9",
|
||||||
|
"btnNameEN": "Button 9",
|
||||||
|
"icon": "fa-clone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 10,
|
||||||
|
"remoteCode": 4094426880,
|
||||||
|
"btnNameCN": "按键 10",
|
||||||
|
"btnNameEN": "Button 10",
|
||||||
|
"icon": "fa-volume-up"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 11,
|
||||||
|
"remoteCode": 4261543680,
|
||||||
|
"btnNameCN": "按键 11",
|
||||||
|
"btnNameEN": "Button 11",
|
||||||
|
"icon": "fa-reply"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 12,
|
||||||
|
"remoteCode": 3075014400,
|
||||||
|
"btnNameCN": "按键 12",
|
||||||
|
"btnNameEN": "Button 12",
|
||||||
|
"icon": "fa-home"
|
||||||
|
}
|
||||||
|
]
|
|
@ -1,4 +1,18 @@
|
||||||
[
|
[
|
||||||
|
{
|
||||||
|
"version": "2.2.0 build 20230531",
|
||||||
|
"logs": [
|
||||||
|
"全平台直播新增定时开启/关闭推流功能",
|
||||||
|
"优化部分机型Onvif PTZ功能",
|
||||||
|
"优化集成通信功能",
|
||||||
|
"优化设备内存占用",
|
||||||
|
"调整首页端口状态显示逻辑",
|
||||||
|
"修正roi设置功能",
|
||||||
|
"修正开启推流后,更改系统时间导致的推流时长显示不准确的问题",
|
||||||
|
"修正ENC1机型按键小概率不触发问题",
|
||||||
|
"支持全新基于互联网的微信小程序,不在依赖局域网,真正做到的随时随地查看"
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"version": "2.1.0 build 20230426",
|
"version": "2.1.0 build 20230426",
|
||||||
"logs": [
|
"logs": [
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
{
|
{
|
||||||
"app": "2.0.0 build 20220512_869",
|
"app": "2.0.0 build 20220512_869",
|
||||||
"sdk": "2.0.0 build 20220518_20716",
|
"sdk": "2.0.0 build 20220518_20716",
|
||||||
"sys": "2.1.0 build 20230426"
|
"sys": "2.2.0 build 20230531"
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -0,0 +1,4 @@
|
||||||
|
[
|
||||||
|
{"name":"GPIO0_0","addr":"12150000","offset": 0,"irq":89},
|
||||||
|
{"name":"GPIO0_1","addr":"12150000","offset": 1,"irq":89}
|
||||||
|
]
|
|
@ -0,0 +1,63 @@
|
||||||
|
. /link/shell/util/hardware.sh
|
||||||
|
count=0
|
||||||
|
type=`jget gpio.type`
|
||||||
|
himmGPIO()
|
||||||
|
{
|
||||||
|
gpioName=`jget gpio.name`
|
||||||
|
gpioAddr=`jget gpio.addr`
|
||||||
|
eval "`jget gpio.mux` > /dev/null"
|
||||||
|
eval "`jget gpio.dir` > /dev/null"
|
||||||
|
|
||||||
|
echo "Init $gpioName($gpioAddr) done."
|
||||||
|
|
||||||
|
while [ true ]
|
||||||
|
do
|
||||||
|
ret=`himd.l $gpioAddr 1 | awk 'NR==4{print $2}'`
|
||||||
|
if [ "$ret" == "00000000" ]; then
|
||||||
|
count=$(($count+1))
|
||||||
|
echo "keyDown $count"
|
||||||
|
if [ "$count" == "5" ]; then
|
||||||
|
echo "reset default config"
|
||||||
|
/link/shell/reset.sh
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
count=0
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
sysfsGPIO()
|
||||||
|
{
|
||||||
|
gpioName=`jget gpio.name`
|
||||||
|
gpioIndex=`jget gpio.index`
|
||||||
|
eval "`jget gpio.mux` > /dev/null"
|
||||||
|
if [ ! -d "/sys/class/gpio/gpio$gpioIndex" ];then
|
||||||
|
echo $gpioIndex > /sys/class/gpio/export
|
||||||
|
fi
|
||||||
|
echo "in" > /sys/class/gpio/gpio$gpioIndex/direction
|
||||||
|
|
||||||
|
echo "Init $gpioName($gpioIndex) done."
|
||||||
|
|
||||||
|
while [ true ]
|
||||||
|
do
|
||||||
|
ret=`cat /sys/class/gpio/gpio$gpioIndex/value`
|
||||||
|
if [ "$ret" == "0" ]; then
|
||||||
|
count=$(($count+1))
|
||||||
|
echo "keyDown $count"
|
||||||
|
if [ "$count" == "5" ]; then
|
||||||
|
echo "reset default config"
|
||||||
|
/link/shell/reset.sh
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
count=0
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
if [ "$type" == "himm" ]; then
|
||||||
|
himmGPIO
|
||||||
|
elif [ "$type" == "sysfs" ]; then
|
||||||
|
sysfsGPIO
|
||||||
|
fi
|
|
@ -0,0 +1,5 @@
|
||||||
|
while [ true ]
|
||||||
|
do
|
||||||
|
/link/bin/Monitor
|
||||||
|
sleep 1
|
||||||
|
done
|
Binary file not shown.
|
@ -0,0 +1,314 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"id": 1,
|
||||||
|
"nameCH": "方案 1",
|
||||||
|
"nameEN": "project 1",
|
||||||
|
"used": true,
|
||||||
|
"btns": [
|
||||||
|
{
|
||||||
|
"icon": "fa-power-off",
|
||||||
|
"code": 3944021760,
|
||||||
|
"tapCH": "关闭 Hdmi/Vga",
|
||||||
|
"tapEN": "Close Hdmi/Vga",
|
||||||
|
"pressCH": "开启 Hdmi/Vga",
|
||||||
|
"pressEN": "Open Hdmi/Vga"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-bars",
|
||||||
|
"code": 3960733440,
|
||||||
|
"tapCH": "开启 Hdmi/Vga",
|
||||||
|
"tapEN": "Open Hdmi/Vga",
|
||||||
|
"pressCH": "关闭 Hdmi/Vga",
|
||||||
|
"pressEN": "Close Hdmi/Vga"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-up",
|
||||||
|
"code": 4228120320,
|
||||||
|
"tapCH": "开启全平台推流",
|
||||||
|
"tapEN": "Stop Platform Push",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-down",
|
||||||
|
"code": 4244832000,
|
||||||
|
"tapCH": "关闭全平台推流",
|
||||||
|
"tapEN": "Stop Platform Push",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-left",
|
||||||
|
"code": 4044291840,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-right",
|
||||||
|
"code": 3843751680,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "my-ok",
|
||||||
|
"code": 4161273600,
|
||||||
|
"tapCH": "开启录制",
|
||||||
|
"tapEN": "Start Record",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-down",
|
||||||
|
"code": 2807627520,
|
||||||
|
"tapCH": "开启 Dhcp",
|
||||||
|
"tapEN": "Open Dhcp",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-clone",
|
||||||
|
"code": 2740780800,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-up",
|
||||||
|
"code": 4094426880,
|
||||||
|
"tapCH": "关闭 Dhcp",
|
||||||
|
"tapEN": "Close Dhcp",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-reply",
|
||||||
|
"code": 4261543680,
|
||||||
|
"tapCH": "关闭录制",
|
||||||
|
"tapEN": "Stop Record",
|
||||||
|
"pressCH": "重启机器",
|
||||||
|
"pressEN": "Restart"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-home",
|
||||||
|
"code": 3075014400,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "恢复出厂设置",
|
||||||
|
"pressEN": "Factory Data Reset"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 2,
|
||||||
|
"nameCH": "方案 2",
|
||||||
|
"nameEN": "project 2",
|
||||||
|
"used": false,
|
||||||
|
"btns": [
|
||||||
|
{
|
||||||
|
"icon": "fa-power-off",
|
||||||
|
"code": 3944021760,
|
||||||
|
"tapCH": "开启Mix直播",
|
||||||
|
"tapEN": "Start Mix Live",
|
||||||
|
"pressCH": "关闭Mix直播",
|
||||||
|
"pressEN": "Stop Mix Live"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-bars",
|
||||||
|
"code": 3960733440,
|
||||||
|
"tapCH": "关闭全平台推流",
|
||||||
|
"tapEN": "Stop Platform Push",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-up",
|
||||||
|
"code": 4228120320,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-down",
|
||||||
|
"code": 4244832000,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-left",
|
||||||
|
"code": 4044291840,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-right",
|
||||||
|
"code": 3843751680,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "my-ok",
|
||||||
|
"code": 4161273600,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-down",
|
||||||
|
"code": 2807627520,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-clone",
|
||||||
|
"code": 2740780800,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-up",
|
||||||
|
"code": 4094426880,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-reply",
|
||||||
|
"code": 4261543680,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-home",
|
||||||
|
"code": 3075014400,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": 3,
|
||||||
|
"nameCH": "方案 3",
|
||||||
|
"nameEN": "project 3",
|
||||||
|
"used": false,
|
||||||
|
"btns": [
|
||||||
|
{
|
||||||
|
"icon": "fa-power-off",
|
||||||
|
"code": 3944021760,
|
||||||
|
"tapCH": "开启Mix直播",
|
||||||
|
"tapEN": "Start Mix Live",
|
||||||
|
"pressCH": "关闭Mix直播",
|
||||||
|
"pressEN": "Stop Mix Live"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-bars",
|
||||||
|
"code": 3960733440,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-up",
|
||||||
|
"code": 4228120320,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-down",
|
||||||
|
"code": 4244832000,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-left",
|
||||||
|
"code": 4044291840,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-caret-right",
|
||||||
|
"code": 3843751680,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "my-ok",
|
||||||
|
"code": 4161273600,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-down",
|
||||||
|
"code": 2807627520,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-clone",
|
||||||
|
"code": 2740780800,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-volume-up",
|
||||||
|
"code": 4094426880,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-reply",
|
||||||
|
"code": 4261543680,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"icon": "fa-home",
|
||||||
|
"code": 3075014400,
|
||||||
|
"tapCH": "未启用",
|
||||||
|
"tapEN": "None",
|
||||||
|
"pressCH": "未启用",
|
||||||
|
"pressEN": "None"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,92 @@
|
||||||
|
{
|
||||||
|
"mods1":[
|
||||||
|
{
|
||||||
|
"titleCH":"录播模块",
|
||||||
|
"titleEN":"Broadcast",
|
||||||
|
"func":[
|
||||||
|
{
|
||||||
|
"ch":"开启Mix直播",
|
||||||
|
"en":"Start Mix Live"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭Mix直播",
|
||||||
|
"en":"Stop Mix Live"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"开启Mix推流",
|
||||||
|
"en":"Start Mix Push"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭Mix推流",
|
||||||
|
"en":"Stop Mix Push"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"开启录制",
|
||||||
|
"en":"Start Record"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭录制",
|
||||||
|
"en":"Stop Record"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"开启全平台推流",
|
||||||
|
"en":"Stop Platform Push"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭全平台推流",
|
||||||
|
"en":"Stop Platform Push"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"mods2":[
|
||||||
|
{
|
||||||
|
"titleCH":"系统模块",
|
||||||
|
"titleEN":"Network",
|
||||||
|
"func":[
|
||||||
|
{
|
||||||
|
"ch":"开启 Dhcp",
|
||||||
|
"en":"Open Dhcp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭 Dhcp",
|
||||||
|
"en":"Close Dhcp"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"重启机器",
|
||||||
|
"en":"Restart"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"恢复出厂设置",
|
||||||
|
"en":"Factory Data Reset"
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"titleCH":"输出模块",
|
||||||
|
"titleEN":"Output",
|
||||||
|
"func":[
|
||||||
|
{
|
||||||
|
"ch":"开启 Hdmi/Vga",
|
||||||
|
"en":"Open Hdmi/Vga"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"ch":"关闭 Hdmi/Vga",
|
||||||
|
"en":"Close Hdmi/Vga"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"titleCH":"",
|
||||||
|
"titleEN":"",
|
||||||
|
"func":[
|
||||||
|
{
|
||||||
|
"ch":"未启用",
|
||||||
|
"en":"None"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
|
@ -0,0 +1,86 @@
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"btnId": 1,
|
||||||
|
"remoteCode": 3944021760,
|
||||||
|
"btnNameCN": "按键1",
|
||||||
|
"btnNameEN": "Button1",
|
||||||
|
"icon": "fa-power-off"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 2,
|
||||||
|
"remoteCode": 3960733440,
|
||||||
|
"btnNameCN": "按键 2",
|
||||||
|
"btnNameEN": "Button 2",
|
||||||
|
"icon": "fa-bars"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 3,
|
||||||
|
"remoteCode": 4228120320,
|
||||||
|
"btnNameCN": "按键 3",
|
||||||
|
"btnNameEN": "Button 3",
|
||||||
|
"icon": "fa-caret-up"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 4,
|
||||||
|
"remoteCode": 4244832000,
|
||||||
|
"btnNameCN": "按键 4",
|
||||||
|
"btnNameEN": "Button 4",
|
||||||
|
"icon": "fa-caret-down"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 5,
|
||||||
|
"remoteCode": 4044291840,
|
||||||
|
"btnNameCN": "按键 5",
|
||||||
|
"btnNameEN": "Button 5",
|
||||||
|
"icon": "fa-caret-left"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 6,
|
||||||
|
"remoteCode": 3843751680,
|
||||||
|
"btnNameCN": "按键 6",
|
||||||
|
"btnNameEN": "Button 6",
|
||||||
|
"icon": "fa-caret-right"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 7,
|
||||||
|
"remoteCode": 4161273600,
|
||||||
|
"btnNameCN": "按键 7",
|
||||||
|
"btnNameEN": "Button 7",
|
||||||
|
"icon": "my-ok"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 8,
|
||||||
|
"remoteCode": 2807627520,
|
||||||
|
"btnNameCN": "按键 8",
|
||||||
|
"btnNameEN": "Button 8",
|
||||||
|
"icon": "fa-volume-down"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 9,
|
||||||
|
"remoteCode": 2740780800,
|
||||||
|
"btnNameCN": "按键 9",
|
||||||
|
"btnNameEN": "Button 9",
|
||||||
|
"icon": "fa-clone"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 10,
|
||||||
|
"remoteCode": 4094426880,
|
||||||
|
"btnNameCN": "按键 10",
|
||||||
|
"btnNameEN": "Button 10",
|
||||||
|
"icon": "fa-volume-up"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 11,
|
||||||
|
"remoteCode": 4261543680,
|
||||||
|
"btnNameCN": "按键 11",
|
||||||
|
"btnNameEN": "Button 11",
|
||||||
|
"icon": "fa-reply"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"btnId": 12,
|
||||||
|
"remoteCode": 3075014400,
|
||||||
|
"btnNameCN": "按键 12",
|
||||||
|
"btnNameEN": "Button 12",
|
||||||
|
"icon": "fa-home"
|
||||||
|
}
|
||||||
|
]
|
|
@ -0,0 +1,5 @@
|
||||||
|
while [ true ]
|
||||||
|
do
|
||||||
|
/link/bin/Monitor
|
||||||
|
sleep 1
|
||||||
|
done
|
Binary file not shown.
|
@ -9,3 +9,10 @@ if [ -f /link/shell/ptz.sh ] ;then
|
||||||
/link/shell/ptz.sh &
|
/link/shell/ptz.sh &
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if [ -f /link/bin/mqtt ] ;then
|
||||||
|
/link/bin/mqtt &
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f /link/bin/Monitor ];then
|
||||||
|
/link/shell/monitor.sh &
|
||||||
|
fi
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
/link/shell/trans.sh &
|
/link/shell/trans.sh &
|
||||||
while [ true ]
|
while [ true ]
|
||||||
do
|
do
|
||||||
pkill OLED
|
pkill Monitor
|
||||||
/link/bin/Encoder
|
/link/bin/Encoder
|
||||||
sleep 2
|
sleep 2
|
||||||
done
|
done
|
||||||
|
|
|
@ -16,9 +16,15 @@ umount_usb(){
|
||||||
|
|
||||||
umount_usb
|
umount_usb
|
||||||
if [ $1 == "ext4" ];then
|
if [ $1 == "ext4" ];then
|
||||||
|
if [ -b /dev/sda1 ];then
|
||||||
echo -e "\ny" | mkfs.ext4 -T largefile /dev/sda1
|
echo -e "\ny" | mkfs.ext4 -T largefile /dev/sda1
|
||||||
sleep 1
|
sleep 1
|
||||||
mount -t ext4 /dev/sda1 /root/usb
|
mount -t ext4 /dev/sda1 /root/usb
|
||||||
|
elif [ -b /dev/mmcblk0p6 ];then
|
||||||
|
echo -e "\ny" | mkfs.ext4 -T largefile /dev/mmcblk0p6
|
||||||
|
sleep 1
|
||||||
|
mount -o rw,sync,barrier=0 /dev/mmcblk0p6 /root/usb
|
||||||
|
fi
|
||||||
else
|
else
|
||||||
mkfs.vfat -F 32 /dev/sda1
|
mkfs.vfat -F 32 /dev/sda1
|
||||||
sleep 1
|
sleep 1
|
||||||
|
|
|
@ -12,5 +12,16 @@ fi
|
||||||
|
|
||||||
if [ -b /dev/mmcblk0p6 ]; then
|
if [ -b /dev/mmcblk0p6 ]; then
|
||||||
/bin/mount -o rw,sync,barrier=0 /dev/mmcblk0p6 /root/usb
|
/bin/mount -o rw,sync,barrier=0 /dev/mmcblk0p6 /root/usb
|
||||||
|
mnt=`df -h | grep /dev/mmcblk0p6 | wc -l`
|
||||||
|
if [ "$mnt" == "1" ] && [ ! -d /root/usb/lost+found ];then
|
||||||
|
umount -f /root/usb/
|
||||||
|
mnt=`df -h | grep /dev/mmcblk0p6 | wc -l`
|
||||||
|
if [ "$mnt" == "0" ];then
|
||||||
|
echo -e "\ny" | mkfs.ext4 -T largefile /dev/mmcblk0p6
|
||||||
|
if [ ! -b /dev/sda1 ];then
|
||||||
|
/bin/mount -o rw,sync,barrier=0 /dev/mmcblk0p6 /root/usb
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -22,6 +22,13 @@ if [ `jget nginx` == "true" ]; then
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [ `jget crond` == "true" ]; then
|
if [ `jget crond` == "true" ]; then
|
||||||
|
if [ ! -f /var/spool/cron/crontabs/root ];then
|
||||||
|
touch /var/spool/cron/crontabs/root
|
||||||
|
echo "" >> /var/spool/cron/crontabs/root
|
||||||
|
echo "" >> /var/spool/cron/crontabs/root
|
||||||
|
echo "" >> /var/spool/cron/crontabs/root
|
||||||
|
fi
|
||||||
|
chown -R root:root /var/spool
|
||||||
/usr/sbin/crond -d 8
|
/usr/sbin/crond -d 8
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
while [ true ]
|
||||||
|
do
|
||||||
|
/link/bin/Monitor
|
||||||
|
sleep 1
|
||||||
|
done
|
|
@ -1,6 +1,6 @@
|
||||||
if [ ! -z "$(ls -A /link/update)" ]; then
|
if [ ! -z "$(ls -A /link/update)" ]; then
|
||||||
mv /link/update/* /link/update/update.tar
|
mv /link/update/* /link/update/update.tar
|
||||||
tar -xf /link/update/update.tar -C /
|
tar -xof /link/update/update.tar -C /
|
||||||
|
|
||||||
sleep 1
|
sleep 1
|
||||||
if [ -c "/dev/mtd1" ]; then
|
if [ -c "/dev/mtd1" ]; then
|
||||||
|
|
|
@ -303,9 +303,6 @@ include("head.php");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function update() {
|
function update() {
|
||||||
rpc( "enc.getSysState", null, function ( data ) {
|
rpc( "enc.getSysState", null, function ( data ) {
|
||||||
try {
|
try {
|
||||||
|
@ -356,10 +353,6 @@ include("head.php");
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for( var i = hdmi.length; i < $( ".hdmi" ).length; i++ ){
|
|
||||||
$( ".hdmi" ).eq( i ).hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
for ( var i = 0; i < sdi.length; i++ ) {
|
for ( var i = 0; i < sdi.length; i++ ) {
|
||||||
if ( sdi[ i ].avalible ) {
|
if ( sdi[ i ].avalible ) {
|
||||||
$( ".sdi" ).eq( i ).removeClass( "disable" );
|
$( ".sdi" ).eq( i ).removeClass( "disable" );
|
||||||
|
@ -371,11 +364,6 @@ include("head.php");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for( var i = sdi.length; i < $( ".sdi" ).length; i++ ){
|
|
||||||
$( ".sdi" ).eq( i ).hide();
|
|
||||||
}
|
|
||||||
|
|
||||||
} );
|
} );
|
||||||
|
|
||||||
setTimeout( update, 3000 );
|
setTimeout( update, 3000 );
|
||||||
|
|
|
@ -116,19 +116,65 @@ function setCron() {
|
||||||
if ( isset( $_POST[ 'day' ] ) && isset( $_POST[ 'time' ] ) ) {
|
if ( isset( $_POST[ 'day' ] ) && isset( $_POST[ 'time' ] ) ) {
|
||||||
if ( $_POST[ 'day' ] == "x" )
|
if ( $_POST[ 'day' ] == "x" )
|
||||||
{
|
{
|
||||||
exec( 'echo "" | crontab -u root -' );
|
exec("sed -i '1s/.*/ /' /var/spool/cron/crontabs/root");
|
||||||
|
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
exec( 'echo "0 ' . $_POST[ 'time' ] . ' * * ' . $_POST[ 'day' ] . ' /link/shell/reboot.sh" | crontab -u root -' );
|
$cron = '0 ' . $_POST[ 'time' ] . ' * * ' . $_POST[ 'day' ];
|
||||||
|
exec("sed -i '1s/.*/".$cron." \/link\/shell\/reboot.sh/' /var/spool/cron/crontabs/root");
|
||||||
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
|
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
|
||||||
}
|
}
|
||||||
|
|
||||||
$result->result = "OK";
|
$result->result = "OK";
|
||||||
} else {
|
} else {
|
||||||
$result->result = shell_exec( 'crontab -u root -l' );
|
$result->result = shell_exec( 'crontab -u root -l | grep /link/shell/reboot.sh' );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function setPushCron() {
|
||||||
|
global $result;
|
||||||
|
$start = $_POST['start'];
|
||||||
|
if ( isset( $start[ 'day' ] ) && isset( $start[ 'time' ] ) ) {
|
||||||
|
if ( $start[ 'day' ] == "x" )
|
||||||
|
{
|
||||||
|
exec("sed -i '2s/.*/ /' /var/spool/cron/crontabs/root");
|
||||||
|
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$tm = explode(":", $start[ 'time' ]);
|
||||||
|
$cron = intval($tm[1]).' ' . intval($tm[0]) . ' * * ' . $start[ 'day' ];
|
||||||
|
exec("sed -i '2s/.*/".$cron." \/usr\/php\/bin\/php \/link\/web\/link\/timer\/autoPush.php start/' /var/spool/cron/crontabs/root");
|
||||||
|
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$stop = $_POST['stop'];
|
||||||
|
if ( isset( $stop[ 'day' ] ) && isset( $stop[ 'time' ] ) ) {
|
||||||
|
if ( $stop[ 'day' ] == "x" )
|
||||||
|
{
|
||||||
|
exec("sed -i '3s/.*/ /' /var/spool/cron/crontabs/root");
|
||||||
|
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
$tm = explode(":", $stop[ 'time' ]);
|
||||||
|
$cron = intval($tm[1]).' ' . intval($tm[0]) . ' * * ' . $stop[ 'day' ];
|
||||||
|
exec("sed -i '3s/.*/".$cron." \/usr\/php\/bin\/php \/link\/web\/link\/timer\/autoPush.php stop/' /var/spool/cron/crontabs/root");
|
||||||
|
exec("cp -a /var/spool/cron/crontabs/root /link/config/auto/root.cron");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$result->result = "OK";
|
||||||
|
}
|
||||||
|
|
||||||
|
function getPushCron() {
|
||||||
|
global $result;
|
||||||
|
exec( "crontab -u root -l | grep '/link/web/link/timer/autoPush.php start'",$output1);
|
||||||
|
exec( "crontab -u root -l | grep '/link/web/link/timer/autoPush.php stop'",$output2);
|
||||||
|
$result->result = [
|
||||||
|
'start'=>$output1[0],
|
||||||
|
'stop'=>$output2[0]
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
function startHelp() {
|
function startHelp() {
|
||||||
global $result;
|
global $result;
|
||||||
global $hardware;
|
global $hardware;
|
||||||
|
|
|
@ -84,14 +84,22 @@ include("headhead.php");
|
||||||
<cn>H5 播放器</cn>
|
<cn>H5 播放器</cn>
|
||||||
<en>H5 Player</en>
|
<en>H5 Player</en>
|
||||||
</a></li>
|
</a></li>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
if ($hardware["function"]["intercom"]) {
|
||||||
|
?>
|
||||||
<li><a href="intercom.php"><i class="fa fa-headphones"></i>
|
<li><a href="intercom.php"><i class="fa fa-headphones"></i>
|
||||||
<cn>集成通信</cn>
|
<cn>集成通信</cn>
|
||||||
<en>Intercom</en>
|
<en>Intercom</en>
|
||||||
</a></li>
|
</a></li>
|
||||||
|
<?php
|
||||||
|
}
|
||||||
|
?>
|
||||||
<li><a href="explorer.php"><i class="fa fa-folder-open-o"></i>
|
<li><a href="explorer.php"><i class="fa fa-folder-open-o"></i>
|
||||||
<cn>U盘助手</cn>
|
<cn>U盘助手</cn>
|
||||||
<en>Usb Disk</en>
|
<en>Usb Disk</en>
|
||||||
</a></li>
|
</a></li>
|
||||||
|
|
||||||
<?php
|
<?php
|
||||||
if ($hardware["function"]["serialport"]) {
|
if ($hardware["function"]["serialport"]) {
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -433,7 +433,7 @@ include( "head.php" );
|
||||||
var intercom=res.intercom;
|
var intercom=res.intercom;
|
||||||
var tally=res.tally;
|
var tally=res.tally;
|
||||||
var ids=[];
|
var ids=[];
|
||||||
ids.push(myid);
|
ids.push(Number(myid));
|
||||||
$("#did"+myid).addClass("alive");
|
$("#did"+myid).addClass("alive");
|
||||||
$("#did"+myid).parent().parent().find("h3").text(myname);
|
$("#did"+myid).parent().parent().find("h3").text(myname);
|
||||||
if(res.talking)
|
if(res.talking)
|
||||||
|
@ -444,7 +444,7 @@ include( "head.php" );
|
||||||
for(var i=0;i<intercom.length;i++)
|
for(var i=0;i<intercom.length;i++)
|
||||||
{
|
{
|
||||||
var chn=intercom[i];
|
var chn=intercom[i];
|
||||||
ids.push(chn.id);
|
ids.push(Number(chn.id));
|
||||||
$("#did"+chn.id).parent().parent().find("h3").text(chn.name);
|
$("#did"+chn.id).parent().parent().find("h3").text(chn.name);
|
||||||
$("#did"+chn.id).addClass("alive");
|
$("#did"+chn.id).addClass("alive");
|
||||||
if(chn.talking)
|
if(chn.talking)
|
||||||
|
|
|
@ -90,6 +90,11 @@ function rpc5(func, params, callbak, usrdata) {
|
||||||
rpcc(func, params, callbak, usrdata, jsonrpc);
|
rpcc(func, params, callbak, usrdata, jsonrpc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function rpc6(func, params, callbak, usrdata) {
|
||||||
|
var jsonrpc = new $.JsonRpcClient({ ajaxUrl: 'RPC6' });
|
||||||
|
rpcc(func, params, callbak, usrdata, jsonrpc);
|
||||||
|
}
|
||||||
|
|
||||||
function func(func, data, callbak)
|
function func(func, data, callbak)
|
||||||
{
|
{
|
||||||
$.post("func.php?func="+func,data,callbak,"json");
|
$.post("func.php?func="+func,data,callbak,"json");
|
||||||
|
|
|
@ -0,0 +1,614 @@
|
||||||
|
/**
|
||||||
|
* @fileoverview
|
||||||
|
* - Using the 'QRCode for Javascript library'
|
||||||
|
* - Fixed dataset of 'QRCode for Javascript library' for support full-spec.
|
||||||
|
* - this library has no dependencies.
|
||||||
|
*
|
||||||
|
* @author davidshimjs
|
||||||
|
* @see <a href="http://www.d-project.com/" target="_blank">http://www.d-project.com/</a>
|
||||||
|
* @see <a href="http://jeromeetienne.github.com/jquery-qrcode/" target="_blank">http://jeromeetienne.github.com/jquery-qrcode/</a>
|
||||||
|
*/
|
||||||
|
var QRCode;
|
||||||
|
|
||||||
|
(function () {
|
||||||
|
//---------------------------------------------------------------------
|
||||||
|
// QRCode for JavaScript
|
||||||
|
//
|
||||||
|
// Copyright (c) 2009 Kazuhiko Arase
|
||||||
|
//
|
||||||
|
// URL: http://www.d-project.com/
|
||||||
|
//
|
||||||
|
// Licensed under the MIT license:
|
||||||
|
// http://www.opensource.org/licenses/mit-license.php
|
||||||
|
//
|
||||||
|
// The word "QR Code" is registered trademark of
|
||||||
|
// DENSO WAVE INCORPORATED
|
||||||
|
// http://www.denso-wave.com/qrcode/faqpatent-e.html
|
||||||
|
//
|
||||||
|
//---------------------------------------------------------------------
|
||||||
|
function QR8bitByte(data) {
|
||||||
|
this.mode = QRMode.MODE_8BIT_BYTE;
|
||||||
|
this.data = data;
|
||||||
|
this.parsedData = [];
|
||||||
|
|
||||||
|
// Added to support UTF-8 Characters
|
||||||
|
for (var i = 0, l = this.data.length; i < l; i++) {
|
||||||
|
var byteArray = [];
|
||||||
|
var code = this.data.charCodeAt(i);
|
||||||
|
|
||||||
|
if (code > 0x10000) {
|
||||||
|
byteArray[0] = 0xF0 | ((code & 0x1C0000) >>> 18);
|
||||||
|
byteArray[1] = 0x80 | ((code & 0x3F000) >>> 12);
|
||||||
|
byteArray[2] = 0x80 | ((code & 0xFC0) >>> 6);
|
||||||
|
byteArray[3] = 0x80 | (code & 0x3F);
|
||||||
|
} else if (code > 0x800) {
|
||||||
|
byteArray[0] = 0xE0 | ((code & 0xF000) >>> 12);
|
||||||
|
byteArray[1] = 0x80 | ((code & 0xFC0) >>> 6);
|
||||||
|
byteArray[2] = 0x80 | (code & 0x3F);
|
||||||
|
} else if (code > 0x80) {
|
||||||
|
byteArray[0] = 0xC0 | ((code & 0x7C0) >>> 6);
|
||||||
|
byteArray[1] = 0x80 | (code & 0x3F);
|
||||||
|
} else {
|
||||||
|
byteArray[0] = code;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.parsedData.push(byteArray);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.parsedData = Array.prototype.concat.apply([], this.parsedData);
|
||||||
|
|
||||||
|
if (this.parsedData.length != this.data.length) {
|
||||||
|
this.parsedData.unshift(191);
|
||||||
|
this.parsedData.unshift(187);
|
||||||
|
this.parsedData.unshift(239);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
QR8bitByte.prototype = {
|
||||||
|
getLength: function (buffer) {
|
||||||
|
return this.parsedData.length;
|
||||||
|
},
|
||||||
|
write: function (buffer) {
|
||||||
|
for (var i = 0, l = this.parsedData.length; i < l; i++) {
|
||||||
|
buffer.put(this.parsedData[i], 8);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function QRCodeModel(typeNumber, errorCorrectLevel) {
|
||||||
|
this.typeNumber = typeNumber;
|
||||||
|
this.errorCorrectLevel = errorCorrectLevel;
|
||||||
|
this.modules = null;
|
||||||
|
this.moduleCount = 0;
|
||||||
|
this.dataCache = null;
|
||||||
|
this.dataList = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
QRCodeModel.prototype={addData:function(data){var newData=new QR8bitByte(data);this.dataList.push(newData);this.dataCache=null;},isDark:function(row,col){if(row<0||this.moduleCount<=row||col<0||this.moduleCount<=col){throw new Error(row+","+col);}
|
||||||
|
return this.modules[row][col];},getModuleCount:function(){return this.moduleCount;},make:function(){this.makeImpl(false,this.getBestMaskPattern());},makeImpl:function(test,maskPattern){this.moduleCount=this.typeNumber*4+17;this.modules=new Array(this.moduleCount);for(var row=0;row<this.moduleCount;row++){this.modules[row]=new Array(this.moduleCount);for(var col=0;col<this.moduleCount;col++){this.modules[row][col]=null;}}
|
||||||
|
this.setupPositionProbePattern(0,0);this.setupPositionProbePattern(this.moduleCount-7,0);this.setupPositionProbePattern(0,this.moduleCount-7);this.setupPositionAdjustPattern();this.setupTimingPattern();this.setupTypeInfo(test,maskPattern);if(this.typeNumber>=7){this.setupTypeNumber(test);}
|
||||||
|
if(this.dataCache==null){this.dataCache=QRCodeModel.createData(this.typeNumber,this.errorCorrectLevel,this.dataList);}
|
||||||
|
this.mapData(this.dataCache,maskPattern);},setupPositionProbePattern:function(row,col){for(var r=-1;r<=7;r++){if(row+r<=-1||this.moduleCount<=row+r)continue;for(var c=-1;c<=7;c++){if(col+c<=-1||this.moduleCount<=col+c)continue;if((0<=r&&r<=6&&(c==0||c==6))||(0<=c&&c<=6&&(r==0||r==6))||(2<=r&&r<=4&&2<=c&&c<=4)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}},getBestMaskPattern:function(){var minLostPoint=0;var pattern=0;for(var i=0;i<8;i++){this.makeImpl(true,i);var lostPoint=QRUtil.getLostPoint(this);if(i==0||minLostPoint>lostPoint){minLostPoint=lostPoint;pattern=i;}}
|
||||||
|
return pattern;},createMovieClip:function(target_mc,instance_name,depth){var qr_mc=target_mc.createEmptyMovieClip(instance_name,depth);var cs=1;this.make();for(var row=0;row<this.modules.length;row++){var y=row*cs;for(var col=0;col<this.modules[row].length;col++){var x=col*cs;var dark=this.modules[row][col];if(dark){qr_mc.beginFill(0,100);qr_mc.moveTo(x,y);qr_mc.lineTo(x+cs,y);qr_mc.lineTo(x+cs,y+cs);qr_mc.lineTo(x,y+cs);qr_mc.endFill();}}}
|
||||||
|
return qr_mc;},setupTimingPattern:function(){for(var r=8;r<this.moduleCount-8;r++){if(this.modules[r][6]!=null){continue;}
|
||||||
|
this.modules[r][6]=(r%2==0);}
|
||||||
|
for(var c=8;c<this.moduleCount-8;c++){if(this.modules[6][c]!=null){continue;}
|
||||||
|
this.modules[6][c]=(c%2==0);}},setupPositionAdjustPattern:function(){var pos=QRUtil.getPatternPosition(this.typeNumber);for(var i=0;i<pos.length;i++){for(var j=0;j<pos.length;j++){var row=pos[i];var col=pos[j];if(this.modules[row][col]!=null){continue;}
|
||||||
|
for(var r=-2;r<=2;r++){for(var c=-2;c<=2;c++){if(r==-2||r==2||c==-2||c==2||(r==0&&c==0)){this.modules[row+r][col+c]=true;}else{this.modules[row+r][col+c]=false;}}}}}},setupTypeNumber:function(test){var bits=QRUtil.getBCHTypeNumber(this.typeNumber);for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[Math.floor(i/3)][i%3+this.moduleCount-8-3]=mod;}
|
||||||
|
for(var i=0;i<18;i++){var mod=(!test&&((bits>>i)&1)==1);this.modules[i%3+this.moduleCount-8-3][Math.floor(i/3)]=mod;}},setupTypeInfo:function(test,maskPattern){var data=(this.errorCorrectLevel<<3)|maskPattern;var bits=QRUtil.getBCHTypeInfo(data);for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<6){this.modules[i][8]=mod;}else if(i<8){this.modules[i+1][8]=mod;}else{this.modules[this.moduleCount-15+i][8]=mod;}}
|
||||||
|
for(var i=0;i<15;i++){var mod=(!test&&((bits>>i)&1)==1);if(i<8){this.modules[8][this.moduleCount-i-1]=mod;}else if(i<9){this.modules[8][15-i-1+1]=mod;}else{this.modules[8][15-i-1]=mod;}}
|
||||||
|
this.modules[this.moduleCount-8][8]=(!test);},mapData:function(data,maskPattern){var inc=-1;var row=this.moduleCount-1;var bitIndex=7;var byteIndex=0;for(var col=this.moduleCount-1;col>0;col-=2){if(col==6)col--;while(true){for(var c=0;c<2;c++){if(this.modules[row][col-c]==null){var dark=false;if(byteIndex<data.length){dark=(((data[byteIndex]>>>bitIndex)&1)==1);}
|
||||||
|
var mask=QRUtil.getMask(maskPattern,row,col-c);if(mask){dark=!dark;}
|
||||||
|
this.modules[row][col-c]=dark;bitIndex--;if(bitIndex==-1){byteIndex++;bitIndex=7;}}}
|
||||||
|
row+=inc;if(row<0||this.moduleCount<=row){row-=inc;inc=-inc;break;}}}}};QRCodeModel.PAD0=0xEC;QRCodeModel.PAD1=0x11;QRCodeModel.createData=function(typeNumber,errorCorrectLevel,dataList){var rsBlocks=QRRSBlock.getRSBlocks(typeNumber,errorCorrectLevel);var buffer=new QRBitBuffer();for(var i=0;i<dataList.length;i++){var data=dataList[i];buffer.put(data.mode,4);buffer.put(data.getLength(),QRUtil.getLengthInBits(data.mode,typeNumber));data.write(buffer);}
|
||||||
|
var totalDataCount=0;for(var i=0;i<rsBlocks.length;i++){totalDataCount+=rsBlocks[i].dataCount;}
|
||||||
|
if(buffer.getLengthInBits()>totalDataCount*8){throw new Error("code length overflow. ("
|
||||||
|
+buffer.getLengthInBits()
|
||||||
|
+">"
|
||||||
|
+totalDataCount*8
|
||||||
|
+")");}
|
||||||
|
if(buffer.getLengthInBits()+4<=totalDataCount*8){buffer.put(0,4);}
|
||||||
|
while(buffer.getLengthInBits()%8!=0){buffer.putBit(false);}
|
||||||
|
while(true){if(buffer.getLengthInBits()>=totalDataCount*8){break;}
|
||||||
|
buffer.put(QRCodeModel.PAD0,8);if(buffer.getLengthInBits()>=totalDataCount*8){break;}
|
||||||
|
buffer.put(QRCodeModel.PAD1,8);}
|
||||||
|
return QRCodeModel.createBytes(buffer,rsBlocks);};QRCodeModel.createBytes=function(buffer,rsBlocks){var offset=0;var maxDcCount=0;var maxEcCount=0;var dcdata=new Array(rsBlocks.length);var ecdata=new Array(rsBlocks.length);for(var r=0;r<rsBlocks.length;r++){var dcCount=rsBlocks[r].dataCount;var ecCount=rsBlocks[r].totalCount-dcCount;maxDcCount=Math.max(maxDcCount,dcCount);maxEcCount=Math.max(maxEcCount,ecCount);dcdata[r]=new Array(dcCount);for(var i=0;i<dcdata[r].length;i++){dcdata[r][i]=0xff&buffer.buffer[i+offset];}
|
||||||
|
offset+=dcCount;var rsPoly=QRUtil.getErrorCorrectPolynomial(ecCount);var rawPoly=new QRPolynomial(dcdata[r],rsPoly.getLength()-1);var modPoly=rawPoly.mod(rsPoly);ecdata[r]=new Array(rsPoly.getLength()-1);for(var i=0;i<ecdata[r].length;i++){var modIndex=i+modPoly.getLength()-ecdata[r].length;ecdata[r][i]=(modIndex>=0)?modPoly.get(modIndex):0;}}
|
||||||
|
var totalCodeCount=0;for(var i=0;i<rsBlocks.length;i++){totalCodeCount+=rsBlocks[i].totalCount;}
|
||||||
|
var data=new Array(totalCodeCount);var index=0;for(var i=0;i<maxDcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<dcdata[r].length){data[index++]=dcdata[r][i];}}}
|
||||||
|
for(var i=0;i<maxEcCount;i++){for(var r=0;r<rsBlocks.length;r++){if(i<ecdata[r].length){data[index++]=ecdata[r][i];}}}
|
||||||
|
return data;};var QRMode={MODE_NUMBER:1<<0,MODE_ALPHA_NUM:1<<1,MODE_8BIT_BYTE:1<<2,MODE_KANJI:1<<3};var QRErrorCorrectLevel={L:1,M:0,Q:3,H:2};var QRMaskPattern={PATTERN000:0,PATTERN001:1,PATTERN010:2,PATTERN011:3,PATTERN100:4,PATTERN101:5,PATTERN110:6,PATTERN111:7};var QRUtil={PATTERN_POSITION_TABLE:[[],[6,18],[6,22],[6,26],[6,30],[6,34],[6,22,38],[6,24,42],[6,26,46],[6,28,50],[6,30,54],[6,32,58],[6,34,62],[6,26,46,66],[6,26,48,70],[6,26,50,74],[6,30,54,78],[6,30,56,82],[6,30,58,86],[6,34,62,90],[6,28,50,72,94],[6,26,50,74,98],[6,30,54,78,102],[6,28,54,80,106],[6,32,58,84,110],[6,30,58,86,114],[6,34,62,90,118],[6,26,50,74,98,122],[6,30,54,78,102,126],[6,26,52,78,104,130],[6,30,56,82,108,134],[6,34,60,86,112,138],[6,30,58,86,114,142],[6,34,62,90,118,146],[6,30,54,78,102,126,150],[6,24,50,76,102,128,154],[6,28,54,80,106,132,158],[6,32,58,84,110,136,162],[6,26,54,82,110,138,166],[6,30,58,86,114,142,170]],G15:(1<<10)|(1<<8)|(1<<5)|(1<<4)|(1<<2)|(1<<1)|(1<<0),G18:(1<<12)|(1<<11)|(1<<10)|(1<<9)|(1<<8)|(1<<5)|(1<<2)|(1<<0),G15_MASK:(1<<14)|(1<<12)|(1<<10)|(1<<4)|(1<<1),getBCHTypeInfo:function(data){var d=data<<10;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)>=0){d^=(QRUtil.G15<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G15)));}
|
||||||
|
return((data<<10)|d)^QRUtil.G15_MASK;},getBCHTypeNumber:function(data){var d=data<<12;while(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)>=0){d^=(QRUtil.G18<<(QRUtil.getBCHDigit(d)-QRUtil.getBCHDigit(QRUtil.G18)));}
|
||||||
|
return(data<<12)|d;},getBCHDigit:function(data){var digit=0;while(data!=0){digit++;data>>>=1;}
|
||||||
|
return digit;},getPatternPosition:function(typeNumber){return QRUtil.PATTERN_POSITION_TABLE[typeNumber-1];},getMask:function(maskPattern,i,j){switch(maskPattern){case QRMaskPattern.PATTERN000:return(i+j)%2==0;case QRMaskPattern.PATTERN001:return i%2==0;case QRMaskPattern.PATTERN010:return j%3==0;case QRMaskPattern.PATTERN011:return(i+j)%3==0;case QRMaskPattern.PATTERN100:return(Math.floor(i/2)+Math.floor(j/3))%2==0;case QRMaskPattern.PATTERN101:return(i*j)%2+(i*j)%3==0;case QRMaskPattern.PATTERN110:return((i*j)%2+(i*j)%3)%2==0;case QRMaskPattern.PATTERN111:return((i*j)%3+(i+j)%2)%2==0;default:throw new Error("bad maskPattern:"+maskPattern);}},getErrorCorrectPolynomial:function(errorCorrectLength){var a=new QRPolynomial([1],0);for(var i=0;i<errorCorrectLength;i++){a=a.multiply(new QRPolynomial([1,QRMath.gexp(i)],0));}
|
||||||
|
return a;},getLengthInBits:function(mode,type){if(1<=type&&type<10){switch(mode){case QRMode.MODE_NUMBER:return 10;case QRMode.MODE_ALPHA_NUM:return 9;case QRMode.MODE_8BIT_BYTE:return 8;case QRMode.MODE_KANJI:return 8;default:throw new Error("mode:"+mode);}}else if(type<27){switch(mode){case QRMode.MODE_NUMBER:return 12;case QRMode.MODE_ALPHA_NUM:return 11;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 10;default:throw new Error("mode:"+mode);}}else if(type<41){switch(mode){case QRMode.MODE_NUMBER:return 14;case QRMode.MODE_ALPHA_NUM:return 13;case QRMode.MODE_8BIT_BYTE:return 16;case QRMode.MODE_KANJI:return 12;default:throw new Error("mode:"+mode);}}else{throw new Error("type:"+type);}},getLostPoint:function(qrCode){var moduleCount=qrCode.getModuleCount();var lostPoint=0;for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount;col++){var sameCount=0;var dark=qrCode.isDark(row,col);for(var r=-1;r<=1;r++){if(row+r<0||moduleCount<=row+r){continue;}
|
||||||
|
for(var c=-1;c<=1;c++){if(col+c<0||moduleCount<=col+c){continue;}
|
||||||
|
if(r==0&&c==0){continue;}
|
||||||
|
if(dark==qrCode.isDark(row+r,col+c)){sameCount++;}}}
|
||||||
|
if(sameCount>5){lostPoint+=(3+sameCount-5);}}}
|
||||||
|
for(var row=0;row<moduleCount-1;row++){for(var col=0;col<moduleCount-1;col++){var count=0;if(qrCode.isDark(row,col))count++;if(qrCode.isDark(row+1,col))count++;if(qrCode.isDark(row,col+1))count++;if(qrCode.isDark(row+1,col+1))count++;if(count==0||count==4){lostPoint+=3;}}}
|
||||||
|
for(var row=0;row<moduleCount;row++){for(var col=0;col<moduleCount-6;col++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row,col+1)&&qrCode.isDark(row,col+2)&&qrCode.isDark(row,col+3)&&qrCode.isDark(row,col+4)&&!qrCode.isDark(row,col+5)&&qrCode.isDark(row,col+6)){lostPoint+=40;}}}
|
||||||
|
for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount-6;row++){if(qrCode.isDark(row,col)&&!qrCode.isDark(row+1,col)&&qrCode.isDark(row+2,col)&&qrCode.isDark(row+3,col)&&qrCode.isDark(row+4,col)&&!qrCode.isDark(row+5,col)&&qrCode.isDark(row+6,col)){lostPoint+=40;}}}
|
||||||
|
var darkCount=0;for(var col=0;col<moduleCount;col++){for(var row=0;row<moduleCount;row++){if(qrCode.isDark(row,col)){darkCount++;}}}
|
||||||
|
var ratio=Math.abs(100*darkCount/moduleCount/moduleCount-50)/5;lostPoint+=ratio*10;return lostPoint;}};var QRMath={glog:function(n){if(n<1){throw new Error("glog("+n+")");}
|
||||||
|
return QRMath.LOG_TABLE[n];},gexp:function(n){while(n<0){n+=255;}
|
||||||
|
while(n>=256){n-=255;}
|
||||||
|
return QRMath.EXP_TABLE[n];},EXP_TABLE:new Array(256),LOG_TABLE:new Array(256)};for(var i=0;i<8;i++){QRMath.EXP_TABLE[i]=1<<i;}
|
||||||
|
for(var i=8;i<256;i++){QRMath.EXP_TABLE[i]=QRMath.EXP_TABLE[i-4]^QRMath.EXP_TABLE[i-5]^QRMath.EXP_TABLE[i-6]^QRMath.EXP_TABLE[i-8];}
|
||||||
|
for(var i=0;i<255;i++){QRMath.LOG_TABLE[QRMath.EXP_TABLE[i]]=i;}
|
||||||
|
function QRPolynomial(num,shift){if(num.length==undefined){throw new Error(num.length+"/"+shift);}
|
||||||
|
var offset=0;while(offset<num.length&&num[offset]==0){offset++;}
|
||||||
|
this.num=new Array(num.length-offset+shift);for(var i=0;i<num.length-offset;i++){this.num[i]=num[i+offset];}}
|
||||||
|
QRPolynomial.prototype={get:function(index){return this.num[index];},getLength:function(){return this.num.length;},multiply:function(e){var num=new Array(this.getLength()+e.getLength()-1);for(var i=0;i<this.getLength();i++){for(var j=0;j<e.getLength();j++){num[i+j]^=QRMath.gexp(QRMath.glog(this.get(i))+QRMath.glog(e.get(j)));}}
|
||||||
|
return new QRPolynomial(num,0);},mod:function(e){if(this.getLength()-e.getLength()<0){return this;}
|
||||||
|
var ratio=QRMath.glog(this.get(0))-QRMath.glog(e.get(0));var num=new Array(this.getLength());for(var i=0;i<this.getLength();i++){num[i]=this.get(i);}
|
||||||
|
for(var i=0;i<e.getLength();i++){num[i]^=QRMath.gexp(QRMath.glog(e.get(i))+ratio);}
|
||||||
|
return new QRPolynomial(num,0).mod(e);}};function QRRSBlock(totalCount,dataCount){this.totalCount=totalCount;this.dataCount=dataCount;}
|
||||||
|
QRRSBlock.RS_BLOCK_TABLE=[[1,26,19],[1,26,16],[1,26,13],[1,26,9],[1,44,34],[1,44,28],[1,44,22],[1,44,16],[1,70,55],[1,70,44],[2,35,17],[2,35,13],[1,100,80],[2,50,32],[2,50,24],[4,25,9],[1,134,108],[2,67,43],[2,33,15,2,34,16],[2,33,11,2,34,12],[2,86,68],[4,43,27],[4,43,19],[4,43,15],[2,98,78],[4,49,31],[2,32,14,4,33,15],[4,39,13,1,40,14],[2,121,97],[2,60,38,2,61,39],[4,40,18,2,41,19],[4,40,14,2,41,15],[2,146,116],[3,58,36,2,59,37],[4,36,16,4,37,17],[4,36,12,4,37,13],[2,86,68,2,87,69],[4,69,43,1,70,44],[6,43,19,2,44,20],[6,43,15,2,44,16],[4,101,81],[1,80,50,4,81,51],[4,50,22,4,51,23],[3,36,12,8,37,13],[2,116,92,2,117,93],[6,58,36,2,59,37],[4,46,20,6,47,21],[7,42,14,4,43,15],[4,133,107],[8,59,37,1,60,38],[8,44,20,4,45,21],[12,33,11,4,34,12],[3,145,115,1,146,116],[4,64,40,5,65,41],[11,36,16,5,37,17],[11,36,12,5,37,13],[5,109,87,1,110,88],[5,65,41,5,66,42],[5,54,24,7,55,25],[11,36,12],[5,122,98,1,123,99],[7,73,45,3,74,46],[15,43,19,2,44,20],[3,45,15,13,46,16],[1,135,107,5,136,108],[10,74,46,1,75,47],[1,50,22,15,51,23],[2,42,14,17,43,15],[5,150,120,1,151,121],[9,69,43,4,70,44],[17,50,22,1,51,23],[2,42,14,19,43,15],[3,141,113,4,142,114],[3,70,44,11,71,45],[17,47,21,4,48,22],[9,39,13,16,40,14],[3,135,107,5,136,108],[3,67,41,13,68,42],[15,54,24,5,55,25],[15,43,15,10,44,16],[4,144,116,4,145,117],[17,68,42],[17,50,22,6,51,23],[19,46,16,6,47,17],[2,139,111,7,140,112],[17,74,46],[7,54,24,16,55,25],[34,37,13],[4,151,121,5,152,122],[4,75,47,14,76,48],[11,54,24,14,55,25],[16,45,15,14,46,16],[6,147,117,4,148,118],[6,73,45,14,74,46],[11,54,24,16,55,25],[30,46,16,2,47,17],[8,132,106,4,133,107],[8,75,47,13,76,48],[7,54,24,22,55,25],[22,45,15,13,46,16],[10,142,114,2,143,115],[19,74,46,4,75,47],[28,50,22,6,51,23],[33,46,16,4,47,17],[8,152,122,4,153,123],[22,73,45,3,74,46],[8,53,23,26,54,24],[12,45,15,28,46,16],[3,147,117,10,148,118],[3,73,45,23,74,46],[4,54,24,31,55,25],[11,45,15,31,46,16],[7,146,116,7,147,117],[21,73,45,7,74,46],[1,53,23,37,54,24],[19,45,15,26,46,16],[5,145,115,10,146,116],[19,75,47,10,76,48],[15,54,24,25,55,25],[23,45,15,25,46,16],[13,145,115,3,146,116],[2,74,46,29,75,47],[42,54,24,1,55,25],[23,45,15,28,46,16],[17,145,115],[10,74,46,23,75,47],[10,54,24,35,55,25],[19,45,15,35,46,16],[17,145,115,1,146,116],[14,74,46,21,75,47],[29,54,24,19,55,25],[11,45,15,46,46,16],[13,145,115,6,146,116],[14,74,46,23,75,47],[44,54,24,7,55,25],[59,46,16,1,47,17],[12,151,121,7,152,122],[12,75,47,26,76,48],[39,54,24,14,55,25],[22,45,15,41,46,16],[6,151,121,14,152,122],[6,75,47,34,76,48],[46,54,24,10,55,25],[2,45,15,64,46,16],[17,152,122,4,153,123],[29,74,46,14,75,47],[49,54,24,10,55,25],[24,45,15,46,46,16],[4,152,122,18,153,123],[13,74,46,32,75,47],[48,54,24,14,55,25],[42,45,15,32,46,16],[20,147,117,4,148,118],[40,75,47,7,76,48],[43,54,24,22,55,25],[10,45,15,67,46,16],[19,148,118,6,149,119],[18,75,47,31,76,48],[34,54,24,34,55,25],[20,45,15,61,46,16]];QRRSBlock.getRSBlocks=function(typeNumber,errorCorrectLevel){var rsBlock=QRRSBlock.getRsBlockTable(typeNumber,errorCorrectLevel);if(rsBlock==undefined){throw new Error("bad rs block @ typeNumber:"+typeNumber+"/errorCorrectLevel:"+errorCorrectLevel);}
|
||||||
|
var length=rsBlock.length/3;var list=[];for(var i=0;i<length;i++){var count=rsBlock[i*3+0];var totalCount=rsBlock[i*3+1];var dataCount=rsBlock[i*3+2];for(var j=0;j<count;j++){list.push(new QRRSBlock(totalCount,dataCount));}}
|
||||||
|
return list;};QRRSBlock.getRsBlockTable=function(typeNumber,errorCorrectLevel){switch(errorCorrectLevel){case QRErrorCorrectLevel.L:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+0];case QRErrorCorrectLevel.M:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+1];case QRErrorCorrectLevel.Q:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+2];case QRErrorCorrectLevel.H:return QRRSBlock.RS_BLOCK_TABLE[(typeNumber-1)*4+3];default:return undefined;}};function QRBitBuffer(){this.buffer=[];this.length=0;}
|
||||||
|
QRBitBuffer.prototype={get:function(index){var bufIndex=Math.floor(index/8);return((this.buffer[bufIndex]>>>(7-index%8))&1)==1;},put:function(num,length){for(var i=0;i<length;i++){this.putBit(((num>>>(length-i-1))&1)==1);}},getLengthInBits:function(){return this.length;},putBit:function(bit){var bufIndex=Math.floor(this.length/8);if(this.buffer.length<=bufIndex){this.buffer.push(0);}
|
||||||
|
if(bit){this.buffer[bufIndex]|=(0x80>>>(this.length%8));}
|
||||||
|
this.length++;}};var QRCodeLimitLength=[[17,14,11,7],[32,26,20,14],[53,42,32,24],[78,62,46,34],[106,84,60,44],[134,106,74,58],[154,122,86,64],[192,152,108,84],[230,180,130,98],[271,213,151,119],[321,251,177,137],[367,287,203,155],[425,331,241,177],[458,362,258,194],[520,412,292,220],[586,450,322,250],[644,504,364,280],[718,560,394,310],[792,624,442,338],[858,666,482,382],[929,711,509,403],[1003,779,565,439],[1091,857,611,461],[1171,911,661,511],[1273,997,715,535],[1367,1059,751,593],[1465,1125,805,625],[1528,1190,868,658],[1628,1264,908,698],[1732,1370,982,742],[1840,1452,1030,790],[1952,1538,1112,842],[2068,1628,1168,898],[2188,1722,1228,958],[2303,1809,1283,983],[2431,1911,1351,1051],[2563,1989,1423,1093],[2699,2099,1499,1139],[2809,2213,1579,1219],[2953,2331,1663,1273]];
|
||||||
|
|
||||||
|
function _isSupportCanvas() {
|
||||||
|
return typeof CanvasRenderingContext2D != "undefined";
|
||||||
|
}
|
||||||
|
|
||||||
|
// android 2.x doesn't support Data-URI spec
|
||||||
|
function _getAndroid() {
|
||||||
|
var android = false;
|
||||||
|
var sAgent = navigator.userAgent;
|
||||||
|
|
||||||
|
if (/android/i.test(sAgent)) { // android
|
||||||
|
android = true;
|
||||||
|
var aMat = sAgent.toString().match(/android ([0-9]\.[0-9])/i);
|
||||||
|
|
||||||
|
if (aMat && aMat[1]) {
|
||||||
|
android = parseFloat(aMat[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return android;
|
||||||
|
}
|
||||||
|
|
||||||
|
var svgDrawer = (function() {
|
||||||
|
|
||||||
|
var Drawing = function (el, htOption) {
|
||||||
|
this._el = el;
|
||||||
|
this._htOption = htOption;
|
||||||
|
};
|
||||||
|
|
||||||
|
Drawing.prototype.draw = function (oQRCode) {
|
||||||
|
var _htOption = this._htOption;
|
||||||
|
var _el = this._el;
|
||||||
|
var nCount = oQRCode.getModuleCount();
|
||||||
|
var nWidth = Math.floor(_htOption.width / nCount);
|
||||||
|
var nHeight = Math.floor(_htOption.height / nCount);
|
||||||
|
|
||||||
|
this.clear();
|
||||||
|
|
||||||
|
function makeSVG(tag, attrs) {
|
||||||
|
var el = document.createElementNS('http://www.w3.org/2000/svg', tag);
|
||||||
|
for (var k in attrs)
|
||||||
|
if (attrs.hasOwnProperty(k)) el.setAttribute(k, attrs[k]);
|
||||||
|
return el;
|
||||||
|
}
|
||||||
|
|
||||||
|
var svg = makeSVG("svg" , {'viewBox': '0 0 ' + String(nCount) + " " + String(nCount), 'width': '100%', 'height': '100%', 'fill': _htOption.colorLight});
|
||||||
|
svg.setAttributeNS("http://www.w3.org/2000/xmlns/", "xmlns:xlink", "http://www.w3.org/1999/xlink");
|
||||||
|
_el.appendChild(svg);
|
||||||
|
|
||||||
|
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorLight, "width": "100%", "height": "100%"}));
|
||||||
|
svg.appendChild(makeSVG("rect", {"fill": _htOption.colorDark, "width": "1", "height": "1", "id": "template"}));
|
||||||
|
|
||||||
|
for (var row = 0; row < nCount; row++) {
|
||||||
|
for (var col = 0; col < nCount; col++) {
|
||||||
|
if (oQRCode.isDark(row, col)) {
|
||||||
|
var child = makeSVG("use", {"x": String(col), "y": String(row)});
|
||||||
|
child.setAttributeNS("http://www.w3.org/1999/xlink", "href", "#template")
|
||||||
|
svg.appendChild(child);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Drawing.prototype.clear = function () {
|
||||||
|
while (this._el.hasChildNodes())
|
||||||
|
this._el.removeChild(this._el.lastChild);
|
||||||
|
};
|
||||||
|
return Drawing;
|
||||||
|
})();
|
||||||
|
|
||||||
|
var useSVG = document.documentElement.tagName.toLowerCase() === "svg";
|
||||||
|
|
||||||
|
// Drawing in DOM by using Table tag
|
||||||
|
var Drawing = useSVG ? svgDrawer : !_isSupportCanvas() ? (function () {
|
||||||
|
var Drawing = function (el, htOption) {
|
||||||
|
this._el = el;
|
||||||
|
this._htOption = htOption;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw the QRCode
|
||||||
|
*
|
||||||
|
* @param {QRCode} oQRCode
|
||||||
|
*/
|
||||||
|
Drawing.prototype.draw = function (oQRCode) {
|
||||||
|
var _htOption = this._htOption;
|
||||||
|
var _el = this._el;
|
||||||
|
var nCount = oQRCode.getModuleCount();
|
||||||
|
var nWidth = Math.floor(_htOption.width / nCount);
|
||||||
|
var nHeight = Math.floor(_htOption.height / nCount);
|
||||||
|
var aHTML = ['<table style="border:0;border-collapse:collapse;">'];
|
||||||
|
|
||||||
|
for (var row = 0; row < nCount; row++) {
|
||||||
|
aHTML.push('<tr>');
|
||||||
|
|
||||||
|
for (var col = 0; col < nCount; col++) {
|
||||||
|
aHTML.push('<td style="border:0;border-collapse:collapse;padding:0;margin:0;width:' + nWidth + 'px;height:' + nHeight + 'px;background-color:' + (oQRCode.isDark(row, col) ? _htOption.colorDark : _htOption.colorLight) + ';"></td>');
|
||||||
|
}
|
||||||
|
|
||||||
|
aHTML.push('</tr>');
|
||||||
|
}
|
||||||
|
|
||||||
|
aHTML.push('</table>');
|
||||||
|
_el.innerHTML = aHTML.join('');
|
||||||
|
|
||||||
|
// Fix the margin values as real size.
|
||||||
|
var elTable = _el.childNodes[0];
|
||||||
|
var nLeftMarginTable = (_htOption.width - elTable.offsetWidth) / 2;
|
||||||
|
var nTopMarginTable = (_htOption.height - elTable.offsetHeight) / 2;
|
||||||
|
|
||||||
|
if (nLeftMarginTable > 0 && nTopMarginTable > 0) {
|
||||||
|
elTable.style.margin = nTopMarginTable + "px " + nLeftMarginTable + "px";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the QRCode
|
||||||
|
*/
|
||||||
|
Drawing.prototype.clear = function () {
|
||||||
|
this._el.innerHTML = '';
|
||||||
|
};
|
||||||
|
|
||||||
|
return Drawing;
|
||||||
|
})() : (function () { // Drawing in Canvas
|
||||||
|
function _onMakeImage() {
|
||||||
|
this._elImage.src = this._elCanvas.toDataURL("image/png");
|
||||||
|
this._elImage.style.display = "inline-block";
|
||||||
|
this._elCanvas.style.display = "none";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Android 2.1 bug workaround
|
||||||
|
// http://code.google.com/p/android/issues/detail?id=5141
|
||||||
|
if (this._android && this._android <= 2.1) {
|
||||||
|
var factor = 1 / window.devicePixelRatio;
|
||||||
|
var drawImage = CanvasRenderingContext2D.prototype.drawImage;
|
||||||
|
CanvasRenderingContext2D.prototype.drawImage = function (image, sx, sy, sw, sh, dx, dy, dw, dh) {
|
||||||
|
if (("nodeName" in image) && /img/i.test(image.nodeName)) {
|
||||||
|
for (var i = arguments.length - 1; i >= 1; i--) {
|
||||||
|
arguments[i] = arguments[i] * factor;
|
||||||
|
}
|
||||||
|
} else if (typeof dw == "undefined") {
|
||||||
|
arguments[1] *= factor;
|
||||||
|
arguments[2] *= factor;
|
||||||
|
arguments[3] *= factor;
|
||||||
|
arguments[4] *= factor;
|
||||||
|
}
|
||||||
|
|
||||||
|
drawImage.apply(this, arguments);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether the user's browser supports Data URI or not
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {Function} fSuccess Occurs if it supports Data URI
|
||||||
|
* @param {Function} fFail Occurs if it doesn't support Data URI
|
||||||
|
*/
|
||||||
|
function _safeSetDataURI(fSuccess, fFail) {
|
||||||
|
var self = this;
|
||||||
|
self._fFail = fFail;
|
||||||
|
self._fSuccess = fSuccess;
|
||||||
|
|
||||||
|
// Check it just once
|
||||||
|
if (self._bSupportDataURI === null) {
|
||||||
|
var el = document.createElement("img");
|
||||||
|
var fOnError = function() {
|
||||||
|
self._bSupportDataURI = false;
|
||||||
|
|
||||||
|
if (self._fFail) {
|
||||||
|
self._fFail.call(self);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var fOnSuccess = function() {
|
||||||
|
self._bSupportDataURI = true;
|
||||||
|
|
||||||
|
if (self._fSuccess) {
|
||||||
|
self._fSuccess.call(self);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
el.onabort = fOnError;
|
||||||
|
el.onerror = fOnError;
|
||||||
|
el.onload = fOnSuccess;
|
||||||
|
el.src = "data:image/gif;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg=="; // the Image contains 1px data.
|
||||||
|
return;
|
||||||
|
} else if (self._bSupportDataURI === true && self._fSuccess) {
|
||||||
|
self._fSuccess.call(self);
|
||||||
|
} else if (self._bSupportDataURI === false && self._fFail) {
|
||||||
|
self._fFail.call(self);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Drawing QRCode by using canvas
|
||||||
|
*
|
||||||
|
* @constructor
|
||||||
|
* @param {HTMLElement} el
|
||||||
|
* @param {Object} htOption QRCode Options
|
||||||
|
*/
|
||||||
|
var Drawing = function (el, htOption) {
|
||||||
|
this._bIsPainted = false;
|
||||||
|
this._android = _getAndroid();
|
||||||
|
|
||||||
|
this._htOption = htOption;
|
||||||
|
this._elCanvas = document.createElement("canvas");
|
||||||
|
this._elCanvas.width = htOption.width;
|
||||||
|
this._elCanvas.height = htOption.height;
|
||||||
|
el.appendChild(this._elCanvas);
|
||||||
|
this._el = el;
|
||||||
|
this._oContext = this._elCanvas.getContext("2d");
|
||||||
|
this._bIsPainted = false;
|
||||||
|
this._elImage = document.createElement("img");
|
||||||
|
this._elImage.alt = "Scan me!";
|
||||||
|
this._elImage.style.display = "none";
|
||||||
|
this._el.appendChild(this._elImage);
|
||||||
|
this._bSupportDataURI = null;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Draw the QRCode
|
||||||
|
*
|
||||||
|
* @param {QRCode} oQRCode
|
||||||
|
*/
|
||||||
|
Drawing.prototype.draw = function (oQRCode) {
|
||||||
|
var _elImage = this._elImage;
|
||||||
|
var _oContext = this._oContext;
|
||||||
|
var _htOption = this._htOption;
|
||||||
|
|
||||||
|
var nCount = oQRCode.getModuleCount();
|
||||||
|
var nWidth = _htOption.width / nCount;
|
||||||
|
var nHeight = _htOption.height / nCount;
|
||||||
|
var nRoundedWidth = Math.round(nWidth);
|
||||||
|
var nRoundedHeight = Math.round(nHeight);
|
||||||
|
|
||||||
|
_elImage.style.display = "none";
|
||||||
|
this.clear();
|
||||||
|
|
||||||
|
for (var row = 0; row < nCount; row++) {
|
||||||
|
for (var col = 0; col < nCount; col++) {
|
||||||
|
var bIsDark = oQRCode.isDark(row, col);
|
||||||
|
var nLeft = col * nWidth;
|
||||||
|
var nTop = row * nHeight;
|
||||||
|
_oContext.strokeStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
|
||||||
|
_oContext.lineWidth = 1;
|
||||||
|
_oContext.fillStyle = bIsDark ? _htOption.colorDark : _htOption.colorLight;
|
||||||
|
_oContext.fillRect(nLeft, nTop, nWidth, nHeight);
|
||||||
|
|
||||||
|
// 안티 앨리어싱 방지 처리
|
||||||
|
_oContext.strokeRect(
|
||||||
|
Math.floor(nLeft) + 0.5,
|
||||||
|
Math.floor(nTop) + 0.5,
|
||||||
|
nRoundedWidth,
|
||||||
|
nRoundedHeight
|
||||||
|
);
|
||||||
|
|
||||||
|
_oContext.strokeRect(
|
||||||
|
Math.ceil(nLeft) - 0.5,
|
||||||
|
Math.ceil(nTop) - 0.5,
|
||||||
|
nRoundedWidth,
|
||||||
|
nRoundedHeight
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this._bIsPainted = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make the image from Canvas if the browser supports Data URI.
|
||||||
|
*/
|
||||||
|
Drawing.prototype.makeImage = function () {
|
||||||
|
if (this._bIsPainted) {
|
||||||
|
_safeSetDataURI.call(this, _onMakeImage);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return whether the QRCode is painted or not
|
||||||
|
*
|
||||||
|
* @return {Boolean}
|
||||||
|
*/
|
||||||
|
Drawing.prototype.isPainted = function () {
|
||||||
|
return this._bIsPainted;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the QRCode
|
||||||
|
*/
|
||||||
|
Drawing.prototype.clear = function () {
|
||||||
|
this._oContext.clearRect(0, 0, this._elCanvas.width, this._elCanvas.height);
|
||||||
|
this._bIsPainted = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @private
|
||||||
|
* @param {Number} nNumber
|
||||||
|
*/
|
||||||
|
Drawing.prototype.round = function (nNumber) {
|
||||||
|
if (!nNumber) {
|
||||||
|
return nNumber;
|
||||||
|
}
|
||||||
|
|
||||||
|
return Math.floor(nNumber * 1000) / 1000;
|
||||||
|
};
|
||||||
|
|
||||||
|
return Drawing;
|
||||||
|
})();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the type by string length
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
* @param {String} sText
|
||||||
|
* @param {Number} nCorrectLevel
|
||||||
|
* @return {Number} type
|
||||||
|
*/
|
||||||
|
function _getTypeNumber(sText, nCorrectLevel) {
|
||||||
|
var nType = 1;
|
||||||
|
var length = _getUTF8Length(sText);
|
||||||
|
|
||||||
|
for (var i = 0, len = QRCodeLimitLength.length; i <= len; i++) {
|
||||||
|
var nLimit = 0;
|
||||||
|
|
||||||
|
switch (nCorrectLevel) {
|
||||||
|
case QRErrorCorrectLevel.L :
|
||||||
|
nLimit = QRCodeLimitLength[i][0];
|
||||||
|
break;
|
||||||
|
case QRErrorCorrectLevel.M :
|
||||||
|
nLimit = QRCodeLimitLength[i][1];
|
||||||
|
break;
|
||||||
|
case QRErrorCorrectLevel.Q :
|
||||||
|
nLimit = QRCodeLimitLength[i][2];
|
||||||
|
break;
|
||||||
|
case QRErrorCorrectLevel.H :
|
||||||
|
nLimit = QRCodeLimitLength[i][3];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (length <= nLimit) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
nType++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nType > QRCodeLimitLength.length) {
|
||||||
|
throw new Error("Too long data");
|
||||||
|
}
|
||||||
|
|
||||||
|
return nType;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _getUTF8Length(sText) {
|
||||||
|
var replacedText = encodeURI(sText).toString().replace(/\%[0-9a-fA-F]{2}/g, 'a');
|
||||||
|
return replacedText.length + (replacedText.length != sText ? 3 : 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class QRCode
|
||||||
|
* @constructor
|
||||||
|
* @example
|
||||||
|
* new QRCode(document.getElementById("test"), "http://jindo.dev.naver.com/collie");
|
||||||
|
*
|
||||||
|
* @example
|
||||||
|
* var oQRCode = new QRCode("test", {
|
||||||
|
* text : "http://naver.com",
|
||||||
|
* width : 128,
|
||||||
|
* height : 128
|
||||||
|
* });
|
||||||
|
*
|
||||||
|
* oQRCode.clear(); // Clear the QRCode.
|
||||||
|
* oQRCode.makeCode("http://map.naver.com"); // Re-create the QRCode.
|
||||||
|
*
|
||||||
|
* @param {HTMLElement|String} el target element or 'id' attribute of element.
|
||||||
|
* @param {Object|String} vOption
|
||||||
|
* @param {String} vOption.text QRCode link data
|
||||||
|
* @param {Number} [vOption.width=256]
|
||||||
|
* @param {Number} [vOption.height=256]
|
||||||
|
* @param {String} [vOption.colorDark="#000000"]
|
||||||
|
* @param {String} [vOption.colorLight="#ffffff"]
|
||||||
|
* @param {QRCode.CorrectLevel} [vOption.correctLevel=QRCode.CorrectLevel.H] [L|M|Q|H]
|
||||||
|
*/
|
||||||
|
QRCode = function (el, vOption) {
|
||||||
|
this._htOption = {
|
||||||
|
width : 256,
|
||||||
|
height : 256,
|
||||||
|
typeNumber : 4,
|
||||||
|
colorDark : "#000000",
|
||||||
|
colorLight : "#ffffff",
|
||||||
|
correctLevel : QRErrorCorrectLevel.H
|
||||||
|
};
|
||||||
|
|
||||||
|
if (typeof vOption === 'string') {
|
||||||
|
vOption = {
|
||||||
|
text : vOption
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// Overwrites options
|
||||||
|
if (vOption) {
|
||||||
|
for (var i in vOption) {
|
||||||
|
this._htOption[i] = vOption[i];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof el == "string") {
|
||||||
|
el = document.getElementById(el);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._htOption.useSVG) {
|
||||||
|
Drawing = svgDrawer;
|
||||||
|
}
|
||||||
|
|
||||||
|
this._android = _getAndroid();
|
||||||
|
this._el = el;
|
||||||
|
this._oQRCode = null;
|
||||||
|
this._oDrawing = new Drawing(this._el, this._htOption);
|
||||||
|
|
||||||
|
if (this._htOption.text) {
|
||||||
|
this.makeCode(this._htOption.text);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make the QRCode
|
||||||
|
*
|
||||||
|
* @param {String} sText link data
|
||||||
|
*/
|
||||||
|
QRCode.prototype.makeCode = function (sText) {
|
||||||
|
this._oQRCode = new QRCodeModel(_getTypeNumber(sText, this._htOption.correctLevel), this._htOption.correctLevel);
|
||||||
|
this._oQRCode.addData(sText);
|
||||||
|
this._oQRCode.make();
|
||||||
|
this._el.title = sText;
|
||||||
|
this._oDrawing.draw(this._oQRCode);
|
||||||
|
this.makeImage();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make the Image from Canvas element
|
||||||
|
* - It occurs automatically
|
||||||
|
* - Android below 3 doesn't support Data-URI spec.
|
||||||
|
*
|
||||||
|
* @private
|
||||||
|
*/
|
||||||
|
QRCode.prototype.makeImage = function () {
|
||||||
|
if (typeof this._oDrawing.makeImage == "function" && (!this._android || this._android >= 3)) {
|
||||||
|
this._oDrawing.makeImage();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clear the QRCode
|
||||||
|
*/
|
||||||
|
QRCode.prototype.clear = function () {
|
||||||
|
this._oDrawing.clear();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @name QRCode.CorrectLevel
|
||||||
|
*/
|
||||||
|
QRCode.CorrectLevel = QRErrorCorrectLevel;
|
||||||
|
})();
|
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Link\Api;
|
||||||
|
|
||||||
|
use Link\Rpc\RpcClient;
|
||||||
|
|
||||||
|
class Push extends Verify
|
||||||
|
{
|
||||||
|
public function start_push(): string
|
||||||
|
{
|
||||||
|
$client = new RpcClient();
|
||||||
|
$client->start_push();
|
||||||
|
return $this->handleRet('','success','推流开启成功','start push successful');
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public function stop_push(): string
|
||||||
|
{
|
||||||
|
$client = new RpcClient();
|
||||||
|
$client->stop_push();
|
||||||
|
return $this->handleRet('','success','推流停止成功','stop push successful');
|
||||||
|
}
|
||||||
|
}
|
|
@ -165,7 +165,7 @@ class Client
|
||||||
* Returns the object handle (so you can chain method calls if you're into
|
* Returns the object handle (so you can chain method calls if you're into
|
||||||
* that kinky stuff)
|
* that kinky stuff)
|
||||||
*/
|
*/
|
||||||
public function query($method, $arguments, &$response)
|
public function query($method, $arguments, &$response = null)
|
||||||
{
|
{
|
||||||
$id = count($this->responses);
|
$id = count($this->responses);
|
||||||
$this->responses[$id] = &$response;
|
$this->responses[$id] = &$response;
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
$type = $argv[1];
|
||||||
|
if(empty($type))
|
||||||
|
exit();
|
||||||
|
|
||||||
|
if($type == "start")
|
||||||
|
$url = "http://127.0.0.1/link/push/start_push";
|
||||||
|
else
|
||||||
|
$url = "http://127.0.0.1/link/push/stop_push";
|
||||||
|
|
||||||
|
$opts = [
|
||||||
|
'http'=>[
|
||||||
|
'method'=>"POST"
|
||||||
|
]
|
||||||
|
];
|
||||||
|
$context = stream_context_create($opts);
|
||||||
|
$json = file_get_contents($url, false, $context);
|
||||||
|
|
|
@ -1,10 +1,28 @@
|
||||||
<?php
|
<?php
|
||||||
include( "head.php" );
|
include( "head.php" );
|
||||||
?>
|
?>
|
||||||
|
<link href="vendor/timepicker/css/bootstrap-timepicker.min.css" rel="stylesheet">
|
||||||
|
<style>
|
||||||
|
.hr-container {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.hr-container .hr-text {
|
||||||
|
position: absolute;
|
||||||
|
top: 1px;
|
||||||
|
left: 50%;
|
||||||
|
transform: translateX(-50%);
|
||||||
|
background-color: #fff;
|
||||||
|
padding: 0 10px;
|
||||||
|
color: grey;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
<div id="alert"></div>
|
<div id="alert"></div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default" style="margin-bottom: 15px;">
|
||||||
<div class="title">
|
<div class="title">
|
||||||
<h3 class="panel-title">
|
<h3 class="panel-title">
|
||||||
<cn>视频预览</cn>
|
<cn>视频预览</cn>
|
||||||
|
@ -12,10 +30,30 @@ include( "head.php" );
|
||||||
<small><cn>推流后可见</cn><en>visible when pushing</en></small>
|
<small><cn>推流后可见</cn><en>visible when pushing</en></small>
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body" style="padding: 20px 15px">
|
||||||
<video id="player" controls muted style="width:100%;height: 294px; background: #555;"></video>
|
<video id="player" controls muted style="width:100%;height: 294px; background: #555;"></video>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<div id="recBar">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-4 text-right" style="line-height: 34px;">
|
||||||
|
<strong id="time">[--:--]</strong>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-4 text-center">
|
||||||
|
<button type="button" id="start" class="btn btn-warning">
|
||||||
|
<i class="fa fa-video-camera"></i>
|
||||||
|
<cn>推流</cn>
|
||||||
|
<en>Push</en>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button type="button" id="stop" class="btn btn-default disabled ">
|
||||||
|
<i class="fa fa-stop"></i>
|
||||||
|
<cn>停止</cn>
|
||||||
|
<en>Stop</en>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="col-md-6">
|
<div class="col-md-6">
|
||||||
<div class="panel panel-default" style="margin-bottom: 16px;">
|
<div class="panel panel-default" style="margin-bottom: 16px;">
|
||||||
|
@ -50,12 +88,81 @@ include( "head.php" );
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
<hr style="margin-top:10px; margin-bottom: 10px;"/>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-md-3 col-sm-4 control-label"><cn>自动运行</cn><en>Autorun</en></label>
|
<label class="col-sm-3 control-label">
|
||||||
<div class="col-md-6 col-sm-8">
|
<cn>定时开启</cn>
|
||||||
<input zcfg="autorun" type="checkbox" class="switch form-control">
|
<en>start time</en>
|
||||||
|
</label>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<select id="start_push_day" class="selectpicker form-control">
|
||||||
|
<option cn="从不" en="never" value="x"></option>
|
||||||
|
<option cn="每天" en="everyday" value="*"></option>
|
||||||
|
<option cn="每周一" en="monday" value="1"></option>
|
||||||
|
<option cn="每周二" en="tuesday" value="2"></option>
|
||||||
|
<option cn="每周三" en="wednesday" value="3"></option>
|
||||||
|
<option cn="每周四" en="thursday" value="4"></option>
|
||||||
|
<option cn="每周五" en="friday" value="5"></option>
|
||||||
|
<option cn="每周六" en="saturday" value="6"></option>
|
||||||
|
<option cn="每周日" en="sunday" value="0"></option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<div class="input-group bootstrap-timepicker timepicker">
|
||||||
|
<input id="start_push_time" type="text" class="form-control input-small">
|
||||||
|
<span class="input-group-addon"><i class="glyphicon glyphicon-time"></i></span>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">
|
||||||
|
<cn>定时结束</cn>
|
||||||
|
<en>start time</en>
|
||||||
|
</label>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<select id="stop_push_day" class="selectpicker form-control">
|
||||||
|
<option cn="从不" en="never" value="x"></option>
|
||||||
|
<option cn="每天" en="everyday" value="*"></option>
|
||||||
|
<option cn="每周一" en="monday" value="1"></option>
|
||||||
|
<option cn="每周二" en="tuesday" value="2"></option>
|
||||||
|
<option cn="每周三" en="wednesday" value="3"></option>
|
||||||
|
<option cn="每周四" en="thursday" value="4"></option>
|
||||||
|
<option cn="每周五" en="friday" value="5"></option>
|
||||||
|
<option cn="每周六" en="saturday" value="6"></option>
|
||||||
|
<option cn="每周日" en="sunday" value="0"></option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-3">
|
||||||
|
<div class="input-group bootstrap-timepicker timepicker">
|
||||||
|
<input id="stop_push_time" type="text" class="form-control input-small">
|
||||||
|
<span class="input-group-addon"><i class="glyphicon glyphicon-time"></i></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="hr-container">
|
||||||
|
<hr style="margin-top:10px; margin-bottom: 15px;">
|
||||||
|
<span class="hr-text">OR</span>
|
||||||
|
</div>
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-sm-3 control-label">
|
||||||
|
<cn>开机启动</cn>
|
||||||
|
<en>auto push</en>
|
||||||
|
</label>
|
||||||
|
<div class="col-sm-6">
|
||||||
|
<select name="day" class="selectpicker form-control" zcfg="autorun">
|
||||||
|
<option cn="关闭" en="OFF" value="false"></option>
|
||||||
|
<option cn="开启" en="ON" value="true"></option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- <div class="form-group">-->
|
||||||
|
<!-- <label class="col-md-3 col-sm-4 control-label"><cn>自动运行</cn><en>Autorun</en></label>-->
|
||||||
|
<!-- <div class="col-md-6 col-sm-8">-->
|
||||||
|
<!-- <input zcfg="autorun" type="checkbox" class="switch form-control">-->
|
||||||
|
<!-- </div>-->
|
||||||
|
<!-- </div>-->
|
||||||
|
|
||||||
<hr style="margin-top:10px; margin-bottom: 10px;"/>
|
<hr style="margin-top:10px; margin-bottom: 10px;"/>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<div class="text-center">
|
<div class="text-center">
|
||||||
|
@ -68,26 +175,6 @@ include( "head.php" );
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div id="recBar">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-sm-4 text-right" style="line-height: 34px;">
|
|
||||||
<strong id="time">[--:--]</strong>
|
|
||||||
</div>
|
|
||||||
<div class="col-sm-4 text-center">
|
|
||||||
<button type="button" id="start" class="btn btn-warning">
|
|
||||||
<i class="fa fa-video-camera"></i>
|
|
||||||
<cn>推流</cn>
|
|
||||||
<en>Push</en>
|
|
||||||
</button>
|
|
||||||
|
|
||||||
<button type="button" id="stop" class="btn btn-default disabled ">
|
|
||||||
<i class="fa fa-stop"></i>
|
|
||||||
<cn>停止</cn>
|
|
||||||
<en>Stop</en>
|
|
||||||
</button>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -187,6 +274,7 @@ include( "head.php" );
|
||||||
<script language="javascript" src="js/flv.js" ></script>
|
<script language="javascript" src="js/flv.js" ></script>
|
||||||
<script src="js/zcfg.js"></script>
|
<script src="js/zcfg.js"></script>
|
||||||
<script src="vendor/switch/bootstrap-switch.js"></script>
|
<script src="vendor/switch/bootstrap-switch.js"></script>
|
||||||
|
<script src="vendor/timepicker/js/bootstrap-timepicker.min.js"></script>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
$( function () {
|
$( function () {
|
||||||
|
@ -197,6 +285,12 @@ include( "head.php" );
|
||||||
$.fn.bootstrapSwitch.defaults.onColor = 'warning';
|
$.fn.bootstrapSwitch.defaults.onColor = 'warning';
|
||||||
$( "#addEnable" ).bootstrapSwitch();
|
$( "#addEnable" ).bootstrapSwitch();
|
||||||
|
|
||||||
|
$("#start_push_time,#stop_push_time").timepicker({
|
||||||
|
minuteStep: 1,
|
||||||
|
defaultTime: "00:00",
|
||||||
|
showMeridian: false
|
||||||
|
});
|
||||||
|
|
||||||
var player=null;
|
var player=null;
|
||||||
var playerLoad=false;
|
var playerLoad=false;
|
||||||
|
|
||||||
|
@ -239,6 +333,7 @@ include( "head.php" );
|
||||||
$.getJSON( "config/config.json", function ( res ) {
|
$.getJSON( "config/config.json", function ( res ) {
|
||||||
cfg = res;
|
cfg = res;
|
||||||
$.getJSON( "config/push.json", function ( result ) {
|
$.getJSON( "config/push.json", function ( result ) {
|
||||||
|
result.autorun += "";
|
||||||
config = result;
|
config = result;
|
||||||
if(!config.hasOwnProperty("srcV_chn"))
|
if(!config.hasOwnProperty("srcV_chn"))
|
||||||
config.srcV_chn = "main";
|
config.srcV_chn = "main";
|
||||||
|
@ -266,6 +361,34 @@ include( "head.php" );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
func("getPushCron",[],function (res){
|
||||||
|
var start = res.result.start;
|
||||||
|
|
||||||
|
var lst1 = [];
|
||||||
|
if(start != null)
|
||||||
|
lst1 = start.split( " " )
|
||||||
|
|
||||||
|
if ( lst1.length != 8 ) {
|
||||||
|
$( '#start_push_time' ).val( '00:00' );
|
||||||
|
$( '#start_push_day' ).val( 'x' );
|
||||||
|
} else {
|
||||||
|
$( '#start_push_time' ).val( lst1[1]+":"+lst1[0]);
|
||||||
|
$( '#start_push_day' ).val( lst1[4] );
|
||||||
|
}
|
||||||
|
|
||||||
|
var stop = res.result.stop;
|
||||||
|
var lst2 = [];
|
||||||
|
if(stop != null)
|
||||||
|
lst2 = stop.split( " " );
|
||||||
|
if ( lst2.length != 8 ) {
|
||||||
|
$( '#stop_push_time' ).val( '00:00' );
|
||||||
|
$( '#stop_push_day' ).val( 'x' );
|
||||||
|
} else {
|
||||||
|
$( '#stop_push_time' ).val( lst2[1]+":"+lst2[0]);
|
||||||
|
$( '#stop_push_day' ).val( lst2[4] );
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
$("#srcV").change(function (){
|
$("#srcV").change(function (){
|
||||||
var chnId = $(this).val();
|
var chnId = $(this).val();
|
||||||
var lang = $.cookie("lang");
|
var lang = $.cookie("lang");
|
||||||
|
@ -410,11 +533,30 @@ include( "head.php" );
|
||||||
htmlAlert( "#alert", "danger", "<cn>保存设置失败,辅码流未开启</cn><en>Save config failed, sub stream is not enabled</en>!", "", 2000 );
|
htmlAlert( "#alert", "danger", "<cn>保存设置失败,辅码流未开启</cn><en>Save config failed, sub stream is not enabled</en>!", "", 2000 );
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rpc( "push.update", [ JSON.stringify( config, null, 2 ) ], function ( res ) {
|
rpc( "push.update", [ JSON.stringify( config, null, 2 ) ], function ( res ) {
|
||||||
if ( typeof ( res.error ) != "undefined" ) {
|
if ( typeof ( res.error ) != "undefined" ) {
|
||||||
htmlAlert( "#alert", "danger", "<cn>保存设置失败</cn><en>Save config failed</en>!", "", 2000 );
|
htmlAlert( "#alert", "danger", "<cn>保存设置失败</cn><en>Save config failed</en>!", "", 2000 );
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
var data = {
|
||||||
|
start:{
|
||||||
|
day:$("#start_push_day").val(),
|
||||||
|
time:$("#start_push_time").val()
|
||||||
|
},
|
||||||
|
stop:{
|
||||||
|
day:$("#stop_push_day").val(),
|
||||||
|
time:$("#stop_push_time").val()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
func("setPushCron",data,function (res){
|
||||||
|
if ( res.result == "OK" ) {
|
||||||
htmlAlert( "#alert", "success", "<cn>保存设置成功</cn><en>Save config success</en>!", "", 2000 );
|
htmlAlert( "#alert", "success", "<cn>保存设置成功</cn><en>Save config success</en>!", "", 2000 );
|
||||||
|
} else {
|
||||||
|
htmlAlert( "#alert", "danger", "<cn>保存设置失败</cn><en>Save config failed</en>!", "", 2000 );
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
|
|
|
@ -361,9 +361,9 @@ include( "head.php" );
|
||||||
else
|
else
|
||||||
config["used"] = false;
|
config["used"] = false;
|
||||||
}
|
}
|
||||||
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
||||||
if(res["result"] === "OK"){
|
if(res["result"] === "OK"){
|
||||||
rpc4("remote.updateConfig", [], function (data) {
|
rpc6("remote.updateConfig", [], function (data) {
|
||||||
initFeatures();
|
initFeatures();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -381,9 +381,9 @@ include( "head.php" );
|
||||||
});
|
});
|
||||||
|
|
||||||
$("#saveProject").click(function () {
|
$("#saveProject").click(function () {
|
||||||
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
||||||
if(res["result"] === "OK"){
|
if(res["result"] === "OK"){
|
||||||
rpc4("remote.updateConfig", [], function (data) {
|
rpc6("remote.updateConfig", [], function (data) {
|
||||||
htmlAlert("#alert", "success", "<cn>保存成功!</cn><en>Save success!</en>", "", 3000);
|
htmlAlert("#alert", "success", "<cn>保存成功!</cn><en>Save success!</en>", "", 3000);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -393,7 +393,7 @@ include( "head.php" );
|
||||||
|
|
||||||
$( function () {
|
$( function () {
|
||||||
navIndex( 4 );
|
navIndex( 4 );
|
||||||
$.ajax({url:"/config/oled/remods.json",success:function(data){
|
$.ajax({url:"/config/misc/remote/remods.json",success:function(data){
|
||||||
features = data;
|
features = data;
|
||||||
var mods3 = new Array();
|
var mods3 = new Array();
|
||||||
var func = new Array();
|
var func = new Array();
|
||||||
|
@ -426,7 +426,7 @@ include( "head.php" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}})
|
}})
|
||||||
$.ajax({url:"/config/oled/remfea.json",success:function(data){
|
$.ajax({url:"/config/misc/remote/remfea.json",success:function(data){
|
||||||
feaArray = data;
|
feaArray = data;
|
||||||
initFeatures();
|
initFeatures();
|
||||||
for(var i=0;i<feaArray.length;i++){
|
for(var i=0;i<feaArray.length;i++){
|
||||||
|
|
|
@ -514,7 +514,7 @@ include( "head.php" );
|
||||||
btnArray[i].btnNameCN = "按键"+(i+1);
|
btnArray[i].btnNameCN = "按键"+(i+1);
|
||||||
btnArray[i].btnNameEN = "Button"+(i+1);
|
btnArray[i].btnNameEN = "Button"+(i+1);
|
||||||
}
|
}
|
||||||
func("saveConfigFile",{path: "/config/oled/remote.json",data: JSON.stringify(btnArray,null,2)},function (res) {
|
func("saveConfigFile",{path: "/config/misc/remote/remote.json",data: JSON.stringify(btnArray,null,2)},function (res) {
|
||||||
if(res["result"] === "OK"){
|
if(res["result"] === "OK"){
|
||||||
initRemoteBtns();
|
initRemoteBtns();
|
||||||
$('#infoModal').modal("hide");
|
$('#infoModal').modal("hide");
|
||||||
|
@ -522,7 +522,7 @@ include( "head.php" );
|
||||||
var config = feaArray[i];
|
var config = feaArray[i];
|
||||||
config["btns"].splice(index,1);
|
config["btns"].splice(index,1);
|
||||||
}
|
}
|
||||||
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
||||||
if(res["result"] === "OK")
|
if(res["result"] === "OK")
|
||||||
initFeatures();
|
initFeatures();
|
||||||
})
|
})
|
||||||
|
@ -539,7 +539,7 @@ include( "head.php" );
|
||||||
icon:iconSelect,
|
icon:iconSelect,
|
||||||
}
|
}
|
||||||
btnArray.push(obj);
|
btnArray.push(obj);
|
||||||
func("saveConfigFile",{path: "/config/oled/remote.json",data: JSON.stringify(btnArray,null,2)},function (res) {
|
func("saveConfigFile",{path: "/config/misc/remote/remote.json",data: JSON.stringify(btnArray,null,2)},function (res) {
|
||||||
if(res["result"] === "OK"){
|
if(res["result"] === "OK"){
|
||||||
initRemoteBtns();
|
initRemoteBtns();
|
||||||
$('#myModal').modal("hide");
|
$('#myModal').modal("hide");
|
||||||
|
@ -555,7 +555,7 @@ include( "head.php" );
|
||||||
var config = feaArray[i];
|
var config = feaArray[i];
|
||||||
config["btns"].push(feaObj);
|
config["btns"].push(feaObj);
|
||||||
}
|
}
|
||||||
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
||||||
if(res["result"] === "OK")
|
if(res["result"] === "OK")
|
||||||
initFeatures();
|
initFeatures();
|
||||||
})
|
})
|
||||||
|
@ -586,9 +586,9 @@ include( "head.php" );
|
||||||
else
|
else
|
||||||
config["used"] = false;
|
config["used"] = false;
|
||||||
}
|
}
|
||||||
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
||||||
if(res["result"] === "OK"){
|
if(res["result"] === "OK"){
|
||||||
rpc4("remote.updateConfig", [], function (data) {
|
rpc6("remote.updateConfig", [], function (data) {
|
||||||
initFeatures();
|
initFeatures();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -606,9 +606,9 @@ include( "head.php" );
|
||||||
});
|
});
|
||||||
|
|
||||||
$("#saveProject").click(function () {
|
$("#saveProject").click(function () {
|
||||||
func("saveConfigFile",{path: "/config/oled/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
func("saveConfigFile",{path: "/config/misc/remote/remfea.json",data: JSON.stringify(feaArray,null,2)},function (res) {
|
||||||
if(res["result"] === "OK"){
|
if(res["result"] === "OK"){
|
||||||
rpc4("remote.updateConfig", [], function (data) {
|
rpc6("remote.updateConfig", [], function (data) {
|
||||||
htmlAlert("#alert", "success", "<cn>保存成功!</cn><en>Save success!</en>", "", 3000);
|
htmlAlert("#alert", "success", "<cn>保存成功!</cn><en>Save success!</en>", "", 3000);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -648,10 +648,10 @@ include( "head.php" );
|
||||||
|
|
||||||
$( function () {
|
$( function () {
|
||||||
navIndex( 4 );
|
navIndex( 4 );
|
||||||
$.ajax({url:"/config/oled/remote.json",success:function(data){
|
$.ajax({url:"/config/misc/remote/remote.json",success:function(data){
|
||||||
btnArray = data;
|
btnArray = data;
|
||||||
initRemoteBtns();
|
initRemoteBtns();
|
||||||
$.ajax({url:"/config/oled/remods.json",success:function(data){
|
$.ajax({url:"/config/misc/remote/remods.json",success:function(data){
|
||||||
features = data;
|
features = data;
|
||||||
var mods3 = new Array();
|
var mods3 = new Array();
|
||||||
var func = new Array();
|
var func = new Array();
|
||||||
|
@ -685,7 +685,7 @@ include( "head.php" );
|
||||||
}
|
}
|
||||||
}})
|
}})
|
||||||
|
|
||||||
$.ajax({url:"/config/oled/remfea.json",success:function(data){
|
$.ajax({url:"/config/misc/remote/remfea.json",success:function(data){
|
||||||
feaArray = data;
|
feaArray = data;
|
||||||
initFeatures();
|
initFeatures();
|
||||||
for(var i=0;i<feaArray.length;i++){
|
for(var i=0;i<feaArray.length;i++){
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
include( "head.php" );
|
include( "head.php" );
|
||||||
?>
|
?>
|
||||||
|
<div id="alert"></div>
|
||||||
<div class="row" id="effect">
|
<div class="row" id="effect">
|
||||||
<div class="col-md-7">
|
<div class="col-md-7">
|
||||||
<div class="thumbnail" style="position: relative;">
|
<div class="thumbnail" style="position: relative;">
|
||||||
|
@ -231,10 +232,12 @@ include( "head.php" );
|
||||||
}
|
}
|
||||||
|
|
||||||
function save() {
|
function save() {
|
||||||
rpc( "enc.update", [ JSON.stringify( config, null, 2 ) ], function ( data ) {
|
rpc( "enc.updateRoi", [ JSON.stringify( roiList, null, 2 ) ], function ( data ) {
|
||||||
if ( typeof ( data.error ) != "undefined" ) {
|
if ( !data ) {
|
||||||
htmlAlert( "#alert", "danger", "<cn>保存设置失败!</cn><en>Save config failed!</en>", "", 2000 );
|
htmlAlert( "#alert", "danger", "<cn>保存设置失败!</cn><en>Save config failed!</en>", "", 2000 );
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
htmlAlert( "#alert", "success", "<cn>保存设置成功!</cn><en>Save config success!</en>", "", 2000 );
|
||||||
} );
|
} );
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
|
@ -12,7 +12,7 @@ include( "head.php" );
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
<div class="panel-body">
|
<div class="panel-body">
|
||||||
<form class="form-horizontal" id="trans" role="form">
|
<form class="form-horizontal" id="mqtt" role="form">
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-2 control-label">
|
<label class="col-sm-2 control-label">
|
||||||
<cn>启用</cn>
|
<cn>启用</cn>
|
||||||
|
@ -24,25 +24,27 @@ include( "head.php" );
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-2 control-label">
|
<label class="col-sm-2 control-label">
|
||||||
<cn>设备名</cn>
|
<cn>连接状态</cn>
|
||||||
<en>Device name</en>
|
<en>Connect</en>
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6 control-label" style="text-align: left;" id="connect">
|
||||||
<input zcfg="Name" type="text" class="form-control">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label class="col-sm-2 control-label">
|
<label class="col-sm-2 control-label">
|
||||||
<cn>绑定码</cn>
|
<cn>设备名</cn>
|
||||||
<en>Bind code</en>
|
<en>Device name</en>
|
||||||
</label>
|
</label>
|
||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<input zcfg="DevBind" type="text" class="form-control">
|
<input zcfg="name" type="text" class="form-control">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="form-group">
|
<div class="text-center">
|
||||||
<button type="button" id="save" class=" save btn btn-warning col-sm-6 col-sm-offset-3">
|
<button type="button" id="bind" class="btn btn-warning " style="margin-right:20px;">
|
||||||
|
<cn>扫码绑定</cn><en>Bind</en>
|
||||||
|
</button>
|
||||||
|
<button type="button" id="save" class=" save btn btn-warning">
|
||||||
<cn>保存</cn><en>Save</en>
|
<cn>保存</cn><en>Save</en>
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -135,21 +137,51 @@ include( "head.php" );
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="modal fade" id="bindModal" tabindex="-1" role="dialog">
|
||||||
|
<div class="modal-dialog" role="document">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">×</span></button>
|
||||||
|
<h4 class="modal-title">
|
||||||
|
<cn>扫一扫绑定设备</cn>
|
||||||
|
<en>Scan qrcode</en>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<div id="qrcode" class="text-center"></div>
|
||||||
|
</div>
|
||||||
|
<div class="modal-footer">
|
||||||
|
<button type="button" class="btn btn-default" data-dismiss="modal">
|
||||||
|
<cn>关闭</cn>
|
||||||
|
<en>Close</en>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<script src="vendor/switch/bootstrap-switch.min.js"></script>
|
<script src="vendor/switch/bootstrap-switch.min.js"></script>
|
||||||
<script src="js/zcfg.js"></script>
|
<script src="js/zcfg.js"></script>
|
||||||
|
<script src="js/qrcode.js"></script>
|
||||||
<script>
|
<script>
|
||||||
$( function () {
|
$( function () {
|
||||||
navIndex( 5 );
|
navIndex( 5 );
|
||||||
$.fn.bootstrapSwitch.defaults.onColor = 'warning';
|
$.fn.bootstrapSwitch.defaults.onColor = 'warning';
|
||||||
|
|
||||||
var transCfg;
|
var mqttCfg;
|
||||||
$.getJSON( "config/trans.json", function ( result ) {
|
function initMqtt(){
|
||||||
transCfg = result;
|
$.getJSON( "config/misc/mqtt.json", function ( result ) {
|
||||||
zcfg( "#trans", transCfg );
|
mqttCfg = result;
|
||||||
|
zcfg( "#mqtt", mqttCfg );
|
||||||
} );
|
} );
|
||||||
|
}
|
||||||
|
initMqtt();
|
||||||
|
|
||||||
|
|
||||||
|
//$( '#bindModal' ).modal( 'show' );
|
||||||
|
|
||||||
$( "#save" ).click( function ( e ) {
|
$( "#save" ).click( function ( e ) {
|
||||||
rpc( "enc.setTrans", [ JSON.stringify( transCfg, null, 2 ) ], function ( data ) {
|
rpc4( "mqtt.update", [ mqttCfg ], function ( data ) {
|
||||||
if ( typeof ( data.error ) != "undefined" ) {
|
if ( typeof ( data.error ) != "undefined" ) {
|
||||||
htmlAlert( "#alert", "danger", "<cn>保存设置失败!</cn><en>Save config failed!</en>", "", 2000 );
|
htmlAlert( "#alert", "danger", "<cn>保存设置失败!</cn><en>Save config failed!</en>", "", 2000 );
|
||||||
} else {
|
} else {
|
||||||
|
@ -158,6 +190,46 @@ include( "head.php" );
|
||||||
} );
|
} );
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
function getMqttState(){
|
||||||
|
rpc4( "mqtt.getMqttState", null, function ( data ) {
|
||||||
|
if(data.connected)
|
||||||
|
$("#connect").html('<cn>已连接</cn><en>connected</en>');
|
||||||
|
else
|
||||||
|
$("#connect").html('<cn>未连接</cn><en>not connected</en>');
|
||||||
|
} );
|
||||||
|
}
|
||||||
|
getMqttState();
|
||||||
|
setInterval(getMqttState,2000);
|
||||||
|
|
||||||
|
|
||||||
|
function checkBind(){
|
||||||
|
rpc4( "mqtt.bindOK", null, function ( data ) {
|
||||||
|
if(data)
|
||||||
|
{
|
||||||
|
$( '#bindModal' ).modal( 'hide' );
|
||||||
|
initMqtt();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
setTimeout(() => {
|
||||||
|
checkBind();
|
||||||
|
}, 500);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
$( "#bind" ).click( function ( e ) {
|
||||||
|
rpc4( "mqtt.startBind", null, function ( data ) {
|
||||||
|
console.log(data);
|
||||||
|
$("#qrcode").html("");
|
||||||
|
new QRCode(document.getElementById("qrcode"), data);
|
||||||
|
$( '#bindModal' ).modal( 'show' );
|
||||||
|
checkBind();
|
||||||
|
} );
|
||||||
|
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/* $.ajax( {
|
/* $.ajax( {
|
||||||
url: "config/rproxy/ngrok_enable",
|
url: "config/rproxy/ngrok_enable",
|
||||||
success: function ( data ) {
|
success: function ( data ) {
|
||||||
|
|
|
@ -894,7 +894,7 @@ else
|
||||||
else if(list[1]!=list[0])
|
else if(list[1]!=list[0])
|
||||||
return ":"+list[1];
|
return ":"+list[1];
|
||||||
else
|
else
|
||||||
return "";
|
return list[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
function transURL(str)
|
function transURL(str)
|
||||||
|
@ -918,19 +918,19 @@ else
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
var port=getport(portCfg.http);
|
var port=getport(portCfg.http);
|
||||||
url=url.replace("///","//"+ip+port+"/");
|
url=url.replace("///","//"+ip+":"+port+"/");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(url.indexOf("rtmp")==0){
|
else if(url.indexOf("rtmp")==0){
|
||||||
var port=getport(portCfg.rtmp);
|
var port=getport(portCfg.rtmp);
|
||||||
url=url.replace("///","//"+ip+port+"/");
|
url=url.replace("///","//"+ip+":"+port+"/");
|
||||||
}
|
}
|
||||||
else if(url.indexOf("rtsp")==0){
|
else if(url.indexOf("rtsp")==0){
|
||||||
var port=getport(portCfg.rtsp);
|
var port=getport(portCfg.rtsp);
|
||||||
if(url.indexOf("@/") > 0)
|
if(url.indexOf("@/") > 0)
|
||||||
url=url.replace("@/","@"+ip+port+"/");
|
url=url.replace("@/","@"+ip+":"+port+"/");
|
||||||
else
|
else
|
||||||
url=url.replace("///","//"+ip+port+"/");
|
url=url.replace("///","//"+ip+":"+port+"/");
|
||||||
}
|
}
|
||||||
else if(url.indexOf("srt")==0){
|
else if(url.indexOf("srt")==0){
|
||||||
url=url.replace("//:","//"+ip+":");
|
url=url.replace("//:","//"+ip+":");
|
||||||
|
|
|
@ -11,7 +11,7 @@ if(file_exists('theme/theme-'.$theme.'.css')){?>
|
||||||
<?php }?>
|
<?php }?>
|
||||||
<?php
|
<?php
|
||||||
//echo '<pre>';
|
//echo '<pre>';
|
||||||
$page = substr($_SERVER['PHP_SELF'],strpos('/')+1);
|
$page = substr($_SERVER['PHP_SELF'],strpos($_SERVER['PHP_SELF'],'/')+1);
|
||||||
$page = rtrim($page,'.php');
|
$page = rtrim($page,'.php');
|
||||||
//echo $page;
|
//echo $page;
|
||||||
switch ($page) {
|
switch ($page) {
|
||||||
|
|
|
@ -158,7 +158,7 @@ if($hardware["function"]["button"])
|
||||||
});
|
});
|
||||||
|
|
||||||
$( "#saveBtn" ).click( function (){
|
$( "#saveBtn" ).click( function (){
|
||||||
rpc4( "oled.update", [ JSON.stringify( button, null, 2 ) ], function ( res ) {
|
rpc6( "gpio.update", [ JSON.stringify( button, null, 2 ) ], function ( res ) {
|
||||||
if ( typeof ( res.error ) != "undefined" ) {
|
if ( typeof ( res.error ) != "undefined" ) {
|
||||||
htmlAlert( "#alert", "danger", "<cn>保存设置失败</cn><en>Save config failed</en>!", "", 2000 );
|
htmlAlert( "#alert", "danger", "<cn>保存设置失败</cn><en>Save config failed</en>!", "", 2000 );
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -0,0 +1,146 @@
|
||||||
|
/*!
|
||||||
|
* Timepicker Component for Twitter Bootstrap
|
||||||
|
*
|
||||||
|
* Copyright 2013 Joris de Wit
|
||||||
|
*
|
||||||
|
* Contributors https://github.com/jdewit/bootstrap-timepicker/graphs/contributors
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
.bootstrap-timepicker {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu {
|
||||||
|
left: auto;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:before {
|
||||||
|
left: auto;
|
||||||
|
right: 12px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker.pull-right .bootstrap-timepicker-widget.dropdown-menu:after {
|
||||||
|
left: auto;
|
||||||
|
right: 13px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker .input-group-addon {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker .input-group-addon i {
|
||||||
|
display: inline-block;
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.dropdown-menu {
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.dropdown-menu.open {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.dropdown-menu:before {
|
||||||
|
border-bottom: 7px solid rgba(0, 0, 0, 0.2);
|
||||||
|
border-left: 7px solid transparent;
|
||||||
|
border-right: 7px solid transparent;
|
||||||
|
content: "";
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.dropdown-menu:after {
|
||||||
|
border-bottom: 6px solid #FFFFFF;
|
||||||
|
border-left: 6px solid transparent;
|
||||||
|
border-right: 6px solid transparent;
|
||||||
|
content: "";
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.timepicker-orient-left:before {
|
||||||
|
left: 6px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.timepicker-orient-left:after {
|
||||||
|
left: 7px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.timepicker-orient-right:before {
|
||||||
|
right: 6px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.timepicker-orient-right:after {
|
||||||
|
right: 7px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.timepicker-orient-top:before {
|
||||||
|
top: -7px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.timepicker-orient-top:after {
|
||||||
|
top: -6px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.timepicker-orient-bottom:before {
|
||||||
|
bottom: -7px;
|
||||||
|
border-bottom: 0;
|
||||||
|
border-top: 7px solid #999;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget.timepicker-orient-bottom:after {
|
||||||
|
bottom: -6px;
|
||||||
|
border-bottom: 0;
|
||||||
|
border-top: 6px solid #ffffff;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget a.btn,
|
||||||
|
.bootstrap-timepicker-widget input {
|
||||||
|
border-radius: 4px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget table {
|
||||||
|
width: 100%;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget table td {
|
||||||
|
text-align: center;
|
||||||
|
height: 30px;
|
||||||
|
margin: 0;
|
||||||
|
padding: 2px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget table td:not(.separator) {
|
||||||
|
min-width: 30px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget table td span {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget table td a {
|
||||||
|
border: 1px transparent solid;
|
||||||
|
width: 100%;
|
||||||
|
display: inline-block;
|
||||||
|
margin: 0;
|
||||||
|
padding: 8px 0;
|
||||||
|
outline: 0;
|
||||||
|
color: #333;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget table td a:hover {
|
||||||
|
text-decoration: none;
|
||||||
|
background-color: #eee;
|
||||||
|
-webkit-border-radius: 4px;
|
||||||
|
-moz-border-radius: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
border-color: #ddd;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget table td a i {
|
||||||
|
margin-top: 2px;
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget table td input {
|
||||||
|
width: 25px;
|
||||||
|
margin: 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker-widget .modal-content {
|
||||||
|
padding: 4px;
|
||||||
|
}
|
||||||
|
@media (min-width: 767px) {
|
||||||
|
.bootstrap-timepicker-widget.modal {
|
||||||
|
width: 200px;
|
||||||
|
margin-left: -100px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
.bootstrap-timepicker {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.bootstrap-timepicker .dropdown-menu {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
File diff suppressed because it is too large
Load Diff
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,5 +1,6 @@
|
||||||
|
|
||||||
types {
|
types {
|
||||||
|
text/inc inc;
|
||||||
text/html html htm shtml;
|
text/html html htm shtml;
|
||||||
text/css css;
|
text/css css;
|
||||||
text/xml xml;
|
text/xml xml;
|
||||||
|
|
|
@ -111,6 +111,8 @@ http {
|
||||||
|
|
||||||
location / {
|
location / {
|
||||||
ssi on;
|
ssi on;
|
||||||
|
ssi_silent_errors on;
|
||||||
|
ssi_types text/inc;
|
||||||
root /link/web;
|
root /link/web;
|
||||||
index dashboard.php;
|
index dashboard.php;
|
||||||
|
|
||||||
|
@ -144,6 +146,11 @@ http {
|
||||||
proxy_max_temp_file_size 0m;
|
proxy_max_temp_file_size 0m;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
location /RPC6 {
|
||||||
|
proxy_pass http://127.0.0.1:7020/RPC;
|
||||||
|
proxy_max_temp_file_size 0m;
|
||||||
|
}
|
||||||
|
|
||||||
location ~ /socket.io {
|
location ~ /socket.io {
|
||||||
proxy_pass http://127.0.0.1:7857;
|
proxy_pass http://127.0.0.1:7857;
|
||||||
proxy_http_version 1.1;
|
proxy_http_version 1.1;
|
||||||
|
@ -162,6 +169,10 @@ http {
|
||||||
|
|
||||||
location /hls/ {
|
location /hls/ {
|
||||||
alias /tmp/hls/;
|
alias /tmp/hls/;
|
||||||
|
add_header Cache-Control no-store;
|
||||||
|
add_header Access-Control-Allow-Origin *;
|
||||||
|
add_header Access-Control-Allow-Headers X-Requested-With,content-type;
|
||||||
|
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
|
||||||
}
|
}
|
||||||
|
|
||||||
location /config/ {
|
location /config/ {
|
||||||
|
|
Binary file not shown.
|
@ -0,0 +1 @@
|
||||||
|
libQt5Qmqtt.so.1.0.2
|
|
@ -0,0 +1 @@
|
||||||
|
libQt5Qmqtt.so.1.0.2
|
|
@ -0,0 +1 @@
|
||||||
|
libQt5Qmqtt.so.1.0.2
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue