Initial Commit

This commit is contained in:
admin 2025-03-20 00:07:07 -07:00
commit 6ac35f19ad
102 changed files with 32688 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.venv/

36
data/color_options.json Normal file
View File

@ -0,0 +1,36 @@
{
"main":{
"enabled": false
},
"general": {
"ColorModel": "RGB",
"StpColorPrecision": "Normal",
"StpiShrinkOutput": "Shrink"
},
"common": {
"StpColorCorrection": "None",
"StpBrightness": "None",
"StpFineBrightness": "0",
"StpContrast": "None",
"StpFineContrast": "0",
"StpSaturation": "None",
"StpFineSaturation": "0",
"StpImageType": "TextGraphics"
},
"extra": {
"StpGamma": "None",
"StpFineGamma": "0",
"StpCyanGamma": "None",
"StpFineCyanGamma": "0",
"StpMagentaGamma": "None",
"StpFineMagentaGamma": "0",
"StpYellowGamma": "None",
"StpFineYellowGamma": "0",
"StpCyanBalance": "None",
"StpFineCyanBalance": "0",
"StpMagentaBalance": "None",
"StpFineMagentaBalance": "0",
"StpYellowBalance": "None",
"StpFineYellowBalance": "0"
}
}

View File

@ -0,0 +1,36 @@
{
"main":{
"enabled": false
},
"general": {
"ColorModel": "KCMY",
"StpColorPrecision": "Normal",
"StpiShrinkOutput": "Expand"
},
"common": {
"StpColorCorrection": "None",
"StpBrightness": "None",
"StpFineBrightness": "0",
"StpContrast": "None",
"StpFineContrast": "0",
"StpSaturation": "None",
"StpFineSaturation": "0",
"StpImageType": "TextGraphics"
},
"extra": {
"StpGamma": "None",
"StpFineGamma": "0",
"StpCyanGamma": "None",
"StpFineCyanGamma": "0",
"StpMagentaGamma": "None",
"StpFineMagentaGamma": "0",
"StpYellowGamma": "None",
"StpFineYellowGamma": "0",
"StpCyanBalance": "None",
"StpFineCyanBalance": "0",
"StpMagentaBalance": "None",
"StpFineMagentaBalance": "0",
"StpYellowBalance": "None",
"StpFineYellowBalance": "0"
}
}

5
data/cups.json Normal file
View File

@ -0,0 +1,5 @@
{
"dockerized": true,
"lpinfo-com": "docker exec cups_233op2 lpinfo",
"lpadmin-com": "docker exec cups_233op2 lpadmin"
}

898
data/printers.json Normal file
View File

@ -0,0 +1,898 @@
[
{
"display-name": "----- DNP Printers -----",
"make-model": " ",
"media-sizes": [
{
"capacity": 0,
"enabled": false,
"media-size": " ",
"media-size-display": " "
}
]
},
{
"display-name": "DNP-DS620",
"make-model": "dnp-ds620",
"media-sizes": [
{
"capacity": 230,
"enabled": false,
"media-size": "B7",
"media-size-display": "3.5x5"
},
{
"capacity": 400,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 400,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
},
{
"capacity": 700,
"enabled": false,
"media-size": "w324h432",
"media-size-display": "4.5x6"
},
{
"capacity": 400,
"enabled": false,
"media-size": "w360h360",
"media-size-display": "5x5"
},
{
"capacity": 400,
"enabled": false,
"media-size": "w360h504",
"media-size-display": "5x7"
},
{
"capacity": 400,
"enabled": false,
"media-size": "w360h504-div2",
"media-size-display": "3.5x5-div2"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w360h504-w360h360_w360h144",
"media-size-display": "5x5+2x5"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w432h432",
"media-size-display": "6x6"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w432h576",
"media-size-display": "6x8"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w432h576-w432h432_w432h144",
"media-size-display": "6x6+2x6"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w432h576-div4",
"media-size-display": "2x6*4"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w432h576-div2",
"media-size-display": "4x6-div2"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w432h648",
"media-size-display": "6x9"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w432h648-div2",
"media-size-display": "4.5x6-div2"
}
]
},
{
"display-name": "DNP-DSRX1",
"make-model": "dnp-dsrx1",
"media-sizes": [
{
"capacity": 700,
"enabled": false,
"media-size": "B7",
"media-size-display": "3.5x5"
},
{
"capacity": 700,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 700,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
},
{
"capacity": 400,
"enabled": false,
"media-size": "w360h360",
"media-size-display": "5x5"
},
{
"capacity": 400,
"enabled": false,
"media-size": "w360h504",
"media-size-display": "5x7"
},
{
"capacity": 400,
"enabled": false,
"media-size": "w360h504-div2",
"media-size-display": "3.5x5-div2"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w432h432",
"media-size-display": "6x6"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w432h576",
"media-size-display": "6x8"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w432h576-div4",
"media-size-display": "2x6*4"
},
{
"capacity": 350,
"enabled": false,
"media-size": "w432h576-div2",
"media-size-display": "4x6-div2"
}
]
},
{
"display-name": "DNP-DS40",
"make-model": "dnp-ds40",
"media-sizes": [
{
"capacity": 400,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 400,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "DNP-DS80",
"make-model": "dnp-ds80",
"media-sizes": [
{
"capacity": 260,
"enabled": true,
"media-size": "w288h576",
"media-size-display": "8x4"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w360h576",
"media-size-display": "8x5"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w432h576",
"media-size-display": "8x6"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w576h576",
"media-size-display": "8x8"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w576h576-div2",
"media-size-display": "8x4-div2"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w576h648-w576h360_w576h288",
"media-size-display": "8x5+8x4"
}
]
},
{
"display-name": "DNP-DS80DX",
"make-model": "dnp-ds80dx",
"media-sizes": [
{
"capacity": 260,
"enabled": true,
"media-size": "w288h576",
"media-size-display": "8x4"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w360h576",
"media-size-display": "8x5"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w432h576",
"media-size-display": "8x6"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w576h576",
"media-size-display": "8x8"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w576h576-div2",
"media-size-display": "8x4-div2"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w576h648-w576h360_w576h288",
"media-size-display": "8x5+8x4"
}
]
},
{
"display-name": "DNP-DS820",
"make-model": "dnp-ds820",
"media-sizes": [
{
"capacity": 260,
"enabled": true,
"media-size": "w288h576",
"media-size-display": "8x4"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w360h576",
"media-size-display": "8x5"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w432h576",
"media-size-display": "8x6"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w576h576",
"media-size-display": "8x8"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w576h576-div2",
"media-size-display": "8x4-div2"
},
{
"capacity": 260,
"enabled": false,
"media-size": "w576h648-w576h360_w576h288",
"media-size-display": "8x5+8x4"
}
]
},
{
"display-name": "DNP-DS80DX",
"make-model": "dnp-ds80dx",
"media-sizes": [
{
"capacity": 400,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 400,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "DNP-SL10",
"make-model": "dnp-sl10",
"media-sizes": [
{
"capacity": 200,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 200,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "DNP-SL20",
"make-model": "dnp-sl20",
"media-sizes": [
{
"capacity": 200,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 200,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "DNP-QW410",
"make-model": "dnp-qw410",
"media-sizes": [
{
"capacity": 150,
"enabled": true,
"media-size": "w288h288",
"media-size-display": "4x4"
},
{
"capacity": 150,
"enabled": true,
"media-size": "w288h288-div2",
"media-size-display": "2x4*2"
},
{
"capacity": 150,
"enabled": true,
"media-size": "w288h216",
"media-size-display": "4x3"
},
{
"capacity": 150,
"enabled": true,
"media-size": "w288h288_w288h144",
"media-size-display": "4x4+4x2"
},
{
"capacity": 150,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 150,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "4x3*2"
},
{
"capacity": 150,
"enabled": true,
"media-size": "w288h432-div3",
"media-size-display": "2x4*3"
},
{
"capacity": 150,
"enabled": false,
"media-size": "w288h576",
"media-size-display": "4x8"
},
{
"capacity": 150,
"enabled": false,
"media-size": "w288h432_w288h144",
"media-size-display": "4x6+4x2"
},
{
"capacity": 150,
"enabled": true,
"media-size": "w288h432-div2_w288h144",
"media-size-display": "4x3*2+4x2"
},
{
"capacity": 150,
"enabled": false,
"media-size": "w288h576-div2",
"media-size-display": "4x4*2"
},
{
"capacity": 150,
"enabled": false,
"media-size": "w288h576-div4",
"media-size-display": "2x4*4"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h216",
"media-size-display": "4.5x3"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h288",
"media-size-display": "4.5x4"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h324",
"media-size-display": "4.5x4.5"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h432",
"media-size-display": "4.5x6"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h432-div2",
"media-size-display": "4.5x3*2"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h486",
"media-size-display": "4.5x6.75"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h432-div3",
"media-size-display": "4.5x2*3"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h476",
"media-size-display": "4.5x8"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h576-div2",
"media-size-display": "4.5x4*2"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h576-div4",
"media-size-display": "4.5x2*4"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h432_w324h144",
"media-size-display": "4.5x6+4.5x2"
},
{
"capacity": 110,
"enabled": false,
"media-size": "w324h432-div2_w324h144",
"media-size-display": "4.5x3*2+4.5x2"
}
]
},
{
"display-name": "----- Sinfonia Printers -----",
"make-model": " ",
"media-sizes": [
{
"capacity": 0,
"enabled": false,
"media-size": " ",
"media-size-display": " "
}
]
},
{
"display-name": "Sinf-6145-CS2",
"make-model": "sinfonia-chcs6145",
"media-sizes": [
{
"capacity": 300,
"enabled": false,
"media-size": "w144h432",
"media-size-display": "2x6"
},
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
},
{
"capacity": 170,
"enabled": false,
"media-size": "w360h360",
"media-size-display": "5x5"
},
{
"capacity": 170,
"enabled": false,
"media-size": "w360h504",
"media-size-display": "5x7"
},
{
"capacity": 150,
"enabled": false,
"media-size": "w432h432",
"media-size-display": "6x6"
},
{
"capacity": 150,
"enabled": false,
"media-size": "w432h576",
"media-size-display": "6x8"
},
{
"capacity": 150,
"enabled": false,
"media-size": "w432h576-w432h432_w432h144",
"media-size-display": "6x6+2x6"
},
{
"capacity": 150,
"enabled": false,
"media-size": "w432h576-div2",
"media-size-display": "4x6-div2"
}
]
},
{
"display-name": "Sinf-1245-E1",
"make-model": "sinfonia-chcs1245",
"media-sizes": [
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "Sinf-2145-S2",
"make-model": "sinfonia-chcs2145",
"media-sizes": [
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "Sinf-2245-S2",
"make-model": "sinfonia-chcs2245",
"media-sizes": [
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "Sinf-6245-CE1",
"make-model": "sinfonia-chcs6245",
"media-sizes": [
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "----- Fujifilm Printers -----",
"make-model": " ",
"media-sizes": [
{
"capacity": 0,
"enabled": false,
"media-size": " ",
"media-size-display": " "
}
]
},
{
"display-name": "Fujifilm-ASK-300",
"make-model": "fujifilm-ask-300",
"media-sizes": [
{
"capacity": 400,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 400,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "Fujifilm-ASK-2000",
"make-model": "fujifilm-ask-2000",
"media-sizes": [
{
"capacity": 600,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 600,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "Fujifilm-ASK-2500",
"make-model": "fujifilm-ask-2500",
"media-sizes": [
{
"capacity": 600,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 600,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "Fujifilm-ASK-4000",
"make-model": "fujifilm-ask-4000",
"media-sizes": [
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 300,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "----- Mitsubishi Printers -----",
"make-model": " ",
"media-sizes": [
{
"capacity": 0,
"enabled": false,
"media-size": " ",
"media-size-display": " "
}
]
},
{
"display-name": "Mitsubishi-K60DW",
"make-model": "mitsubishi-k60dw",
"media-sizes": [
{
"capacity": 320,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 320,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "Mitsubishi-CP-D70DW",
"make-model": "mitsubishi-cp-d70dw",
"media-sizes": [
{
"capacity": 400,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 400,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "----- Hiti Printers -----",
"make-model": " ",
"media-sizes": [
{
"capacity": 0,
"enabled": false,
"media-size": " ",
"media-size-display": " "
}
]
},
{
"display-name": "Hiti-P525L",
"make-model": "hiti-p525l",
"media-sizes": [
{
"capacity": 500,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 500,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "Hiti-P520L",
"make-model": "hiti-p520l",
"media-sizes": [
{
"capacity": 500,
"enabled": true,
"media-size": "w288h432",
"media-size-display": "4x6"
},
{
"capacity": 500,
"enabled": true,
"media-size": "w288h432-div2",
"media-size-display": "2x6-div2"
}
]
},
{
"display-name": "----- Sony Printers -----",
"make-model": " ",
"media-sizes": [
{
"capacity": 0,
"enabled": false,
"media-size": " ",
"media-size-display": " "
}
]
},
{
"display-name": "----- Canon Printers -----",
"make-model": " ",
"media-sizes": [
{
"capacity": 0,
"enabled": false,
"media-size": " ",
"media-size-display": " "
}
]
},
{
"display-name": "----- Citizen Printers -----",
"make-model": " ",
"media-sizes": [
{
"capacity": 0,
"enabled": false,
"media-size": " ",
"media-size-display": " "
}
]
},
{
"display-name": "----- Zebra Printers -----",
"make-model": " ",
"media-sizes": [
{
"capacity": 0,
"enabled": false,
"media-size": " ",
"media-size-display": " "
}
]
}
]

26
requirements.txt Normal file
View File

@ -0,0 +1,26 @@
beautifulsoup4
blinker
bs4
certifi
cffi
charset-normalizer
click
cryptography
Flask
Flask-Cors
idna
itsdangerous
Jinja2
MarkupSafe
psutil
pyarmor
pycparser
pycups
pyudev
requests
soupsieve
spidev
swig
urllib3
Werkzeug
gunicorn

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

3
src/app.py Normal file

File diff suppressed because one or more lines are too long

3
src/cupsconnect.py Normal file
View File

@ -0,0 +1,3 @@
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:35.798448
from pyarmor_runtime_000000 import __pyarmor__
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00x\x02\x00\x00\x12\t\x04\x00S\xe3\\\x0f5d8 \xcf\x05\x074%\xa1\x04\x8e\x00\x00\x00\x00\x00\x00\x00\x00E\x91\xe1\x86\x0ea\xa1\x16\x0e\xb4\x1b\x1b\xea\xc4\xe8N\xcc\xb5\x08\x1e\x92\x90\x01S\xac\xab\xf0\xee\xbc\xcdr\xc3\xad\xa6\xee\x19"\\B\x1f\xd8\x83\xaaU`\xb2\xa5\'\xf3_=\xeb@\x10D&\xbc1P|\x81\xf5^\x01Z\xd6\xbc\xcc6Y\x1d\xe4q\x16\xda\xee\n\xa9\x88\xf5`M"4\x97\x9f\xef\xd9\xb6%\xf8\x1d\x8f\xd5\xee\xa9\x922\xe79\xf4\xea,\xff\tm\xc1S\x91\xc6M\xe1,I\xef\xb9\xeb\x9d\x93\xc5}\x03,i.\xf4$\x9c\x8b\xeaF\xa9\xc2\x94\xc8\xf3\xf5\x9d\xa0C\x97\xe3[p\xa3\xdem\x0f\x9bwW\xca\xca.\x043\xf064g\x1f\xd5l\x9e\xd5U$.\xda$QY\xa2\xd3\xfa\xb9P\x1f\x84\xfa\x9c\x86/\xc8X\xab+Zn\x14\xe0\xf3\xa5H\xabF\x9f\x89\xec\xdb3\xf74\xf6e1\x06\xc5$\xb7\x8cH\x7f\xd50\x0e`\x8f\x1d&\x0e&\xef\x92\xca\xc3\x85\xef\xea/"\x1b)\xf7\xfd\x9c\x1d9l\xbe\xee\xae\xf0\x96}\xc0`\x06]\xdb\x9a=\\\xe8\xdbU\x8ac5S\x84J\x8f\xdd\xda\x82\xfd\x02\xe0\xb3D\xd4R=\x90|r\xa8\xdd/\xd0\xd3.6\x7f\x1fD\xf7!\x1e\xeb\x92\xc0)\x95qN\xd8\x0b\x126\xf7B\x88\x12\x98j\x1f\xb8\x08\xdf_\xbb\x1c\x0f7K!\xb2\xc3\xe4\xfe\x80\xacc\x18\xb7\x0c\x94\xbe\xbc\xec\x93<\xf60\x97\x87\x811\xe6\xa1\xad 0\x08\xe1Q#\'S\xb6\xa0!e\xa7\xe8\xb1\xe8\x14\x198\x14I\xf2\x1a$\x8f\xe6\xb6&\x90B\xae\xddm\xd06@\x1f\x98\xf29\x10\x7f\xab=\xf2y\xdex\x08\x1b\x93\xe9\x00\xff\xb2\x9f\x07P\xbe$\xa3\xe8\x10\xd3\xf4R\x98\xac\xe22\xf1A\xa3B\xb7\x81l\x18\xb6:mHf\xc53Zo&Q0\x1e4\xc5\xaa\xca\x07\xc5\x8f\x15\xad\xb3\x8f}\xa1<\xb1Z\xc8\x16\xf53r\xd8\xdf~\xa6\xdbn\xc3nN{Pp\xbc\x87\n\xde\xaf \xeb=\xd9\x87\x9dGhX\xa67.\x80\xe7\xd2\xb9P\xc3\xbfP;\xd9\x9e\x82\xa8,\xca\x18/n\x9es\x15\xd7\xc0\xdc\x05i\xbb)\xbc\xad\xeb\xe4>\x88H)\x10\xb5<\xd9\x8a\x82\xdc\xfdq\xa7\xb2\x91\rL\x1d\xd2\x1f\xc4\xd6\xaf\x1d\x1d\xed\xe9\xb1\xf0\xde,\xdbaZH\x1an\xddO@[0\nC\xfc\xfe\x15N8\xcd&o!\x1a\xb5f\x13{4\x85ED\xdd0\x1bm\xbbXb\xbc\x8dL\x81\xfez2\x19$\x1f\xe61\x95\xd8\x1c\xfd\x8e8i\xd4\xa7\xae\x01\xdb{b\x17X\xc3)\xd0\x9f\xafX\x0c<\xd0v\xd2\x08\xef\x0f\x91Y\n\xa2')

3
src/cupstest.py Normal file
View File

@ -0,0 +1,3 @@
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:35.823082
from pyarmor_runtime_000000 import __pyarmor__
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00-\x04\x00\x00\x12\t\x04\x00\xf8\xe9\xce]\xe7y;\xf5\x82\x91+~x=\xc2\x8d\x00\x00\x00\x00\x00\x00\x00\x00\xa5\xdb\x0b\x90\xdeN\x00J\xe3\x18 \xae\xd5]\xabH9\x052\x8f\xfc\xcf\x9a\xc1\xe0?)_)l\xe4\xb4H\x8f~\xb6*L\xb7y&\x9f\\E\xd4\x04:\x04\xe3\xb9"\x8f\xe1\x86\x88\xb1\xf3\xa3\xb4\x98\x97\xf2\xb6\x1a|\x16w(^\x96\x13\xa6\xf0\x91\xfd\r\x11<\x10\xe7\xbd\xf6\x10\xfe\xa5\xb98C\x84[\x18\xb0j\xce\xd6\xa7[\xf1\xcb;R\x9ec\xaa\x05\xa34\xa6lo\xbe\xa9\x03U\x9fU\xc6\x16\x03\x9c^\x18|(\xd7\xa0}T\xce^\xb87\x88nH~\xe7\xd0\xe3\x10\x14+\x8b\x04\xb49!\x0b\x08\xbbx\xd5\x98\x7f\xee\xfb\x04\x8f\x0f;\x96\xbe\xf8\xa7\xeb\xf1\xed_\xa0\xfdl]\x9f\x1a6"\x185<\xca\xf7\xaa\xa6\xe1wC\xbe\xcfzE\x8fM.9\xcc\xc3\xc1\xf9*\x14\x86I\x9fz\xda\xf9\xd2\x149\xe9\x8a\xd0i\\\x81\xa0_X\x07\x8a5\xb4\xdf\x7fc\xd2\x1ag\x11\x1fj\xc8\x1d\x02\x88X\x05|\x81\xd0\xc8\x81x\xab@r\x13\xdbY\xcem\xf4v\x0e\x9a\'\xbb\x1b\xd0\x95\xb9\xc9J\x80\x94\xbe{\xab\x7f\x12\xeca)-\xc05\x02u\xb3\xb2\x9e\xf0\xaf \xf8a\xcc\xee\x1ayj\xdb|\td\x05*2\xd9d8\xb0\xdb\xf2\xa9\x98\x0cH@\xd5\x0f\x9b\xbb.\x95xdr\x85\xb4\xcb\xc6\xba\xf8\xc8\xbf\\\x16\xd7\xdfZd\xa5\xb8\xc4\xf5\xff\x12\xcc@\x9cp\xe6\xe2G"\x11\xac\xdd>\xdd\xfe\xbc9\xf6@\xaa\xd4\xe7\x0f\xf6\xa5\xfe\x85\x98\xe3\xcc\xd2\xde\x9a\x98\xd0\xe9\x9eR\x95\xe3\x1f\x0e\xc1\xff\xaf\x00-Z_\x08CA\xe8\x97\x96q\x93\x0b\x8d\xdaO\x93\x9c\x90\xfa>k\xe1\x90?\xc4E\x98\xe3L\xaf\x02_\x06\xe9\xc0\x18\xc90X\xfe\x17i\xbc\x86;\xae\x91\xc0\x1dV\xb9*VG\xa76}\xc7\xba`x\xe9/g\xc4\x02#\xa5\xe8\xc9|3\x1c?@\xf2\xd6R\xa3w"\'$EY\t~)\xc0\xec\xb1\x18\xb9l\x1e\x18P/\xa7\xaf\xdf\xf4\xd3\xd0\x85\xe7]n\xae\x1e\x88Hi\xc7O<R\x06\xfc\x04Y\x01\xfeS\x94\x0f\xa7pFRe\xb1D5\xaa\xee\xec\x00\x90\x8e\xc5\xf1\x99\x8fo=\x88k\x96\xb0\xdfD\x94|\x92\xe6\xba1#\x8a\xb9L\xec8e:\x8e\x9e\xb8\x01AQ\x04\xeaz\xa0\x92\x16\xf2\xab2D\xfb\xd8\x86\xe1=\xfb\xbf\x7f\xa0\x97Z\x81\xb6\xa4\x7f*\x8c\xa2k\xccV\xdb.\x05\x8f]\xce\xf3"\xefL\xa4V\xfd\xc7\x81\xf3>\x8b\x00\x81\xca@\xdc[\\7\x89\x00\xa5b\xfb\xd0\t\xa4}\x96\xfe.=A\xc2\xfe\xa7\xcf+}\xea\xae}J\xe1\xf8\xc5\xaf\x94"\xa0\xd7\x1f\x96\x17\xach\xf6\x94#\x02\x9et\xd0S\xf9@\x8cA\xc9o\x1c\xbc\xa5$dD\xceY#\x8e\xe7\xdf\xdb\xb2\t\xf1V\xa0\x90\xcc\xc0\x90\xbc\x1b\xe3\xdd\x96=\x80/(\xca\x18L\x087\xfe\x98B\x94v\xe5j\x17\xb13\xcb,\xd5\x8aT\xf3!\x98\xeb\x11\xef\xcd\xf8\x1e\x15\xcf\xee3\x8d\x86\xa1\xeaE3\x9c\xc0@mp\xc4\xd3\x16;\x9eS\x15\x83\x8e\xb1\xc1\xba\xbaZ:\xa3D\xd8<\x1c\xb7\xe9\x1d\x0e06\x8c\xa4\x98\x9bISa\x7f\xe3\xdd\x90R6WZ\x11Z9\x87\x1fS}\xdf*\xf2\x0f\xb2\xd8\x11\x16\x18\xfa\xcb\xd6\x14\xfby"\xa5&\xb53\xeb\x03\xc1\xbc\xfa\x11!H\x9d\xa7\x1a\x03wx\xed\xa5\x9e\x90\xa1\x99\xba\x05\x1e\xf8\xd4IO\rs$`\x1d\x06\xa6\x98\xa3\x14\xeb\xed@\xb1f\xf3\xc7\xae[r\r\\5\xf3\xee\t\xb5I\xd3\x16\xc4\x02\x84&5\xae\xc1\x03]+\xcf#c\xaf\xd5l6\xf5?\x1e\nPB\xd9\xd6\x89\x7f \x94\xfaS\xd6\xac\xb5\xfeB\x85\xcf\xeb\x86w\x1b\x1bY\xa0\x83\xa9\xf5\xd1\x1b&\xdc\x05\xe32!>\xb0\xc3\x9f\xf8\xc8\xe1%:W\x03i\xda\xb4\xc4\xb0\xbd\xf6\x07! \x01\x14\x1b\xcc\x9b\x8d\xa6\xbc\x84\tY>\x08\xd0\x00\xcbR<\x0e\x13\xb5\xfdSO5\x83\x1c\xd5T/\xa3\xc5q\x9di\xe5i\xbf\x10\xceE\xd4&\xf6h\xe9\xcd\x83\xf3%\xcb\xbe\xc0\xcda\xd8P\xb2m\xb7\xde\xf8\x97m\x08H\xc0t\xfd\x9e\x85d\xad\x90\x1a%K\xd2\x82\xf1\x8a\x86\x80\xf0\xa1\x89\x87\x9b\x15%\xd2t\x17\x1b\x8c\xc4\x91\x04\xbd\x97\x8aZ\xd2\x8f\xf7\x90\xb9\xb4\x99\xec\x98P\x13z\x0b\xa8\xfc%\xd2\xfd\x80(\x10\x998i\xe0d!')

3
src/globals.py Normal file

File diff suppressed because one or more lines are too long

3
src/led_heartbeats.py Normal file
View File

@ -0,0 +1,3 @@
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:35.897509
from pyarmor_runtime_000000 import __pyarmor__
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x84\x00\x00\x00\x12\t\x04\x00\xb0*\x98l\xa4\xf4\x12\x14\xb8\n_\xa9\x03\xce\xedi\x00\x00\x00\x00\x00\x00\x00\x00\x1d\xe6\x1aC\xa8\xe6#\xbf{\x99\xc4\xce\x88\xad[4\xc8\xfbs\xb4\x9d8\xde\xe3!\xaab\xf9\xd3\xcf\xc9\xd7\x84+\xa8;\xcb\x11\x0c\xc5\x1b\xd1\xa9\x90\x08\xab\xad\x8fE\xd0b\xad\x15\xb0\'7TK\x82L\xc9\xbd\xda=x(\xdf\x83\xd0\x84f\xe2\xd3\xdd\xb1\xa8lU\xde\x0f`\xa9\x07`\xeeg4\xa4w\xeb\n%\xdck\x12\\\xde\xd1Z\xeaZ\x90\x86o\xa6\xa7\xb9\x7f\xba\xda\x06\xe3\x0c\xadv\x9f$\xc6\x87\xfc"\xb1E\x8e@T`\xd40\xa2\xfbc')

3
src/led_status.py Normal file

File diff suppressed because one or more lines are too long

1
src/license Normal file
View File

@ -0,0 +1 @@
gAAAAABn0-rYDgclBAdn9yHHzQ70ZL0G2jlh9OR774Nfj0N6M7_eqMr_K01oAOI8FycV7yLBChe4iaQpNtsnpLaRpXotZtWxt7-AIOEi4591QDXfxpgJIfo_RY57H20-FpDtWCXzei2kFupOVIeoShiyg7fUN1HOO4AurzG64vaoVlylEcl3rZ4=

3
src/license_checker.py Normal file

File diff suppressed because one or more lines are too long

3
src/printer_admin.py Normal file

File diff suppressed because one or more lines are too long

3
src/printer_monitor.py Normal file

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,2 @@
# Pyarmor 9.0.7 (trial), 000000, 2025-03-14T02:02:35.420965
from .pyarmor_runtime import __pyarmor__

Binary file not shown.

3
src/resources.py Normal file
View File

@ -0,0 +1,3 @@
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:36.425013
from pyarmor_runtime_000000 import __pyarmor__
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x0b\x03\x00\x00\x12\t\x04\x00\xfcN\x18\xea\xa1JKN\xb1\xb4\xf5O?\x92\x1a\xce\x00\x00\x00\x00\x00\x00\x00\x00\xb3d\x87\xc41\xfc\x8fS\x9d\x9aBs\xc0y]b\xaeK\xc2\xc40m\xdc\xbf\xbe\xdf\x8b\xab\xae\x87Fc\x07\x1a\x11n\xbd\xbd\x8fS\x9eZ\x8d\xb5"\xaa\xe8\xc3\x8bdt\xdf\xe7\xdf\x84\xe2r\xda\xf5Z\x00p\xf2\xe5@\x8e\x0e4j\xa5;\xbd\xff\x14?\xf6\xa7\xc4[\x19\x9f\x9b\x1f7\xd0Iy\xcb\xa4\x96\xff\xbeF\x12q0q\xf7>~2\xb5n\x03\x14\x10\xa8\x1f\x1fl\xd4\x8f;\x02\x1d\'\xcf_\xf3\x85\xc4\xe2\x84\xdb\x9c}\xfb\xabF\xe3\xa4A\x97\xd7\x80\xdbz^\x1e\xf3\x95\t\xba\xb2HM\x97\xf9\xa5\x18\xa9\x12\xffY\xa7\x0f\x1b\xca7}C9Q5\xf64^\xe2\xfd{TM\xfe\xb8\xb0\x16\x9bj\x8eJ \xd7\xd3\xc9\xe2\x0fW\xfe\x11C\xb5\xb7\x0e\xe4\xa4\x9b\xad\x9f\xce\xeeb\xf2\xc4HW6\xc2I\xac\xf87\x96\xa8\xc1\xee\x1f\xab@\x9d\xb3|\x85\xbd\xf2\x98\x95\xbb\x1b\xb99\xb7\xca\xf3\x90\x81Tk9R\t+\xb4H\x14\xae\xba8\x02\xe6\xca\x9dm\r]-\xa9b,\x8f\t\xe7m\x1b\x88M\x8f\xb4\x16"\xffT\x04\xda,zV\x82\xa0\x98\x00\x1d\r0i\xa6\xfd\xb3\xef\x18\x13<\xbc\xd9\xf8\xa0 \xedn\xcf\x86\xe4\x91\x10\xd5\xf6\x9a\xe8%|\xc7Rn<Y\xa2\x95\x0f)\xb1\x89P\xd4p9\xb1\x14\xc4Em\xc9%F\x9c\xb5\x985\xcb\x07\xfb\xf7V\xe4\xc8{\xdd\xad?\xc7r\xc1\x8aDA\xbdc\xd6\x0c\xb1\x08f\xe1XE\x1d\xc6\x15@\xe0\xb3\xc5\xbaf\xfa\x90\xb3\xddps\xf3\xd1\xcfqM\xce\xcb\r\xb2\xfc\x95d\x1c\xc4\x8e\x85`\x0f\x92\xad\\v\x07v\x16w2\xe6\xf7h\xab\xbf\xaf\x81e\xea\xaf\xcd\xd6P\xb5\x02x\xf2\xf6\xb0Q\x84)\x1d\x94~\xdc\xfbL/F\x15\xcb,\xc1\xd0G0\xb3\x1dNW\x8fa6F!\xd8\xbf9\xa5k?\x8c\n\'t3\x1a\x1d\xafk\xca\xd4\xda\x8d)\xc6\xf0\xc6\n\x9f\xaa\x1c\xd7b\x8c\xee\x96\x1c\xc9\x9d\xe9\xb0\xf6L\x87m\xeb\xf3\x0eI\xf7\xf3\x93^FL\xa2\xe2\xf1R~\xb9q\xc6K6\xc7\xf9\xee\xce\xc5\x1c\xb7\x8fbQ=\x02\x89\xb1\xbd \xb3\x04\x98,\x05\xddv\x10~\x05\xf2\x158D\xcb\xf2\xef\xeb\xd2\xcc\xd8\r\xd6\x8fe\'\xa66\x8f\xa8I\xe5`\x0bH\xda\xa3W\n\xdc\x05\xfb\xb8\x81\xaax\xed\xe5*\xba\x97\xfe\xbev\xbe\x9aL\xc0\xf0\x88\xf0\xd2V\xeaT\xee\x19\xb1\tT\x1f\xc4\x92\xc0\xc3Z\xcd`\x8e\xc4\xaa\x8e1*\xb3\xc3\xaf\xd9\x15P\x8f-\x8c\x91GD\x92\xf33J#\x1cM\x01\x9b$\xf2\xc5L0\x1e4\xbe_\xebt\x16\x0f\x19x[\xe6\x95m\xb3\xbf\x90Yt\xb6\x16\xa2L\x895\xa2\xcd\x0c\x00Vz\xc7zs\x81*\x81%CU\x98l\x15\xb0\x80\xb8KN\xfa\x9c\xacYg\'\x99\xe5\xc3\xdcb\x15\xc7t\xb8Bk\x96\x04\xf1!G\xef\xfbs\xcf\xe7\xa5\xb3h?\x9c\xd7\xa8\xd8[\r\xb1|\xc6\x0f\xe4\xee\xe1\x10\xd9\xfe\xa5\x9b\xf2\xdf])\x89]x\x01\xee\xb7\xdaR\xc2\xa5\xa2A\xee\x87 w\x19\x1fF\xb3\x01\xae@\xb2\x94\xfd\xbd\xbc&\x8c\xc28\xff\xd7&\xd6\xc1\r5\xb5')

3
src/spi_flash.py Normal file

File diff suppressed because one or more lines are too long

3
src/systemId.py Normal file
View File

@ -0,0 +1,3 @@
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:36.557856
from pyarmor_runtime_000000 import __pyarmor__
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00e\x05\x00\x00\x12\t\x04\x00\xaaQU<z\x0f\xcd\xba\xca$\xc9\xb4JX\xf5]\x00\x00\x00\x00\x00\x00\x00\x00;\t\xf7b+\x13\x01g\xe0\x9e\xdfR\x80\xa7\xca*\xbaAmU\x94z\xd5\x8b\x9d\xc7\x05<A\xb5\x0b$\x81\xdbk3%cT$\'\xc2\x19\x1dgG\x81#\xd5Dc`\xdd[Z\xc8\xff\xee\x1doM\x13\'\xa1j\xa0\xe3:\xbab\xd8TF\xfd\x90H\xbe{\xc1C\x9e\x90\xc1\xda\xbf\xcb\xc5\x0fB\xc4*A\xc5\x87\xca\xe4\xedb-\xb5\xbc\xed\xf9\xec\xb4o\x02\x12^{\x9f\xc1\xaf\x11\x8ey\x85N9^O\x9e\x15\xd4`\xb7\xb1\x92x\x11\xa2Z\xc2s\x89\xdb\x1cO-\xb7\xd7\xe61;\xc6l\x04_ji\x8d%\xba\x901f\n\x90\xc0o\xfdH\x87\xe2<\xab\xc1\xb4\x8c\xf00D{h\xd8p\x0c\x03V\xeeO\x05\x91\xcb\x85\x01z$\xa6\x020D\x8f\xd3\xaeZ4.\xfag\x82\xaf\xcf\x17\xa3\xae\xf7\x0e\x173\xdd\x16\x91\x88-\x1f\x9a\xec%\x1e\x87\x98\x89\x9a\x912I#P}\xd74RTP<\xf0T\xd9\xdf\xbb\xfd\xe8\xf8\x9e\x01\x86\xf1\xdd\xf6Kl\xc0\xd3X\x8f\xc4\xbb\xc9\xff\xa4\x9d\xb6\x02\xae\x13h Sm\xcb\xc3\xe26!\xa8\xafB\xae\xca\x04\x11\xc3\x83\xfa%%w\xce\x82\x8cx"\x85/\x9a\xf7\xbf\x8c\x88\xc9^\xd6b_T\t\xa1U:\xd7s\'\x8cy\xaf\xea\xa6i\xa5&|\xc4\xd6\x17;\xb2\x04\xf7\xeel\xbc\xb0\xe1u\xa9\xe3\x9fO\xaa\x0c\x10\xdc\xb5\x8b\xe8\xa8|~N\x1e\xe7\x06Z;N\xbd\x95_\xa6`,\x97*D\xc0\xd1\r9"\xf2\x8dn\x11\xc3\x0bA\xe2;\x15{S8J\xa52\x00\xd0\x06\xfaYsgU,\x0b\xc9K\xf6\xeey3F1\xc1\xfc\xbf+\x81\xa6\x00\x0b\xa9\xc0\xc9mzN\x82\xb1Ti6\x1f\x98$\xc3\x87\x89\tn*\x18S\t\xcdQ\x83=\x84\xd8\x189\xc8\xf7I\x83\xb3m5\x9a\xf3Q\xb5\xeb[g\x12\xcf=\x19\xb5Z\x1f\x9d%^\x97!;@T\x80\x9c\xc7\xd4y\xb3\x00x\xd2\x0eI\x05\xf0s\xe2\xc0\x83\xb9\xad\x8dl\x0b\x0e5\xf5C\x88\x84w\xde=\x9a\xfe<{\x07\x97}X\x9c\x1f\xba\xe1\xdc\xa9C\xe1:]=v\xb2\x8es\xb6&\xa2\x06\xd9Y\x0cX\xe7\x8e\xf0`#C\xe8#\x9e\x18PFP\xff\xef\xc2R\xc8\xfd?|\xc3W\xd9C\xf4\x0bL\x9b^\x13\xceY\xb6\xee\xc2{\x0b\x0b1\xc3\x99-\xb3\xbe\xd6!l\xd7\xadW\x97\x9b\xddoq\xd2\xd3\x16\xb9\x84\xe6\x04\xf9\xfe[\xc0\x1c\x0bc\xb8>\xa7)(\xe2\xf6\xe8\xea\xe7\xf6\xeb\x8b[\xe7\xce\xd2\xbe\xa8!\xe1\xda\xd1\xce\xa1?Yj%\xb4\x07\x93\x0c\x1d"\xe1\xb9\xe3\xeaXm\xaa\xe3\xd9\x8a-\xac\xb0\xe86d\xad\xb0\xfdY{\xb4@\xadS]\xd0\x8e\xe7M\x08e\xbc/\xa1C\xc2j)\xad\x06\x1eo14\x0bg\x14H\x8a\xc2\x05\xdf\\w\x07\x0c\x1f\xe2R\x06\x02!\xb3|\xe2\xed\x86vZ\xce\x8f4l4R\x15\x170\xa2\x10\xe3\xb9\x06v\'q\xc75\x82\x00\xd6\x15\xa3;am\x93\x9aA\xd5d\x87\xdab\x87\x05\x11\x11\x94\x10\x1ah+G\xf9\x1c8\xeac\xd4uK\xb7h\x8c\x02c\x88\x88\xb6F\xdc\xeb\xeenD\xbdRo\xed\xbf+\xc8DFp\xc8\xf2\xfc\x16\xca\xef\x0b\xb4o\x07\x8e\xaf\x1dh\x19(\xd8\xce\xe4\xb5|\x99\xe3\xb4\xdf58\xea\xa5s\xca\x17i\xc7\xe9\xf9\xef\xf6I_2\xa0\x11\x84\xdf\x08\x1dG\x00zR\xc3d\x87\xcfq\xff\x8e\'\xf2P\x8f\x03\xca\xf4*\x85\xf0\x16\xb3~\x0c\xa5\xdb\xeb\xa7.\xcc&\x14\xba\xf7\xca\xec\xc6\x9cL\x86c\xf3\x8bz\x8d\x8d;$\xf4\x85\xa7\xdfJS;\xbcSi\x83\xfe\x9do\xb7C\x12\x0c\x86\xcb\xcc\xac\x06<\xcf\xb5\xafmO]o\xcc)p\x0c\x84\x85\xf2\xd9\xaaj\xd6F\xc1W\x10\xb1\xebR\xf1\xdb\xfa\xbc\x99\x999\x90\xb6;\t\x83\x0cH\x85\xbe\x8a.\x84@\x01a6\xea\x8c\xc0\xa9\x9c\x08\x95\xa8\xa6R\x08\xdbaU\xce\x9e\xd1\\\x0e\x89Cy%\xad\xb0\xf3\xe4\x10}\x83\x93\xb3B\xe5%\xe4e\xc0P\xb9\xde\x12en\xa9\x1aE\xa0\xa9{\xb1\x05\rV\xfbG\x1c\x7f\xa0\xfe\xb2\xe9&~\xfax{\xc3\\\x9f!\xfb\x1c\x11S\xfff\r\xbc{<\xbe\x8bf`r\x13\\k^a\xa7\\\xd1\xf8\xca+\x15\xf9\xa9\xccG\xb9#\x9f\xbc\xb2\xfb\xfa\xee=5"\x97R\xb6\xa9\xf38\xe72\x07S\xf0?\\h\\w\xa9\xdeC\xfb\x11\xb4\xef_\xc7\xffFH=\x88\xd74\x8b\x0f}\xc9\t\xa8_\x87\x10\xdf\xd8\xc2\xf3\xd0\x9a\xaa\xea\xfee\x80\xe0\xf7x\x0e\x9d\x17\x89\x8euW\x97\xf4=:\x87f\x14\x94df\xb1t\xbdt6\xd7\xf3\x01\x85.\xecE\xdd{\xfc\xb7\x88\x98\xc7RB\xfe\xc3\xb9\xcf&,\xbd&\xc4\x8d\xab2\x7f\xa3\xabQ\xe6n\x0f\x16\x0c?X\x18<|\xc4\xa1OSh\xffL\xc4\xef\x11\x8c\x83He\xc9\x9a\x073\x0e\xbc\xbf:\x81.\xbf\xa5\x95\x9c\xf9\xaeJ\xe7\xce\xd0\xd7\xe4\x02\xea\x9d\xe8V\xe6!\xa0\xd7d\xa9Dk\x14\xd8\xbd\xc4\x01I\x8e\xd0\xf8\x04\x9c\xcbO\x84\xcf\xb4\x01\t\x01\xb3!\t\xb2\xfdnjU\x84W\x8a>\xc6\xd8\xca\xeb\x82\x15\xbb\x9f\x81\xc9\x85\xe0\xa5\x1b\xe3\xea\xc1\x13 rH&&$\xc3\xd4\xbf\x8f\x84/\xbbfx\xb1:\x91\xf9\x8e\xbaC\xe9\x8al~\xa1\x87\x13\xa6\xbb\'\x15\xc4\xe3) x\x8a?\x8bR\x05\xf0\x8d\xf5\t\xfd\xfaV\xbeZ*XQ\xf4\x04s\xe0\xb6\r\x07<\x88\xb7E\xf3\x1f\x1c\xb7\xf4\x10\xbb\xb8\xe5\xae\x9b\x91@\x19\x18r\xc4WS\x18K\x97\xab\x82\xe4\x96g\xce\x18\x08v')

3
src/unique_activation.py Normal file

File diff suppressed because one or more lines are too long

3
src/wifi_config.py Normal file

File diff suppressed because one or more lines are too long

3
src/wsgi.py Normal file
View File

@ -0,0 +1,3 @@
# Pyarmor 9.0.7 (trial), 000000, non-profits, 2025-03-14T02:02:36.778423
from pyarmor_runtime_000000 import __pyarmor__
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\n\x00o\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00\x9a\x01\x00\x00\x12\t\x04\x00\x91F\xcf4\xbeWf\xf6|\xf4\x84\xc4\x82\x82f\xec\x00\x00\x00\x00\x00\x00\x00\x00\xbc\xa3?\xcd\x02\x9b\x98\xf3g\xdc1\xb3\xdb\xc34G\xa0\x03E\xd9G;&b\xa7!\x97\xf3\xf6y\x9dkujO8~\x9f\x03_F&\x9d\x00\x0c\xf1\x9ct\x83|/\xccr\xcf\x9c\x07\x8b9\x89\xef\xd2\xc1\xe2<\xec$\x19\xea\xf5\x04\xc8}\x9e\x83\xa1\x11\xbe\x8a+\x8c\xcf\xf7U~9,gaqA\xeb\x89\x87\xe4\x94\x14r\x98n_\xb1&\xd1R\xa5b\x87(\xc0\xfc\xd7\xca\x17\xde\xbe\x9aU\nFm\r\xb9h\xbf\xd1\xd9\xcb\xab\xe8$\x0e\x1e\xb4i,4%d\xc2G\xefY2b1i\x97M\xb7\x88\x82\x9c\x8c\xef\xdfm\nY)g\xc4\xee\x9d\xda\x83!\xd23\xfe\xce\xa5A\xf1)\xd2k+\xcdsg\xb8\xa9\xef\xa8e\x9f\xd3@\xeb\xab\xf2=|\x14\xb4\xd2\xe7\x14C\x1a;\xe7k\xf8dk>\x8e\xfd\xce\xf7\x0fL\xc5\x0b\x9d\x0e\xae\xd9\x17\xe6\xffx\xbf\xcd\xf7\xf8\xef\x99$-UQ\x0f\xd7|g\xd3n4\xefz\n\x16\xa81\xacPZ\xc3\xa8\xe45\xb6H\x81\xc8#\x81N\xff\xb8;B\xe6\xb7p\xc00@)`\xdd7K\x1cB\xb7\xbar\xb7\x7f^\xf3F\xed\x9d\xf2GX\xb6d\xef1\x18"\xab\xb9n\xefZ\x94\xb0\x94\xf5\xbbo\xeb\x94\x83\xaeR6\n\xfd\xf5/_\x0f\xef\xfd\\Y\xe1"\xc9I\xc4\x19\xf7\x95\xa6:\x8f\xfb\xa3\xa4R\xdb2&.\xbe\xf2\xab\x1f\x11!an\x9d\xe8n\x88\xb6%\xb7\x15\x95s\xcc\xfch\x99\x00Ls\x9be\xaaU\xee\x7f\xde\xa7|a3\xe2A\xa7\xdb\xec6\xaf\x13\xd5yG\x02\xe2"K\x96\xa1q\x84Iv\xd5\xf9\x95\x9c\xfd\xc2\x17\x88_zu')

107
static/css/styles.css Normal file
View File

@ -0,0 +1,107 @@
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f0f0f0;
}
.navbar {
width: 100%;
background-color: black;
border-bottom: 2px solid white;
display: flex;
justify-content: flex-start;
align-items: center;
box-sizing: border-box; /* Ensure padding and border are included in the width */
}
.navbar-left {
padding: 0 10px;
}
.navbar ul {
list-style-type: none;
margin: 0;
padding: 0;
display: flex;
align-items: center;
position: relative; /* Ensure relative positioning for the submenu */
}
.navbar ul li {
float: left;
position: relative; /* Ensure relative positioning for the submenu */
}
.navbar ul li a {
display: block;
color: white;
text-align: center;
padding: 14px 16px;
text-decoration: none;
border-right: 1px solid white;
}
.navbar ul li a:hover {
background-color: grey;
}
.navbar ul li a.disabled {
color: grey;
pointer-events: none;
}
.navbar ul .submenu {
display: none;
position: absolute;
top: 100%;
left: 0;
background-color: black;
list-style-type: none;
margin: 0;
padding: 0;
border-top: 2px solid white;
z-index: 1000;
}
.navbar ul .submenu li {
float: none;
border-right: none;
}
.navbar ul .submenu li a {
padding: 10px 16px;
border-bottom: 1px solid white;
}
.navbar ul .submenu li a:hover {
background-color: grey;
}
.navbar ul li:hover > .submenu {
display: block;
}
.nav-image {
height: 40px;
width: auto;
}
.content-wrapper {
display: flex;
justify-content: center;
width: 100%;
box-sizing: border-box; /* Ensure padding and border are included in the width */
}
.content {
width: 90%; /* Increased width */
max-width: 1400px; /* Increased max-width */
text-align: center;
box-sizing: border-box; /* Ensure padding and border are included in the width */
}
.content h1 {
color: black;
}

8030
static/fontawesome/css/all.css vendored Normal file

File diff suppressed because it is too large Load Diff

9
static/fontawesome/css/all.min.css vendored Normal file

File diff suppressed because one or more lines are too long

1594
static/fontawesome/css/brands.css vendored Normal file

File diff suppressed because it is too large Load Diff

6
static/fontawesome/css/brands.min.css vendored Normal file

File diff suppressed because one or more lines are too long

6375
static/fontawesome/css/fontawesome.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

19
static/fontawesome/css/regular.css vendored Normal file
View File

@ -0,0 +1,19 @@
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-style-family-classic: 'Font Awesome 6 Free';
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Free'; }
@font-face {
font-family: 'Font Awesome 6 Free';
font-style: normal;
font-weight: 400;
font-display: block;
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }
.far,
.fa-regular {
font-weight: 400; }

View File

@ -0,0 +1,6 @@
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-regular:normal 400 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:400;font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}.fa-regular,.far{font-weight:400}

19
static/fontawesome/css/solid.css vendored Normal file
View File

@ -0,0 +1,19 @@
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-style-family-classic: 'Font Awesome 6 Free';
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Free'; }
@font-face {
font-family: 'Font Awesome 6 Free';
font-style: normal;
font-weight: 900;
font-display: block;
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
.fas,
.fa-solid {
font-weight: 900; }

6
static/fontawesome/css/solid.min.css vendored Normal file
View File

@ -0,0 +1,6 @@
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:host,:root{--fa-style-family-classic:"Font Awesome 6 Free";--fa-font-solid:normal 900 1em/1 "Font Awesome 6 Free"}@font-face{font-family:"Font Awesome 6 Free";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}.fa-solid,.fas{font-weight:900}

640
static/fontawesome/css/svg-with-js.css vendored Normal file
View File

@ -0,0 +1,640 @@
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
:root, :host {
--fa-font-solid: normal 900 1em/1 'Font Awesome 6 Solid';
--fa-font-regular: normal 400 1em/1 'Font Awesome 6 Regular';
--fa-font-light: normal 300 1em/1 'Font Awesome 6 Light';
--fa-font-thin: normal 100 1em/1 'Font Awesome 6 Thin';
--fa-font-duotone: normal 900 1em/1 'Font Awesome 6 Duotone';
--fa-font-sharp-solid: normal 900 1em/1 'Font Awesome 6 Sharp';
--fa-font-sharp-regular: normal 400 1em/1 'Font Awesome 6 Sharp';
--fa-font-sharp-light: normal 300 1em/1 'Font Awesome 6 Sharp';
--fa-font-sharp-thin: normal 100 1em/1 'Font Awesome 6 Sharp';
--fa-font-brands: normal 400 1em/1 'Font Awesome 6 Brands'; }
svg:not(:root).svg-inline--fa, svg:not(:host).svg-inline--fa {
overflow: visible;
box-sizing: content-box; }
.svg-inline--fa {
display: var(--fa-display, inline-block);
height: 1em;
overflow: visible;
vertical-align: -.125em; }
.svg-inline--fa.fa-2xs {
vertical-align: 0.1em; }
.svg-inline--fa.fa-xs {
vertical-align: 0em; }
.svg-inline--fa.fa-sm {
vertical-align: -0.07143em; }
.svg-inline--fa.fa-lg {
vertical-align: -0.2em; }
.svg-inline--fa.fa-xl {
vertical-align: -0.25em; }
.svg-inline--fa.fa-2xl {
vertical-align: -0.3125em; }
.svg-inline--fa.fa-pull-left {
margin-right: var(--fa-pull-margin, 0.3em);
width: auto; }
.svg-inline--fa.fa-pull-right {
margin-left: var(--fa-pull-margin, 0.3em);
width: auto; }
.svg-inline--fa.fa-li {
width: var(--fa-li-width, 2em);
top: 0.25em; }
.svg-inline--fa.fa-fw {
width: var(--fa-fw-width, 1.25em); }
.fa-layers svg.svg-inline--fa {
bottom: 0;
left: 0;
margin: auto;
position: absolute;
right: 0;
top: 0; }
.fa-layers-text, .fa-layers-counter {
display: inline-block;
position: absolute;
text-align: center; }
.fa-layers {
display: inline-block;
height: 1em;
position: relative;
text-align: center;
vertical-align: -.125em;
width: 1em; }
.fa-layers svg.svg-inline--fa {
-webkit-transform-origin: center center;
transform-origin: center center; }
.fa-layers-text {
left: 50%;
top: 50%;
-webkit-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);
-webkit-transform-origin: center center;
transform-origin: center center; }
.fa-layers-counter {
background-color: var(--fa-counter-background-color, #ff253a);
border-radius: var(--fa-counter-border-radius, 1em);
box-sizing: border-box;
color: var(--fa-inverse, #fff);
line-height: var(--fa-counter-line-height, 1);
max-width: var(--fa-counter-max-width, 5em);
min-width: var(--fa-counter-min-width, 1.5em);
overflow: hidden;
padding: var(--fa-counter-padding, 0.25em 0.5em);
right: var(--fa-right, 0);
text-overflow: ellipsis;
top: var(--fa-top, 0);
-webkit-transform: scale(var(--fa-counter-scale, 0.25));
transform: scale(var(--fa-counter-scale, 0.25));
-webkit-transform-origin: top right;
transform-origin: top right; }
.fa-layers-bottom-right {
bottom: var(--fa-bottom, 0);
right: var(--fa-right, 0);
top: auto;
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
transform: scale(var(--fa-layers-scale, 0.25));
-webkit-transform-origin: bottom right;
transform-origin: bottom right; }
.fa-layers-bottom-left {
bottom: var(--fa-bottom, 0);
left: var(--fa-left, 0);
right: auto;
top: auto;
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
transform: scale(var(--fa-layers-scale, 0.25));
-webkit-transform-origin: bottom left;
transform-origin: bottom left; }
.fa-layers-top-right {
top: var(--fa-top, 0);
right: var(--fa-right, 0);
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
transform: scale(var(--fa-layers-scale, 0.25));
-webkit-transform-origin: top right;
transform-origin: top right; }
.fa-layers-top-left {
left: var(--fa-left, 0);
right: auto;
top: var(--fa-top, 0);
-webkit-transform: scale(var(--fa-layers-scale, 0.25));
transform: scale(var(--fa-layers-scale, 0.25));
-webkit-transform-origin: top left;
transform-origin: top left; }
.fa-1x {
font-size: 1em; }
.fa-2x {
font-size: 2em; }
.fa-3x {
font-size: 3em; }
.fa-4x {
font-size: 4em; }
.fa-5x {
font-size: 5em; }
.fa-6x {
font-size: 6em; }
.fa-7x {
font-size: 7em; }
.fa-8x {
font-size: 8em; }
.fa-9x {
font-size: 9em; }
.fa-10x {
font-size: 10em; }
.fa-2xs {
font-size: 0.625em;
line-height: 0.1em;
vertical-align: 0.225em; }
.fa-xs {
font-size: 0.75em;
line-height: 0.08333em;
vertical-align: 0.125em; }
.fa-sm {
font-size: 0.875em;
line-height: 0.07143em;
vertical-align: 0.05357em; }
.fa-lg {
font-size: 1.25em;
line-height: 0.05em;
vertical-align: -0.075em; }
.fa-xl {
font-size: 1.5em;
line-height: 0.04167em;
vertical-align: -0.125em; }
.fa-2xl {
font-size: 2em;
line-height: 0.03125em;
vertical-align: -0.1875em; }
.fa-fw {
text-align: center;
width: 1.25em; }
.fa-ul {
list-style-type: none;
margin-left: var(--fa-li-margin, 2.5em);
padding-left: 0; }
.fa-ul > li {
position: relative; }
.fa-li {
left: calc(var(--fa-li-width, 2em) * -1);
position: absolute;
text-align: center;
width: var(--fa-li-width, 2em);
line-height: inherit; }
.fa-border {
border-color: var(--fa-border-color, #eee);
border-radius: var(--fa-border-radius, 0.1em);
border-style: var(--fa-border-style, solid);
border-width: var(--fa-border-width, 0.08em);
padding: var(--fa-border-padding, 0.2em 0.25em 0.15em); }
.fa-pull-left {
float: left;
margin-right: var(--fa-pull-margin, 0.3em); }
.fa-pull-right {
float: right;
margin-left: var(--fa-pull-margin, 0.3em); }
.fa-beat {
-webkit-animation-name: fa-beat;
animation-name: fa-beat;
-webkit-animation-delay: var(--fa-animation-delay, 0s);
animation-delay: var(--fa-animation-delay, 0s);
-webkit-animation-direction: var(--fa-animation-direction, normal);
animation-direction: var(--fa-animation-direction, normal);
-webkit-animation-duration: var(--fa-animation-duration, 1s);
animation-duration: var(--fa-animation-duration, 1s);
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
.fa-bounce {
-webkit-animation-name: fa-bounce;
animation-name: fa-bounce;
-webkit-animation-delay: var(--fa-animation-delay, 0s);
animation-delay: var(--fa-animation-delay, 0s);
-webkit-animation-direction: var(--fa-animation-direction, normal);
animation-direction: var(--fa-animation-direction, normal);
-webkit-animation-duration: var(--fa-animation-duration, 1s);
animation-duration: var(--fa-animation-duration, 1s);
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1));
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.28, 0.84, 0.42, 1)); }
.fa-fade {
-webkit-animation-name: fa-fade;
animation-name: fa-fade;
-webkit-animation-delay: var(--fa-animation-delay, 0s);
animation-delay: var(--fa-animation-delay, 0s);
-webkit-animation-direction: var(--fa-animation-direction, normal);
animation-direction: var(--fa-animation-direction, normal);
-webkit-animation-duration: var(--fa-animation-duration, 1s);
animation-duration: var(--fa-animation-duration, 1s);
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
.fa-beat-fade {
-webkit-animation-name: fa-beat-fade;
animation-name: fa-beat-fade;
-webkit-animation-delay: var(--fa-animation-delay, 0s);
animation-delay: var(--fa-animation-delay, 0s);
-webkit-animation-direction: var(--fa-animation-direction, normal);
animation-direction: var(--fa-animation-direction, normal);
-webkit-animation-duration: var(--fa-animation-duration, 1s);
animation-duration: var(--fa-animation-duration, 1s);
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
-webkit-animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1));
animation-timing-function: var(--fa-animation-timing, cubic-bezier(0.4, 0, 0.6, 1)); }
.fa-flip {
-webkit-animation-name: fa-flip;
animation-name: fa-flip;
-webkit-animation-delay: var(--fa-animation-delay, 0s);
animation-delay: var(--fa-animation-delay, 0s);
-webkit-animation-direction: var(--fa-animation-direction, normal);
animation-direction: var(--fa-animation-direction, normal);
-webkit-animation-duration: var(--fa-animation-duration, 1s);
animation-duration: var(--fa-animation-duration, 1s);
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
-webkit-animation-timing-function: var(--fa-animation-timing, ease-in-out);
animation-timing-function: var(--fa-animation-timing, ease-in-out); }
.fa-shake {
-webkit-animation-name: fa-shake;
animation-name: fa-shake;
-webkit-animation-delay: var(--fa-animation-delay, 0s);
animation-delay: var(--fa-animation-delay, 0s);
-webkit-animation-direction: var(--fa-animation-direction, normal);
animation-direction: var(--fa-animation-direction, normal);
-webkit-animation-duration: var(--fa-animation-duration, 1s);
animation-duration: var(--fa-animation-duration, 1s);
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
animation-timing-function: var(--fa-animation-timing, linear); }
.fa-spin {
-webkit-animation-name: fa-spin;
animation-name: fa-spin;
-webkit-animation-delay: var(--fa-animation-delay, 0s);
animation-delay: var(--fa-animation-delay, 0s);
-webkit-animation-direction: var(--fa-animation-direction, normal);
animation-direction: var(--fa-animation-direction, normal);
-webkit-animation-duration: var(--fa-animation-duration, 2s);
animation-duration: var(--fa-animation-duration, 2s);
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
-webkit-animation-timing-function: var(--fa-animation-timing, linear);
animation-timing-function: var(--fa-animation-timing, linear); }
.fa-spin-reverse {
--fa-animation-direction: reverse; }
.fa-pulse,
.fa-spin-pulse {
-webkit-animation-name: fa-spin;
animation-name: fa-spin;
-webkit-animation-direction: var(--fa-animation-direction, normal);
animation-direction: var(--fa-animation-direction, normal);
-webkit-animation-duration: var(--fa-animation-duration, 1s);
animation-duration: var(--fa-animation-duration, 1s);
-webkit-animation-iteration-count: var(--fa-animation-iteration-count, infinite);
animation-iteration-count: var(--fa-animation-iteration-count, infinite);
-webkit-animation-timing-function: var(--fa-animation-timing, steps(8));
animation-timing-function: var(--fa-animation-timing, steps(8)); }
@media (prefers-reduced-motion: reduce) {
.fa-beat,
.fa-bounce,
.fa-fade,
.fa-beat-fade,
.fa-flip,
.fa-pulse,
.fa-shake,
.fa-spin,
.fa-spin-pulse {
-webkit-animation-delay: -1ms;
animation-delay: -1ms;
-webkit-animation-duration: 1ms;
animation-duration: 1ms;
-webkit-animation-iteration-count: 1;
animation-iteration-count: 1;
-webkit-transition-delay: 0s;
transition-delay: 0s;
-webkit-transition-duration: 0s;
transition-duration: 0s; } }
@-webkit-keyframes fa-beat {
0%, 90% {
-webkit-transform: scale(1);
transform: scale(1); }
45% {
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
transform: scale(var(--fa-beat-scale, 1.25)); } }
@keyframes fa-beat {
0%, 90% {
-webkit-transform: scale(1);
transform: scale(1); }
45% {
-webkit-transform: scale(var(--fa-beat-scale, 1.25));
transform: scale(var(--fa-beat-scale, 1.25)); } }
@-webkit-keyframes fa-bounce {
0% {
-webkit-transform: scale(1, 1) translateY(0);
transform: scale(1, 1) translateY(0); }
10% {
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
30% {
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
50% {
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
57% {
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
64% {
-webkit-transform: scale(1, 1) translateY(0);
transform: scale(1, 1) translateY(0); }
100% {
-webkit-transform: scale(1, 1) translateY(0);
transform: scale(1, 1) translateY(0); } }
@keyframes fa-bounce {
0% {
-webkit-transform: scale(1, 1) translateY(0);
transform: scale(1, 1) translateY(0); }
10% {
-webkit-transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0);
transform: scale(var(--fa-bounce-start-scale-x, 1.1), var(--fa-bounce-start-scale-y, 0.9)) translateY(0); }
30% {
-webkit-transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em));
transform: scale(var(--fa-bounce-jump-scale-x, 0.9), var(--fa-bounce-jump-scale-y, 1.1)) translateY(var(--fa-bounce-height, -0.5em)); }
50% {
-webkit-transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0);
transform: scale(var(--fa-bounce-land-scale-x, 1.05), var(--fa-bounce-land-scale-y, 0.95)) translateY(0); }
57% {
-webkit-transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em));
transform: scale(1, 1) translateY(var(--fa-bounce-rebound, -0.125em)); }
64% {
-webkit-transform: scale(1, 1) translateY(0);
transform: scale(1, 1) translateY(0); }
100% {
-webkit-transform: scale(1, 1) translateY(0);
transform: scale(1, 1) translateY(0); } }
@-webkit-keyframes fa-fade {
50% {
opacity: var(--fa-fade-opacity, 0.4); } }
@keyframes fa-fade {
50% {
opacity: var(--fa-fade-opacity, 0.4); } }
@-webkit-keyframes fa-beat-fade {
0%, 100% {
opacity: var(--fa-beat-fade-opacity, 0.4);
-webkit-transform: scale(1);
transform: scale(1); }
50% {
opacity: 1;
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
@keyframes fa-beat-fade {
0%, 100% {
opacity: var(--fa-beat-fade-opacity, 0.4);
-webkit-transform: scale(1);
transform: scale(1); }
50% {
opacity: 1;
-webkit-transform: scale(var(--fa-beat-fade-scale, 1.125));
transform: scale(var(--fa-beat-fade-scale, 1.125)); } }
@-webkit-keyframes fa-flip {
50% {
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
@keyframes fa-flip {
50% {
-webkit-transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg));
transform: rotate3d(var(--fa-flip-x, 0), var(--fa-flip-y, 1), var(--fa-flip-z, 0), var(--fa-flip-angle, -180deg)); } }
@-webkit-keyframes fa-shake {
0% {
-webkit-transform: rotate(-15deg);
transform: rotate(-15deg); }
4% {
-webkit-transform: rotate(15deg);
transform: rotate(15deg); }
8%, 24% {
-webkit-transform: rotate(-18deg);
transform: rotate(-18deg); }
12%, 28% {
-webkit-transform: rotate(18deg);
transform: rotate(18deg); }
16% {
-webkit-transform: rotate(-22deg);
transform: rotate(-22deg); }
20% {
-webkit-transform: rotate(22deg);
transform: rotate(22deg); }
32% {
-webkit-transform: rotate(-12deg);
transform: rotate(-12deg); }
36% {
-webkit-transform: rotate(12deg);
transform: rotate(12deg); }
40%, 100% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg); } }
@keyframes fa-shake {
0% {
-webkit-transform: rotate(-15deg);
transform: rotate(-15deg); }
4% {
-webkit-transform: rotate(15deg);
transform: rotate(15deg); }
8%, 24% {
-webkit-transform: rotate(-18deg);
transform: rotate(-18deg); }
12%, 28% {
-webkit-transform: rotate(18deg);
transform: rotate(18deg); }
16% {
-webkit-transform: rotate(-22deg);
transform: rotate(-22deg); }
20% {
-webkit-transform: rotate(22deg);
transform: rotate(22deg); }
32% {
-webkit-transform: rotate(-12deg);
transform: rotate(-12deg); }
36% {
-webkit-transform: rotate(12deg);
transform: rotate(12deg); }
40%, 100% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg); } }
@-webkit-keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg); }
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
@keyframes fa-spin {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg); }
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
.fa-rotate-90 {
-webkit-transform: rotate(90deg);
transform: rotate(90deg); }
.fa-rotate-180 {
-webkit-transform: rotate(180deg);
transform: rotate(180deg); }
.fa-rotate-270 {
-webkit-transform: rotate(270deg);
transform: rotate(270deg); }
.fa-flip-horizontal {
-webkit-transform: scale(-1, 1);
transform: scale(-1, 1); }
.fa-flip-vertical {
-webkit-transform: scale(1, -1);
transform: scale(1, -1); }
.fa-flip-both,
.fa-flip-horizontal.fa-flip-vertical {
-webkit-transform: scale(-1, -1);
transform: scale(-1, -1); }
.fa-rotate-by {
-webkit-transform: rotate(var(--fa-rotate-angle, 0));
transform: rotate(var(--fa-rotate-angle, 0)); }
.fa-stack {
display: inline-block;
vertical-align: middle;
height: 2em;
position: relative;
width: 2.5em; }
.fa-stack-1x,
.fa-stack-2x {
bottom: 0;
left: 0;
margin: auto;
position: absolute;
right: 0;
top: 0;
z-index: var(--fa-stack-z-index, auto); }
.svg-inline--fa.fa-stack-1x {
height: 1em;
width: 1.25em; }
.svg-inline--fa.fa-stack-2x {
height: 2em;
width: 2.5em; }
.fa-inverse {
color: var(--fa-inverse, #fff); }
.sr-only,
.fa-sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0; }
.sr-only-focusable:not(:focus),
.fa-sr-only-focusable:not(:focus) {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0; }
.svg-inline--fa .fa-primary {
fill: var(--fa-primary-color, currentColor);
opacity: var(--fa-primary-opacity, 1); }
.svg-inline--fa .fa-secondary {
fill: var(--fa-secondary-color, currentColor);
opacity: var(--fa-secondary-opacity, 0.4); }
.svg-inline--fa.fa-swap-opacity .fa-primary {
opacity: var(--fa-secondary-opacity, 0.4); }
.svg-inline--fa.fa-swap-opacity .fa-secondary {
opacity: var(--fa-primary-opacity, 1); }
.svg-inline--fa mask .fa-primary,
.svg-inline--fa mask .fa-secondary {
fill: black; }
.fad.fa-inverse,
.fa-duotone.fa-inverse {
color: var(--fa-inverse, #fff); }

File diff suppressed because one or more lines are too long

26
static/fontawesome/css/v4-font-face.css vendored Normal file
View File

@ -0,0 +1,26 @@
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
@font-face {
font-family: 'FontAwesome';
font-display: block;
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
@font-face {
font-family: 'FontAwesome';
font-display: block;
src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
@font-face {
font-family: 'FontAwesome';
font-display: block;
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype");
unicode-range: U+F003,U+F006,U+F014,U+F016-F017,U+F01A-F01B,U+F01D,U+F022,U+F03E,U+F044,U+F046,U+F05C-F05D,U+F06E,U+F070,U+F087-F088,U+F08A,U+F094,U+F096-F097,U+F09D,U+F0A0,U+F0A2,U+F0A4-F0A7,U+F0C5,U+F0C7,U+F0E5-F0E6,U+F0EB,U+F0F6-F0F8,U+F10C,U+F114-F115,U+F118-F11A,U+F11C-F11D,U+F133,U+F147,U+F14E,U+F150-F152,U+F185-F186,U+F18E,U+F190-F192,U+F196,U+F1C1-F1C9,U+F1D9,U+F1DB,U+F1E3,U+F1EA,U+F1F7,U+F1F9,U+F20A,U+F247-F248,U+F24A,U+F24D,U+F255-F25B,U+F25D,U+F271-F274,U+F278,U+F27B,U+F28C,U+F28E,U+F29C,U+F2B5,U+F2B7,U+F2BA,U+F2BC,U+F2BE,U+F2C0-F2C1,U+F2C3,U+F2D0,U+F2D2,U+F2D4,U+F2DC; }
@font-face {
font-family: 'FontAwesome';
font-display: block;
src: url("../webfonts/fa-v4compatibility.woff2") format("woff2"), url("../webfonts/fa-v4compatibility.ttf") format("truetype");
unicode-range: U+F041,U+F047,U+F065-F066,U+F07D-F07E,U+F080,U+F08B,U+F08E,U+F090,U+F09A,U+F0AC,U+F0AE,U+F0B2,U+F0D0,U+F0D6,U+F0E4,U+F0EC,U+F10A-F10B,U+F123,U+F13E,U+F148-F149,U+F14C,U+F156,U+F15E,U+F160-F161,U+F163,U+F175-F178,U+F195,U+F1F8,U+F219,U+F27A; }

View File

@ -0,0 +1,6 @@
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype");unicode-range:u+f003,u+f006,u+f014,u+f016-f017,u+f01a-f01b,u+f01d,u+f022,u+f03e,u+f044,u+f046,u+f05c-f05d,u+f06e,u+f070,u+f087-f088,u+f08a,u+f094,u+f096-f097,u+f09d,u+f0a0,u+f0a2,u+f0a4-f0a7,u+f0c5,u+f0c7,u+f0e5-f0e6,u+f0eb,u+f0f6-f0f8,u+f10c,u+f114-f115,u+f118-f11a,u+f11c-f11d,u+f133,u+f147,u+f14e,u+f150-f152,u+f185-f186,u+f18e,u+f190-f192,u+f196,u+f1c1-f1c9,u+f1d9,u+f1db,u+f1e3,u+f1ea,u+f1f7,u+f1f9,u+f20a,u+f247-f248,u+f24a,u+f24d,u+f255-f25b,u+f25d,u+f271-f274,u+f278,u+f27b,u+f28c,u+f28e,u+f29c,u+f2b5,u+f2b7,u+f2ba,u+f2bc,u+f2be,u+f2c0-f2c1,u+f2c3,u+f2d0,u+f2d2,u+f2d4,u+f2dc}@font-face{font-family:"FontAwesome";font-display:block;src:url(../webfonts/fa-v4compatibility.woff2) format("woff2"),url(../webfonts/fa-v4compatibility.ttf) format("truetype");unicode-range:u+f041,u+f047,u+f065-f066,u+f07d-f07e,u+f080,u+f08b,u+f08e,u+f090,u+f09a,u+f0ac,u+f0ae,u+f0b2,u+f0d0,u+f0d6,u+f0e4,u+f0ec,u+f10a-f10b,u+f123,u+f13e,u+f148-f149,u+f14c,u+f156,u+f15e,u+f160-f161,u+f163,u+f175-f178,u+f195,u+f1f8,u+f219,u+f27a}

2194
static/fontawesome/css/v4-shims.css vendored Normal file

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

22
static/fontawesome/css/v5-font-face.css vendored Normal file
View File

@ -0,0 +1,22 @@
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
@font-face {
font-family: 'Font Awesome 5 Brands';
font-display: block;
font-weight: 400;
src: url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.ttf") format("truetype"); }
@font-face {
font-family: 'Font Awesome 5 Free';
font-display: block;
font-weight: 900;
src: url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.ttf") format("truetype"); }
@font-face {
font-family: 'Font Awesome 5 Free';
font-display: block;
font-weight: 400;
src: url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.ttf") format("truetype"); }

View File

@ -0,0 +1,6 @@
/*!
* Font Awesome Free 6.5.2 by @fontawesome - https://fontawesome.com
* License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
* Copyright 2024 Fonticons, Inc.
*/
@font-face{font-family:"Font Awesome 5 Brands";font-display:block;font-weight:400;src:url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:900;src:url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.ttf) format("truetype")}@font-face{font-family:"Font Awesome 5 Free";font-display:block;font-weight:400;src:url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.ttf) format("truetype")}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

18
static/html/nav.html Normal file
View File

@ -0,0 +1,18 @@
<nav class="navbar">
<div class="navbar-left">
<img src="/static/images/printio_white_logo.png" alt="Left Image" class="nav-image">
</div>
<ul>
<li><a href="/"><i class="fas fa-home"></i> Home</a></li>
<li><a href="/internet"><i class="fas fa-globe"></i> Internet</a></li>
<!--<li><a href="#" class="disabled"><i class="fas fa-wifi"></i> Hotspot</a></li>-->
<li>
<a href="#"><i class="fas fa-cog"></i> System</a>
<ul class="submenu">
<li><a href="/mediaconfig"><i class="fas fa-wrench"></i> Config</a></li>
<li><a href="/static/html/power.html"><i class="fas fa-power-off"></i> Power</a></li>
<li><a href="/about"><i class="fas fa-info-circle"></i> About</a></li>
</ul>
</li>
</ul>
</nav>

119
static/html/power.html Normal file
View File

@ -0,0 +1,119 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Printer Media Sizes</title>
<link rel="icon" type="image/x-icon" href="/static/images/favicon.ico">
<link rel="stylesheet" href="/static/css/styles.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
<script src="/static/js/jquery-3.7.1.js"></script>
<style>
.header-img {
margin-top: 30px; /* Adjust the margin as needed */
margin-bottom: 30px;
width: auto;
height: 70px; /* Adjust the height as needed */
}
.center-content {
display: flex;
flex-direction: column;
align-items: center;
}
h1 {
margin-bottom: 5px;
}
label, select, #media-sizes, button {
margin: 5px 0;
text-align: center;
font-size: larger;
font-weight: 200;
}
select {
padding: 3px;
font-size: 1.1em;
width: 250px;
}
#media-sizes ul {
list-style-type: none;
padding: 0;
}
#media-sizes li {
display: flex;
align-items: center;
margin-bottom: 5px;
}
#media-sizes input[type="checkbox"] {
transform: scale(1.5);
margin-right: 12px;
}
#media-sizes span {
font-size: 1.2em;
}
button {
background-color: red;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
font-size: 1.2em;
cursor: pointer;
width: 150px;
margin-bottom: 30px;
}
button:hover {
background-color: darkblue;
}
</style>
</head>
<body>
<div id="navbar"></div>
<script>
fetch('/static/html/nav.html')
.then(response => response.text())
.then(data => {
document.getElementById('navbar').innerHTML = data;
});
</script>
<div class="content-wrapper">
<div class="content center-content">
<h1>Power Options</h1>
<img src="/static/images/switch-icon.png" alt="cards" class="header-img">
<button id="reboot-button">Reboot</button>
<button id="shutdown-button">Shutdown</button>
</div>
</div>
</body>
<script>
$(document).ready(function() {
$('#reboot-button').click(function() {
$.post('/reboot', function(response) {
alert("Reboot initiated");
}).fail(function() {
alert("Reboot failed");
});
});
$('#shutdown-button').click(function() {
$.post('/shutdown', function(response) {
alert("Shutdown initiated");
}).fail(function() {
alert("Shutdown failed");
});
});
});
</script>
</html>

23
static/html/status.html Normal file
View File

@ -0,0 +1,23 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Status</title>
<link rel="stylesheet" href="/static/css/styles.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
</head>
<body>
<div id="navbar"></div>
<div class="content">
<h1>Status Page</h1>
</div>
<script>
fetch('/static/html/nav.html')
.then(response => response.text())
.then(data => {
document.getElementById('navbar').innerHTML = data;
});
</script>
</body>
</html>

Binary file not shown.

After

Width:  |  Height:  |  Size: 224 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
static/images/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 70 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

1
static/js/crypto-js.min.js vendored Normal file

File diff suppressed because one or more lines are too long

29
static/js/data-request.js Normal file
View File

@ -0,0 +1,29 @@
function requestJsonFromServer(route) {
return fetch(route)
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json(); // Assuming the server returns a JSON response
})
.then(jsonData => {
//console.log('Received JSON data:', jsonData);
return jsonData; // Return the JSON data
})
.catch(error => {
console.error('There was a problem with the fetch operation:', error);
return null; // Return null in case of an error
});
}
/* Example usage
requestJsonFromServer('/get_data')
.then(data => {
if (data !== null) {
console.log("Data received:", data);
// You can process the data here as needed
} else {
console.log("Failed to retrieve data from the server.");
}
});
*/

10716
static/js/jquery-3.7.1.js vendored Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,77 @@
$(document).ready(function() {
console.log('Document is ready');
var printersData = [];
// Fetch printer data from the server when the page loads
$.get('/get_printers', function(data) {
console.log('Fetched printer data:', data);
printersData = data;
data.forEach(function(printer) {
$('#printers').append(new Option(printer["display-name"], printer["display-name"]));
});
console.log('Printers dropdown populated');
}).fail(function() {
console.error('Failed to fetch printer data');
});
// Handle printer selection change
$('#printers').change(function() {
var selectedPrinter = $(this).val();
console.log('Printer selected:', selectedPrinter);
if (selectedPrinter) {
var printer = printersData.find(p => p["display-name"] === selectedPrinter);
console.log('Selected printer data:', printer);
if (printer) {
var mediaSizesHtml = '<ul>';
printer['media-sizes'].forEach(function(media) {
mediaSizesHtml += '<li>';
mediaSizesHtml += '<input type="checkbox" ' + (media.enabled ? 'checked' : '') + '>';
mediaSizesHtml += '<span>' + media['media-size-display'] + ' - (' + media['capacity'] + ')' + '</span>';
mediaSizesHtml += '</li>';
});
mediaSizesHtml += '</ul>';
$('#media-sizes').html(mediaSizesHtml);
console.log('Media sizes displayed for selected printer');
}
} else {
$('#media-sizes').html('');
console.log('No printer selected, media sizes cleared');
}
});
// Handle save button click
$('#save').click(function() {
var selectedPrinter = $('#printers').val();
console.log('Save button clicked for printer:', selectedPrinter);
if (selectedPrinter) {
var printer = printersData.find(p => p["display-name"] === selectedPrinter);
if (printer) {
printer['media-sizes'] = [];
$('#media-sizes li').each(function() {
var enabled = $(this).find('input').is(':checked');
var mediaSizeDisplay = $(this).find('span').text();
var mediaSize = mediaSizeDisplay.match(/\(([^)]+)\)/)[1]; // Extract media-size from display text
printer['media-sizes'].push({ "enabled": enabled, "media-size": mediaSize, "media-size-display": mediaSizeDisplay });
});
console.log('Updated printer data to be saved:', printersData);
$.ajax({
url: '/save_printers',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(printersData),
success: function(response) {
console.log('Save response:', response);
alert('Changes saved successfully!');
},
error: function() {
console.error('Failed to save changes');
}
});
}
} else {
console.warn('Please select a printer before saving');
alert('Please select a printer.');
}
});
});

72
static/js/printers.js Normal file
View File

@ -0,0 +1,72 @@
$(document).ready(function() {
var printersData = [];
// Fetch printer data from the server when the page loads
$.get('/get_printers', function(data) {
printersData = data;
data.forEach(function(printer) {
$('#printers').append(new Option(printer["display-name"], printer["display-name"]));
});
}).fail(function() {
console.error('Failed to fetch printer data');
});
// Handle printer selection change
$('#printers').change(function() {
var selectedPrinter = $(this).val();
if (selectedPrinter) {
var printer = printersData.find(p => p["display-name"] === selectedPrinter);
if (printer) {
var mediaSizesHtml = '<ul>';
printer['media-sizes'].forEach(function(media) {
mediaSizesHtml += '<li>';
mediaSizesHtml += '<input type="checkbox" ' + (media.enabled ? 'checked' : '') + '>';
mediaSizesHtml += '<span>' + 'Size = ' + media['media-size-display'] + ' - cap = ' + media['capacity'] + '</span>';
mediaSizesHtml += '</li>';
});
mediaSizesHtml += '</ul>';
$('#media-sizes').html(mediaSizesHtml);
}
} else {
$('#media-sizes').html('');
}
});
// Handle checkbox change event
$(document).on('change', '#media-sizes input[type="checkbox"]', function() {
var selectedPrinter = $('#printers').val();
if (selectedPrinter) {
var printer = printersData.find(p => p["display-name"] === selectedPrinter);
if (printer) {
$('#media-sizes li').each(function(index) {
var enabled = $(this).find('input').is(':checked');
printer['media-sizes'][index].enabled = enabled;
});
}
}
});
// Handle save button click
$('#save').click(function() {
var selectedPrinter = $('#printers').val();
if (selectedPrinter) {
var printer = printersData.find(p => p["display-name"] === selectedPrinter);
if (printer) {
$.ajax({
url: '/save_printers',
type: 'POST',
contentType: 'application/json',
data: JSON.stringify(printersData),
success: function(response) {
alert('Changes saved successfully!');
},
error: function() {
console.error('Failed to save changes');
}
});
}
} else {
alert('Please select a printer.');
}
});
});

View File

@ -0,0 +1,51 @@
#!/bin/bash
set -e
# Function to create and mount overlay
mount_overlay() {
local target_dir=$1
local size=$2
# Create base directory
if [ ! -d "/overlayfs/${target_dir}" ]; then
sudo mkdir -p "/overlayfs/${target_dir}"
sudo chmod 755 "/overlayfs/${target_dir}"
fi
# Mount tmpfs
if ! mountpoint -q "/overlayfs/${target_dir}"; then
sudo mount -t tmpfs -o size=${size} tmpfs "/overlayfs/${target_dir}" -o mode=0755
echo "mounted tmpfs ${target_dir}"
fi
# Create upper and work directories
if [ ! -d "/overlayfs/${target_dir}/upper" ]; then
sudo mkdir -p "/overlayfs/${target_dir}/upper"
sudo chmod 755 "/overlayfs/${target_dir}/upper"
fi
if [ ! -d "/overlayfs/${target_dir}/work" ]; then
sudo mkdir -p "/overlayfs/${target_dir}/work"
sudo chmod 755 "/overlayfs/${target_dir}/work"
fi
# Mount overlay
if ! mountpoint -q "${target_dir}"; then
sudo mount -t overlay overlay -o lowerdir="${target_dir}",upperdir="/overlayfs/${target_dir}/upper",workdir="/overlayfs/${target_dir}/work" "${target_dir}"
echo "mounted overlay ${target_dir}"
fi
}
# /var directory with max RAM size
#mount_overlay /etc 100M
# /var directory with max RAM size
mount_overlay /var 200M
# /tmp directory with max RAM size
mount_overlay /tmp 100M
# /run directory with max RAM size
mount_overlay /run 100M
echo "OverlayFS setup completed successfully."

View File

@ -0,0 +1,53 @@
#!/bin/bash
set -e
# Function to unmount overlay and tmpfs, and remove directories
unmount_overlay() {
local target_dir=$1
local base_dir="/overlayfs/${target_dir}"
# Unmount tmpfs
if mountpoint -q "${base_dir}"; then
echo "Unmounting tmpfs from ${base_dir}"
echo "Command: sudo umount -l ${base_dir}"
sudo umount -l "${base_dir}" || { echo "Failed to unmount tmpfs from ${base_dir}"; exit 1; }
echo "Unmounted tmpfs from ${base_dir}"
else
echo "No tmpfs mounted on ${base_dir}"
fi
# Unmount overlay
if mountpoint -q "/${target_dir}"; then
echo "Unmounting overlay from ${target_dir}"
echo "Command: sudo umount -l /${target_dir}"
sudo umount -l /"${target_dir}" || { echo "Failed to unmount overlay from ${target_dir}"; exit 1; }
echo "Unmounted overlay from ${target_dir}"
else
echo "No overlay mounted on ${target_dir}"
fi
# Remove directories
if [ -d "${base_dir}" ]; then
echo "Clearing work and upper directories in ${base_dir}"
sudo rm -rf "${base_dir}/work/*"
sudo rm -rf "${base_dir}/upper/*"
echo "Removed work and upper directories in ${base_dir}"
else
echo "Directory ${base_dir} does not exist"
fi
}
# /var directory
unmount_overlay etc
# /var directory
unmount_overlay var
# /tmp directory
unmount_overlay tmp
# /run directory
unmount_overlay run
echo "OverlayFS cleanup completed successfully."

36
systemd/commands.txt Normal file
View File

@ -0,0 +1,36 @@
# Start app service
sudo systemctl start printio
sudo systemctl stop printio
sudo systemctl enable printio
sudo ln -s /home/orangepi/printio/systemd/printio.service /etc/systemd/system/printio.service
#Start OverlayFS Mount service
sudo systemctl enable overlayfs_mount
sudo ln -s /home/orangepi/printio/systemd/overlayfs_mount.service /etc/systemd/system/overlayfs_mount.service
# Testing command
PYTHONPATH=/home/orangepi/printio/src /home/orangepi/printio/.venv/bin/gunicorn --workers 1 --bind unix:/home/orangepi/printio/src/flaskapp.sock -m 007 wsgi:app
sudo ln -s /home/orangepi/printio/systemd/printio.service /etc/systemd/system/printio.service
sudo ln -s /home/orangepi/printio/systemd/overlayfs_mount.service /etc/systemd/system/overlayfs_mount.service
sudo systemctl enable printio
sudo systemctl enable overlayfs_mount
# Stop Overlay to make system changes
sudo bash /home/orangepi/printio/systemd/bash/overlayfs_unmount.sh
#socket permissions
#sudo chmod 775 /home/orangepi/printio
sudo chown www-data:www-data /home/orangepi/printio/src/flaskapp.sock
sudo chmod 660 /home/orangepi/printio/src/flaskapp.sock
sudo chmod +x /home/orangepi/
sudo chmod +x /home/orangepi/printio/
sudo chmod +x /home/orangepi/printio/src/

View File

@ -0,0 +1,17 @@
[Unit]
Description=Mount OverlayFS at Boot
DefaultDependencies=no
Before=sysinit.target local-fs.target
Wants=local-fs-pre.target
After=local-fs-pre.target
[Service]
Type=oneshot
ExecStart=/home/orangepi/printio_studio/systemd/bash/overlayfs_mount.sh
RemainAfterExit=true
user=root
Group=root
[Install]
WantedBy=sysinit.target

15
systemd/printio.service Normal file
View File

@ -0,0 +1,15 @@
[Unit]
Description=Gunicorn instance to serve Printio
After=network.target
[Service]
User=root
Group=www-data
WorkingDirectory=/home/orangepi/printio/src/
ExecStart=/home/orangepi/printio/.venv/bin/gunicorn --workers 1 --bind unix:/home/orangepi/printio/src/flaskapp.sock --umask 0007 wsgi:app
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
Environment="PATH=/home/orangepi/printio/.venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
[Install]
WantedBy=multi-user.target

309
templates/about.html Normal file
View File

@ -0,0 +1,309 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>About Printio</title>
<link rel="icon" type="image/x-icon" href="/static/images/favicon.ico">
<link rel="stylesheet" href="/static/css/styles.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
<style>
h1 {
margin-bottom: 20px;
}
label, select, #media-sizes, button {
margin: 5px 0;
text-align: center;
}
select {
padding: 3px;
font-size: 1.1em;
}
#media-sizes ul {
list-style-type: none;
padding: 0;
}
#media-sizes li {
display: flex;
align-items: center;
margin-bottom: 5px;
}
#media-sizes input[type="checkbox"] {
transform: scale(1.5);
margin-right: 12px;
}
#media-sizes span {
font-size: 1.2em;
}
button {
background-color: blue;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
font-size: 1.2em;
cursor: pointer;
}
button:hover {
background-color: darkblue;
}
p {
display: block;
margin-top: 1em;
margin-bottom: 1em;
margin-left: 0;
margin-right: 0;
}
.license-section {
margin-top: 30px;
text-align: center;
}
.license-status {
font-size: 1.1em;
margin-bottom: 15px;
}
.license-input {
margin-top: 10px;
text-align: left;
}
.license-input input {
padding: 10px;
width: 300px;
font-size: 1.1em;
margin-right: 10px;
}
.license-input button {
background-color: #4CAF50;
padding: 10px 20px;
font-size: 1.1em;
cursor: pointer;
border-radius: 5px;
border: none;
}
.license-input button:hover {
background-color: #45a049;
}
/* New Styles for Layout */
.content-wrapper {
display: flex;
}
.left-column {
width: 280px;
padding-right: 20px;
box-sizing: border-box;
}
.right-column {
width: 70%;
}
.info-box {
padding: 15px;
margin-bottom: 20px;
border: 1px solid #ccc;
border-radius: 5px;
}
.license-box {
padding: 15px;
border: 1px solid #ccc;
border-radius: 5px;
}
#p {
margin-left: 10px;
}
</style>
<script src="/static/js/crypto-js.min.js"></script>
</head>
<body>
<div id="navbar"></div>
<script>
fetch('/static/html/nav.html')
.then(response => response.text())
.then(data => {
document.getElementById('navbar').innerHTML = data;
});
</script>
<div class="content-wrapper">
<div class="left-column">
<div class="info-box">
<h3>System Info</h3>
<p>Version: {{info.software_version}}
<p>CPU %: {{info.cpu}}</p>
<p>CPU T: {{info.cpu_t}}</p>
<p>Disk Size: {{info.disk_size}}</p>
<p>Disk Used: {{info.disk_used}}</p>
<p>RAM Size: {{info.ram_size}}</p>
<p>RAM Used: {{info.ram_used}}</p>
<p>Up Time: {{info.uptime}}</p>
</div>
<div class="license-box">
<h3>License Info </h3>
<p>License: {{info.license}}</p>
<!--p>Image Magic: {{info.image_magic}}</p-->
<!--p>Hashtag: {{info.hash}}</p-->
<!--p>Drop Folder: {{info.drop_folder}}</p-->
</div>
</div>
<div class="right-column">
<h1>About Printio</h1>
<p>
Printio is a professional printing solution designed for seamless
printing from iPads. It is particularly popular in the photobooth
industry, supporting a wide range of sublimation printers. Printio
is compatible with well-known brands such as DNP, Sinfonia, Hiti,
and Mitsubishi, as well as many other printers, including Zebra label
printers, and most HP and Epson models. This versatility makes Printio
an ideal choice for diverse printing needs.
</p>
<p>
Warning: Unauthorized reproduction or distribution of this product
is strictly prohibited and may result in severe civil and criminal
penalties.
</p>
<a href="https://www.ataphotobooths.com/knowledge-base/category/printio-setup/" target="_blank">Printio Help: Click me!</a>
<div></div>
<img src="/static/images/printio_help_qr.jpg" alt="Printio" style="width: 120px; margin-top: 20px;">
<div class="license-section" {{info.hidden}}>
<div class="license-input">
<label>__________________________________________________________</label>
</div>
<div class="license-input">
<label for="activation-serial">ID Code:</label>
<input type="text" id="idcode" value={{info.idcode}} readonly>
<button onclick="copyToClipboard()">Copy</button>
</div>
<div class="license-input">
<label for="activation-serial">SerialNo</label>
<input type="password" id="license-password" placeholder="Enter Activation Key">
<button onclick="activateLicense()">Activate</button>
</div>
</div>
</div>
</div>
<script>
function encryptPassword(password) {
// Simple encryption using CryptoJS (you can replace with your method)
return password;
}
function activateLicense() {
const password = document.getElementById('license-password').value;
const encryptedPassword = encryptPassword(password);
fetch('/activate', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ pass: encryptedPassword })
})
.then(response => response.json())
.then(data => {
console.log("Activation result:", data);
if (data.reply == true) {
alert("Activation Successful!!!");
window.location.href = "/about"; // Redirect to /about page
} else {
alert("Activation Failed.... Try Again");
}
})
.catch(error => {
console.error("Error during activation attempt:", error);
alert("Error during activation attempt.");
});
}
function copyToClipboard() {
const idCode = document.getElementById('idcode');
// Check if the element exists
if (!idCode) {
console.error('Element with ID "idcode" not found');
alert('Error: Could not find the text to copy');
return;
}
// Get the value or text content (depending on element type)
const textToCopy = idCode.value || idCode.textContent || '';
console.log('Text to copy:', textToCopy);
// Ensure there's something to copy
if (!textToCopy) {
console.warn('No text to copy');
alert('Nothing to copy');
return;
}
// First, try the Clipboard API if available
if (navigator.clipboard && navigator.clipboard.writeText) {
console.log('Attempting to use Clipboard API');
navigator.clipboard.writeText(textToCopy)
.then(() => {
console.log('Clipboard API success');
alert('ID code copied to clipboard');
})
.catch(err => {
console.error('Clipboard API failed:', err);
attemptFallbackCopy(textToCopy);
});
} else {
console.log('Clipboard API unavailable, using fallback');
attemptFallbackCopy(textToCopy);
}
}
function attemptFallbackCopy(textToCopy) {
try {
// Create a temporary textarea for copying
const tempTextarea = document.createElement('textarea');
tempTextarea.value = textToCopy;
tempTextarea.style.position = 'fixed'; // Prevent scrolling issues
tempTextarea.style.opacity = '0'; // Make it invisible
document.body.appendChild(tempTextarea);
tempTextarea.focus();
tempTextarea.select();
// Attempt to copy
const successful = document.execCommand('copy');
document.body.removeChild(tempTextarea);
if (successful) {
console.log('Fallback copy successful');
//alert('ID code copied to clipboard (using fallback)');
} else {
console.warn('Fallback copy failed: execCommand returned false');
alert('Failed to copy to clipboard: Copy command unsuccessful');
}
} catch (err) {
console.error('Fallback copy error:', err);
alert('Failed to copy to clipboard: ' + err.message);
}
}
</script>
</body>
</html>

157
templates/index.html Normal file
View File

@ -0,0 +1,157 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Printio</title>
<link rel="icon" type="image/x-icon" href="/static/images/favicon.ico">
<link rel="stylesheet" href="/static/css/styles.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
<style>
.header-img {
margin-top: 30px;
margin-bottom: 30px;
width: auto;
height: 100px;
}
h2 {
margin-top: 0;
font-size: 24px;
color: #565656;
}
table {
border-collapse: collapse;
width: 100%;
margin-top: 20px;
box-sizing: border-box;
}
th, td {
border: 1px solid #ccc;
padding: 10px;
text-align: left;
box-sizing: border-box;
}
th {
background-color: #f8f8f8;
}
.button-red {
padding: 5px 10px;
background-color: #f44336;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
.button-test {
padding: 5px 10px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
}
.placeholder-img {
position: absolute;
top: 20px;
right: 20px;
}
.placeholder-img img {
top: 20px;
width: 60px;
height: 60px;
}
/* Styles for the message log */
#messageLog {
display: none;
margin-top: 20px;
width: 100%;
height: 350px;
box-sizing: border-box;
resize: none;
overflow: auto;
white-space: nowrap;
}
.toggle-button {
margin-top: 20px;
background-color: #007BFF;
color: white;
border: none;
padding: 3px 20px;
cursor: pointer;
border-radius: 5px;
}
</style>
</head>
<body>
<div id="navbar"></div>
<script>
fetch('/static/html/nav.html')
.then(response => response.text())
.then(data => {
document.getElementById('navbar').innerHTML = data;
});
</script>
<div class="content-wrapper">
<div class="content">
<img src="/static/images/printio_logo.png" alt="Printio" class="header-img">
<h2>Active Printers</h2>
<table border="1">
<tr>
<th>Printer Name</th>
<th>Status</th>
<th>Prints Left</th>
<th>Actions</th>
</tr>
{% for printer in printers %}
<tr>
<td>{{ printer.name }}</td>
<td>{{ printer.state }}</td>
<td>{{ printer.prints_left_message }}</td>
<td>
<form action="{{ url_for('cancel_all_jobs', printer_name=printer.name) }}" method="post" style="display:inline;">
<button type="submit" class="button-red">Kill Jobs</button>
</form>
<form action="{{ url_for('test_print', printer_name=printer.name) }}" method="post" style="display:inline;">
<button type="submit" class="button-test">Test Print</button>
</form>
</td>
</tr>
{% endfor %}
</table>
<!-- Button to toggle the message log -->
<button class="toggle-button" onclick="toggleMessageLog()">Job History</button>
<!-- Hidden textarea for the message log -->
<textarea id="messageLog" placeholder="Job Status Log..." readonly></textarea>
</div>
</div>
<script>
// Toggles the visibility of the message log textarea
function toggleMessageLog() {
var messageLog = document.getElementById('messageLog');
if (messageLog.style.display === '' || messageLog.style.display === 'none') {
messageLog.style.display = 'block';
loadPrinterJobs(); // Load job messages when showing the textarea
} else {
messageLog.style.display = 'none';
}
}
// Load the printer job information and show in the textarea
function loadPrinterJobs() {
var messageLog = document.getElementById('messageLog');
var jobs = {{ job_history | tojson | safe }};
var logText = "";
jobs.forEach(function(job, index) {
logText += "Job: " + job.job_id + ", Time: " + job.time + ", Size: " + job.job_size + ", Printer: " + job.printer_name + ", State: " + job.job_state + ', Reason: ' + job.job_reason + "\r\n";
});
// Set the value of the textarea to display the job information
messageLog.value = logText;
}
</script>
</body>
</html>

350
templates/internet.html Normal file
View File

@ -0,0 +1,350 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>WiFi Configuration</title>
<link rel="icon" type="image/x-icon" href="/static/images/favicon.ico">
<link rel="stylesheet" href="/static/css/styles.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
<style>
h1 {
margin-top: 30px;
font-size: 36px;
color: #333;
}
.button-container {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 20px;
}
.btn {
padding: 10px 20px;
font-size: 1.2em;
cursor: pointer;
background-color: blue;
color: white;
width: 150px;
border-radius: 5px;
border: none;
text-decoration: none;
}
.btn:hover {
background-color: #0056b3;
}
.small-btn {
width: 100px;
padding: 5px 10px;
font-size: 0.8em;
background-color: darkslateblue;
}
.small-btn-container {
margin-left: auto;
}
.scan-container {
margin-top: 20px;
}
.scan-container .btn {
background-color: #28a745;
}
.scan-container .btn:hover {
background-color: #218838;
}
.connect-container {
margin-top: 20px;
}
.connect-container .btn {
padding: 5px 15px;
border-radius: 5px;
background-color: #ffc107;
margin-bottom: 30px;
}
.connect-container .btn:hover {
background-color: #e0a800;
}
.network-list {
margin-top: 20px;
width: 100%;
max-height: 200px;
overflow-y: auto;
border: 1px solid #ccc;
background-color: white;
box-sizing: border-box;
}
.network-list table {
width: 100%;
border-collapse: collapse;
table-layout: auto;
box-sizing: border-box;
}
.network-list th, .network-list td {
padding: 8px;
text-align: left;
border-bottom: 1px solid #ddd;
white-space: nowrap;
box-sizing: border-box;
}
.network-list th {
background-color: #f2f2f2;
}
.network-list tr.selected {
background-color: #d1e7dd;
}
.status {
margin-top: 20px;
font-size: 18px;
color: #555;
}
.home-btn {
position: absolute;
top: 20px;
left: 20px;
padding: 10px 20px;
background-color: #6c757d;
color: white;
text-decoration: none;
border-radius: 5px;
}
.home-btn:hover {
background-color: #5a6268;
}
.placeholder-img {
position: absolute;
top: 20px;
right: 20px;
}
.placeholder-img img {
top: 20px;
width: 70px;
height: 70px;
}
.header-img {
margin-top: 20px; /* Adjust the margin as needed */
margin-bottom: 30px;
width: auto;
height: 80px; /* Adjust the height as needed */
position: absolute;
left: 30px;
top: 60px;
}
button:disabled {
opacity: 0.5; /* Makes the button look visually disabled */
cursor: not-allowed; /* Changes the cursor to indicate it's disabled */
}
details {
width: 100%;
margin-bottom: 20px; /* Adds space between details sections */
}
.details-container {
width: 80%; /* Set container width to keep content centered */
margin: 0 auto;
}
summary {
font-size: 1.3em;
font-weight: bold;
cursor: pointer;
display: inline-block;
width: 250px; /* Set a fixed width for alignment */
text-align: left; /* Ensures left alignment of the text */
white-space: nowrap; /* Prevents wrapping */
}
summary::before {
content: "▼ "; /* Bullet symbol */
color: black; /* Bullet color */
margin-right: 8px; /* Space between bullet and text */
font-size: 1.3em; /* Matches summary font size */
}
.details-content {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
</style>
</head>
<body>
<div id="navbar"></div>
<script>
fetch('/static/html/nav.html')
.then(response => response.text())
.then(data => {
document.getElementById('navbar').innerHTML = data;
});
</script>
<div class="content-wrapper">
<div class="content">
<h1>WiFi Internet Access</h1>
<img src="/static/images/internet_icon.png" alt="internet" class="header-img">
<label id="label-status">Status:</label>
<div class="button-container">
<button class="btn" id="scanButton" onclick="scanWifi()">Scan</button>
<div class="small-btn-container">
<button class="btn small-btn" id="forgetButton" onclick="checkForgetNetworks()">Forget all</button>
<button class="btn small-btn" id="testButton" onclick="checkInternetAccess()">Test Internet</button>
</div>
</div>
<div class="scan-container">
<div id="scanStatus" class="status"></div>
</div>
<div class="network-list">
<table id="networksTable">
<thead>
<tr>
<th>SSID</th>
<th>Freq</th>
<th>Signal</th>
<th>Bssid</th>
</tr>
</thead>
<tbody>
<!-- List of networks will be appended here -->
</tbody>
</table>
</div>
<div class="connect-container">
<button class="btn" id="connectToNetworkButton"onclick="connectToNetwork()">Connect</button>
</div>
<details>
<summary>Connection Status</summary>
<div class="status" id="connectionStatus"></div>
</details>
<details>
<summary>Notice</summary>
<label id="label-wifi">*WPA3 is not currently supported. If your hotsport/Access point is setup for WPA3, please change it to WPA2 before trying to connect to it.</label>
</details>
</div>
</div>
</div>
<script>
window.onload = function() { OnPageLoad(); };
function scanWifi() {
console.log("Starting WiFi scan...");
document.getElementById('connectionStatus').innerText = ""
document.getElementById('scanStatus').innerText = "Scanning for networks...";
fetch('/wifi_scan')
.then(response => response.json())
.then(data => {
console.log("Scan complete. Data received:", data);
document.getElementById('scanStatus').innerText = "Scan complete.";
let tableBody = document.getElementById('networksTable').getElementsByTagName('tbody')[0];
tableBody.innerHTML = '';
data.networks.forEach(network => {
let row = tableBody.insertRow();
let cell1 = row.insertCell(0);
let cell2 = row.insertCell(1);
let cell3 = row.insertCell(2);
let cell4 = row.insertCell(3);
cell1.textContent = network.ssid || '';
cell2.textContent = network.Freq || '';
cell3.textContent = network.signal || '';
cell4.textContent = network.bssid || '';
row.addEventListener('click', function() {
const rows = document.querySelectorAll('#networksTable tbody tr');
rows.forEach(r => r.classList.remove('selected'));
row.classList.add('selected');
});
});
})
.catch(error => {
console.error("Error during scan:", error);
document.getElementById('scanStatus').innerText = "Error during scan.";
});
}
function connectToNetwork() {
console.log("Attempting to connect to network...");
const table = document.getElementById('networksTable');
const selectedRow = table.querySelector('tbody tr.selected');
if (!selectedRow) {
document.getElementById('connectionStatus').innerText = "Please select a network to connect to.";
return;
}
const ssid = selectedRow.cells[0].textContent;
const bssid = selectedRow.cells[3].textContent;
const password = prompt("Enter the WiFi password for " + ssid + ":");
if (!password) {
document.getElementById('connectionStatus').innerText = "Connection cancelled.";
return;
}
document.getElementById('connectionStatus').innerText = "Please wait...";
document.getElementById('connectToNetworkButton').disabled = true;
document.getElementById('scanButton').disabled = true;
document.getElementById('testButton').disabled = true;
document.getElementById('forgetButton').disabled = true;
fetch('/wifi_connect', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ ssid: ssid, bssid: bssid, password: password })
})
.then(response => response.json())
.then(data => {
console.log("Connection attempt result:", data);
document.getElementById('connectionStatus').innerText = data.message;
checkWifiStatus();
})
.catch(error => {
console.error("Error during connection attempt:", error);
document.getElementById('connectionStatus').innerText = "Error during connection attempt.";
})
.finally(() => {
// Re-enable buttons after the connection attempt
document.getElementById('connectToNetworkButton').disabled = false;
document.getElementById('scanButton').disabled = false;
document.getElementById('testButton').disabled = false;
document.getElementById('forgetButton').disabled = false;
});
}
function checkInternetAccess() {
fetch('/wifi_test')
.then(response => response.json())
.then(data => {
const statusMessage = data.success ? "Internet Access Ok" : "No Internet Access";
alert(statusMessage); // Display message in a popup
})
.catch(error => {
console.error("Error checking internet access:", error);
alert("Error checking internet access."); // Display error in a popup
});
}
function checkForgetNetworks() {
fetch('/wifi_forget')
.then(response => response.json())
.then(data => {
const statusMessage = data.success ? "All networks forgotten" : "Nothing happened";
alert(statusMessage); // Display message in a popup
})
.catch(error => {
console.error("Error forgetting networks:", error);
alert("Error forgetting networks."); // Display error in a popup
});
}
function checkWifiStatus() {
fetch('/wifi_status')
.then(response => response.json())
.then(data => {
console.log("Data received:", data);
document.getElementById('label-status').innerText = "Status: " + data.msg;
})
.catch(error => {
console.error("Error getting wifi status:", error);
document.getElementById('label-status').innerText = "Status: ...";
});
}
function OnPageLoad(){
checkWifiStatus();
}
</script>
</body>
</html>

437
templates/mediaconfig.html Normal file
View File

@ -0,0 +1,437 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Printer Media Sizes</title>
<link rel="icon" type="image/x-icon" href="/static/images/favicon.ico">
<link rel="stylesheet" href="/static/css/styles.css">
<link rel="stylesheet" href="/static/fontawesome/css/all.min.css">
<script src="/static/js/jquery-3.7.1.js"></script>
<script src="/static/js/printers.js"></script>
<style>
.header-img {
margin-top: 30px; /* Adjust the margin as needed */
margin-bottom: 30px;
width: auto;
height: 100px; /* Adjust the height as needed */
}
h1 {
margin-bottom: 40px;
font-size: 2.0em;
}
.center-content {
display: flex;
flex-direction: column;
align-items: center;
}
label, select, #media-sizes, button {
margin: 5px 0;
text-align: center;
font-size: larger;
font-weight: 200;
}
select {
padding: 3px;
font-size: 1.1em;
width: 200px;
text-align: left;
}
#media-sizes ul {
list-style-type: none;
padding: 0;
}
#media-sizes li {
display: flex;
align-items: center;
margin-bottom: 5px;
}
#media-sizes input[type="checkbox"] {
transform: scale(1.5);
margin-right: 12px;
}
#media-sizes span {
font-size: 1.2em;
}
button, input {
background-color: blue;
color: white;
padding: 5px 10px;
border: none;
border-radius: 5px;
font-size: 1.2em;
cursor: pointer;
}
button:hover {
background-color: darkblue;
}
details {
width: 100%;
margin-bottom: 20px; /* Adds space between details sections */
}
.details-container {
width: 80%; /* Set container width to keep content centered */
margin: 0 auto;
}
summary {
font-size: 1.4em;
font-weight: bold;
cursor: pointer;
display: inline-block;
width: 250px; /* Set a fixed width for alignment */
text-align: left; /* Ensures left alignment of the text */
white-space: nowrap; /* Prevents wrapping */
}
summary::before {
content: "▼ "; /* Bullet symbol */
color: black; /* Bullet color */
margin-right: 8px; /* Space between bullet and text */
font-size: 1.4em; /* Matches summary font size */
}
.details-content {
display: flex;
flex-direction: column;
align-items: center;
text-align: center;
}
table th {
text-align: right; /* Right-aligns the labels in table header cells */
padding-right: 10px; /* Adds some space between label and input */
}
table td {
text-align: left; /* Left-aligns the select elements */
}
table td select {
width: auto;
padding: 5px;
font-size: 1.1em;
}
</style>
</head>
<body>
<div id="navbar"></div>
<script>
fetch('/static/html/nav.html')
.then(response => response.text())
.then(data => {
document.getElementById('navbar').innerHTML = data;
});
</script>
<div class="content-wrapper">
<div class="content center-content">
<h1> Media and Color Settings</h1>
<div class="details-container">
<details>
<summary>Printer Media Sizes</summary>
<div class="details-content"> <!-- Container to center contents -->
<img src="/static/images/color_cards.png" alt="cards" class="header-img">
<label for="printers">Select Printer:</label>
<select id="printers">
<option value="">--Select a printer--</option>
</select>
<label for="printers">Available Sizes:</label>
<div id="media-sizes"></div>
</div>
<button id="save">Save Changes</button>
</details>
<form id="colorOptionsForm" action="/save_color_options" onsubmit="submitForm(event)">
<details>
<summary>Color Settings (General)</summary>
<TABLE WIDTH="100%">
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="ColorModel">Color Model</A>:</TH>
<input type="checkbox" name="color-enabled" id="color-enabled" style="margin-right: 10px; transform: scale(1.5);">
<label for="color-enabled">Enabled</label>
<TD><SELECT NAME="ColorModel" ID="select-ColorModel" ONCHANGE="update_paramtable('ColorModel')">
<OPTION VALUE="Gray">Grayscale<OPTION VALUE="Black">Inverted Grayscale<OPTION VALUE="RGB">RGB Color<OPTION VALUE="CMY">CMY Color<OPTION VALUE="CMYK">CMYK<OPTION VALUE="KCMY">KCMY
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpColorPrecision">Color Precision</A>:</TH>
<TD><SELECT NAME="StpColorPrecision" ID="select-StpColorPrecision" ONCHANGE="update_paramtable('StpColorPrecision')">
<OPTION VALUE="Normal">Normal<OPTION VALUE="Best">Best
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpiShrinkOutput">Shrink Page If Necessary to Fit Borders</A>:</TH>
<TD><SELECT NAME="StpiShrinkOutput" ID="select-StpiShrinkOutput" ONCHANGE="update_paramtable('StpiShrinkOutput')">
<OPTION VALUE="Shrink">Shrink (print the whole page)<OPTION VALUE="Crop">Crop (preserve dimensions)<OPTION VALUE="Expand">Expand (use maximum page area)
</SELECT>
</TR>
</TABLE>
<button type="submit">Save Changes</button>
</details>
<details>
<summary>Color Settings (Common)</summary>
<TABLE WIDTH="100%">
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpColorCorrection">Color Correction</A>:</TH>
<TD><SELECT NAME="StpColorCorrection" ID="select-StpColorCorrection" ONCHANGE="update_paramtable('StpColorCorrection')">
<OPTION VALUE="None">Default<OPTION VALUE="Accurate">High Accuracy<OPTION VALUE="Bright">Bright Colors<OPTION VALUE="Hue">Correct Hue Only<OPTION VALUE="Uncorrected">Uncorrected<OPTION VALUE="Desaturated">Desaturated<OPTION VALUE="Threshold">Threshold<OPTION VALUE="Density">Density<OPTION VALUE="Raw">Raw<OPTION VALUE="Predithered">Pre-Dithered
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpBrightness">Brightness</A>:</TH>
<TD><SELECT NAME="StpBrightness" ID="select-StpBrightness" ONCHANGE="update_paramtable('StpBrightness')">
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="None">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000
</SELECT>
</TD>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineBrightness">Brightness Fine Adjustment</A>:</TH>
<TD><SELECT NAME="StpFineBrightness" ID="select-StpFineBrightness" ONCHANGE="update_paramtable('StpFineBrightness')">
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpContrast">Contrast</A>:</TH>
<TD><SELECT NAME="StpContrast" ID="select-StpContrast" ONCHANGE="update_paramtable('StpContrast')">
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="None">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000
</SELECT>
</TD>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineContrast">Contrast Fine Adjustment</A>:</TH>
<TD><SELECT NAME="StpFineContrast" ID="select-StpFineContrast" ONCHANGE="update_paramtable('StpFineContrast')">
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpSaturation">Saturation</A>:</TH>
<TD><SELECT NAME="StpSaturation" ID="select-StpSaturation" ONCHANGE="update_paramtable('StpSaturation')">
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="None">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000<OPTION VALUE="4100">4.100<OPTION VALUE="4200">4.200<OPTION VALUE="4300">4.300<OPTION VALUE="4400">4.400<OPTION VALUE="4500">4.500<OPTION VALUE="4600">4.600<OPTION VALUE="4700">4.700<OPTION VALUE="4800">4.800<OPTION VALUE="4900">4.900<OPTION VALUE="5000">5.000<OPTION VALUE="5100">5.100<OPTION VALUE="5200">5.200<OPTION VALUE="5300">5.300<OPTION VALUE="5400">5.400<OPTION VALUE="5500">5.500<OPTION VALUE="5600">5.600<OPTION VALUE="5700">5.700<OPTION VALUE="5800">5.800<OPTION VALUE="5900">5.900<OPTION VALUE="6000">6.000<OPTION VALUE="6100">6.100<OPTION VALUE="6200">6.200<OPTION VALUE="6300">6.300<OPTION VALUE="6400">6.400<OPTION VALUE="6500">6.500<OPTION VALUE="6600">6.600<OPTION VALUE="6700">6.700<OPTION VALUE="6800">6.800<OPTION VALUE="6900">6.900<OPTION VALUE="7000">7.000<OPTION VALUE="7100">7.100<OPTION VALUE="7200">7.200<OPTION VALUE="7300">7.300<OPTION VALUE="7400">7.400<OPTION VALUE="7500">7.500<OPTION VALUE="7600">7.600<OPTION VALUE="7700">7.700<OPTION VALUE="7800">7.800<OPTION VALUE="7900">7.900<OPTION VALUE="8000">8.000<OPTION VALUE="8100">8.100<OPTION VALUE="8200">8.200<OPTION VALUE="8300">8.300<OPTION VALUE="8400">8.400<OPTION VALUE="8500">8.500<OPTION VALUE="8600">8.600<OPTION VALUE="8700">8.700<OPTION VALUE="8800">8.800<OPTION VALUE="8900">8.900<OPTION VALUE="9000">9.000
</SELECT>
</TD>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineSaturation">Saturation Fine Adjustment</A>:</TH>
<TD><SELECT NAME="StpFineSaturation" ID="select-StpFineSaturation" ONCHANGE="update_paramtable('StpFineSaturation')">
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpImageType">Image Type</A>:</TH>
<TD><SELECT NAME="StpImageType" ID="select-StpImageType" ONCHANGE="update_paramtable('StpImageType')">
<OPTION VALUE="None">Manual Control<OPTION VALUE="Text">Text<OPTION VALUE="Graphics">Graphics<OPTION VALUE="TextGraphics">Mixed Text and Graphics<OPTION VALUE="Photo">Photograph<OPTION VALUE="LineArt">Line Art
</SELECT>
</TR>
</TABLE>
<button type="submit">Save Changes</button>
</details>
<details>
<summary>Color Settings (Extra)</summary>
<TABLE WIDTH="100%">
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpGamma">Composite Gamma</A>:</TH>
<TD><SELECT NAME="StpGamma" ID="select-StpGamma" ONCHANGE="update_paramtable('StpGamma')">
<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
</SELECT>
</TD>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineGamma">Composite Gamma Fine Adjustment</A>:</TH>
<TD><SELECT NAME="StpFineGamma" ID="select-StpFineGamma" ONCHANGE="update_paramtable('StpFineGamma')">
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpCyanGamma">Cyan</A>:</TH>
<TD><SELECT NAME="StpCyanGamma" ID="select-StpCyanGamma" ONCHANGE="update_paramtable('StpCyanGamma')">
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
</SELECT>
</TD>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineCyanGamma">Cyan Fine Adjustment</A>:</TH>
<TD><SELECT NAME="StpFineCyanGamma" ID="select-StpFineCyanGamma" ONCHANGE="update_paramtable('StpFineCyanGamma')">
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpMagentaGamma">Magenta</A>:</TH>
<TD><SELECT NAME="StpMagentaGamma" ID="select-StpMagentaGamma" ONCHANGE="update_paramtable('StpMagentaGamma')">
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
</SELECT>
</TD>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineMagentaGamma">Magenta Fine Adjustment</A>:</TH>
<TD><SELECT NAME="StpFineMagentaGamma" ID="select-StpFineMagentaGamma" ONCHANGE="update_paramtable('StpFineMagentaGamma')">
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpYellowGamma">Yellow</A>:</TH>
<TD><SELECT NAME="StpYellowGamma" ID="select-StpYellowGamma" ONCHANGE="update_paramtable('StpYellowGamma')">
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="1100">1.100<OPTION VALUE="1200">1.200<OPTION VALUE="1300">1.300<OPTION VALUE="1400">1.400<OPTION VALUE="1500">1.500<OPTION VALUE="1600">1.600<OPTION VALUE="1700">1.700<OPTION VALUE="1800">1.800<OPTION VALUE="1900">1.900<OPTION VALUE="2000">2.000<OPTION VALUE="2100">2.100<OPTION VALUE="2200">2.200<OPTION VALUE="2300">2.300<OPTION VALUE="2400">2.400<OPTION VALUE="2500">2.500<OPTION VALUE="2600">2.600<OPTION VALUE="2700">2.700<OPTION VALUE="2800">2.800<OPTION VALUE="2900">2.900<OPTION VALUE="3000">3.000<OPTION VALUE="3100">3.100<OPTION VALUE="3200">3.200<OPTION VALUE="3300">3.300<OPTION VALUE="3400">3.400<OPTION VALUE="3500">3.500<OPTION VALUE="3600">3.600<OPTION VALUE="3700">3.700<OPTION VALUE="3800">3.800<OPTION VALUE="3900">3.900<OPTION VALUE="4000">4.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
</SELECT>
</TD>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineYellowGamma">Yellow Fine Adjustment</A>:</TH>
<TD><SELECT NAME="StpFineYellowGamma" ID="select-StpFineYellowGamma" ONCHANGE="update_paramtable('StpFineYellowGamma')">
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpCyanBalance">Cyan Balance</A>:</TH>
<TD><SELECT NAME="StpCyanBalance" ID="select-StpCyanBalance" ONCHANGE="update_paramtable('StpCyanBalance')">
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
</SELECT>
</TD>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineCyanBalance">Cyan Balance Fine Adjustment</A>:</TH>
<TD><SELECT NAME="StpFineCyanBalance" ID="select-StpFineCyanBalance" ONCHANGE="update_paramtable('StpFineCyanBalance')">
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpMagentaBalance">Magenta Balance</A>:</TH>
<TD><SELECT NAME="StpMagentaBalance" ID="select-StpMagentaBalance" ONCHANGE="update_paramtable('StpMagentaBalance')">
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
</SELECT>
</TD>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineMagentaBalance">Magenta Balance Fine Adjustment</A>:</TH>
<TD><SELECT NAME="StpFineMagentaBalance" ID="select-StpFineMagentaBalance" ONCHANGE="update_paramtable('StpFineMagentaBalance')">
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
</SELECT>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpYellowBalance">Yellow Balance</A>:</TH>
<TD><SELECT NAME="StpYellowBalance" ID="select-StpYellowBalance" ONCHANGE="update_paramtable('StpYellowBalance')">
<OPTION VALUE="0">0.000<OPTION VALUE="100">0.100<OPTION VALUE="200">0.200<OPTION VALUE="300">0.300<OPTION VALUE="400">0.400<OPTION VALUE="500">0.500<OPTION VALUE="600">0.600<OPTION VALUE="700">0.700<OPTION VALUE="800">0.800<OPTION VALUE="900">0.900<OPTION VALUE="1000">1.000<OPTION VALUE="None">None<OPTION VALUE="Custom">Custom
</SELECT>
</TD>
</TR>
<TR>
<TH CLASS="label" WIDTH="50%"><A NAME="StpFineYellowBalance">Yellow Balance Fine Adjustment</A>:</TH>
<TD><SELECT NAME="StpFineYellowBalance" ID="select-StpFineYellowBalance" ONCHANGE="update_paramtable('StpFineYellowBalance')">
<OPTION VALUE="None">0.000<OPTION VALUE="0">0.000<OPTION VALUE="5">0.005<OPTION VALUE="10">0.010<OPTION VALUE="15">0.015<OPTION VALUE="20">0.020<OPTION VALUE="25">0.025<OPTION VALUE="30">0.030<OPTION VALUE="35">0.035<OPTION VALUE="40">0.040<OPTION VALUE="45">0.045<OPTION VALUE="50">0.050<OPTION VALUE="55">0.055<OPTION VALUE="60">0.060<OPTION VALUE="65">0.065<OPTION VALUE="70">0.070<OPTION VALUE="75">0.075<OPTION VALUE="80">0.080<OPTION VALUE="85">0.085<OPTION VALUE="90">0.090<OPTION VALUE="95">0.095
</SELECT>
</TR>
</TABLE>
<button type="submit">Save Changes</button>
</details>
</form>
<details>
<summary>Tools</summary>
<TABLE WIDTH="100%">
<TR>
<button onclick="ReloadCups()">Reload...</button>
</TR>
</details>
</div>
</div>
</div>
<script>
window.onload = function() { OnPageLoad(); };
function OnPageLoad() {
console.log("Page loaded");
// General settings
document.getElementById('color-enabled').checked = {{options.main.enabled|lower}};
document.getElementById('select-ColorModel').value = "{{options.general.ColorModel}}";
document.getElementById('select-StpColorPrecision').value = "{{options.general.StpColorPrecision}}";
document.getElementById('select-StpiShrinkOutput').value = "{{options.general.StpiShrinkOutput}}";
// Common settings
document.getElementById('select-StpColorCorrection').value = "{{options.common.StpColorCorrection}}";
document.getElementById('select-StpBrightness').value = "{{options.common.StpBrightness}}";
document.getElementById('select-StpFineBrightness').value = "{{options.common.StpFineBrightness}}";
document.getElementById('select-StpContrast').value = "{{options.common.StpContrast}}";
document.getElementById('select-StpFineContrast').value = "{{options.common.StpFineContrast}}";
document.getElementById('select-StpSaturation').value = "{{options.common.StpSaturation}}";
document.getElementById('select-StpFineSaturation').value = "{{options.common.StpFineSaturation}}";
document.getElementById('select-StpImageType').value = "{{options.common.StpImageType}}";
// Extra settings
document.getElementById('select-StpGamma').value = "{{options.extra.StpGamma}}";
document.getElementById('select-StpFineGamma').value = "{{options.extra.StpFineGamma}}";
document.getElementById('select-StpCyanGamma').value = "{{options.extra.StpCyanGamma}}";
document.getElementById('select-StpFineCyanGamma').value = "{{options.extra.StpFineCyanGamma}}";
document.getElementById('select-StpMagentaGamma').value = "{{options.extra.StpMagentaGamma}}";
document.getElementById('select-StpFineMagentaGamma').value = "{{options.extra.StpFineMagentaGamma}}";
document.getElementById('select-StpYellowGamma').value = "{{options.extra.StpYellowGamma}}";
document.getElementById('select-StpFineYellowGamma').value = "{{options.extra.StpFineYellowGamma}}";
document.getElementById('select-StpCyanBalance').value = "{{options.extra.StpCyanBalance}}";
document.getElementById('select-StpFineCyanBalance').value = "{{options.extra.StpFineCyanBalance}}";
document.getElementById('select-StpMagentaBalance').value = "{{options.extra.StpMagentaBalance}}";
document.getElementById('select-StpFineMagentaBalance').value = "{{options.extra.StpFineMagentaBalance}}";
document.getElementById('select-StpYellowBalance').value = "{{options.extra.StpYellowBalance}}";
document.getElementById('select-StpFineYellowBalance').value = "{{options.extra.StpFineYellowBalance}}";
}
function submitForm(event) {
event.preventDefault(); // Prevent form from submitting the traditional way
$.ajax({
type: "POST",
url: "/save_color_options",
data: $("#colorOptionsForm").serialize(),
success: function(response) {
alert(response.message); // Show a popup window with the success message
},
error: function() {
alert("An error occurred while saving the settings.");
}
});
}
function ReloadCups() {
fetch('/reload_cups', {
method: 'POST'
})
.then(response => response.json())
.then(data => {
if (data.status == "success") {
alert("Reload Successful!");
} else {
alert("Reload Failed: " + data.message);
}
})
.catch(error => {
console.error("Error during reload attempt:", error);
alert("Error during reload attempt.");
});
}
</script>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More