From c1325c0eda4c3b3d70a77e5dae969844a712a05f Mon Sep 17 00:00:00 2001 From: katsu <0xemmilia@gmail.com> Date: Wed, 2 Jul 2025 16:29:09 +0200 Subject: [PATCH] frontend overhaul, minor backend bugfixes --- ansible_deploy/playbook.yaml | 22 ++- ansible_deploy/service.j2 | 2 +- barco_telnet/barco_G62_control.py | 32 ++-- frontend/vju_display/src/App.vue | 71 ++++---- frontend/vju_display/src/assets/base.css | 32 ---- frontend/vju_display/src/assets/main.css | 88 +++++++++- .../src/components/AudioControlModule.vue | 20 ++- .../src/components/LectureModule.vue | 153 +++++++++++------- frontend/vju_display/src/components/Lift.vue | 91 ++++++----- .../components/MasterPowerControlModule.vue | 2 +- .../vju_display/src/components/Numpad.vue | 125 ++++++++++++++ .../vju_display/src/components/PinPopup.vue | 78 --------- .../vju_display/src/components/Platno.vue | 94 ++++++----- .../src/components/ProjectorPowerModule.vue | 2 +- .../vju_display/src/components/Projektor.vue | 18 ++- .../src/components/ResetButton.vue | 2 +- .../src/components/icons/DownIcon.vue | 2 +- .../src/components/icons/UpIcon.vue | 2 +- .../src/components/pages/AudioPage.vue | 53 ++++++ .../src/components/pages/LightingPage.vue | 123 ++++++++------ .../src/components/pages/MainPage.vue | 35 ++-- .../src/components/pages/PinPage.vue | 38 ----- .../src/components/pages/ServisPage.vue | 63 +++++--- .../src/components/pages/VideoPage.vue | 25 +-- .../vju_display/src/components/tabs/Tab.vue | 1 - .../src/components/tabs/VerticalTabs.vue | 1 - frontend/vju_display/src/main.ts | 6 +- tse_serial/tse_serial_controler.py | 67 +++++--- 28 files changed, 767 insertions(+), 481 deletions(-) delete mode 100644 frontend/vju_display/src/assets/base.css create mode 100644 frontend/vju_display/src/components/Numpad.vue delete mode 100644 frontend/vju_display/src/components/PinPopup.vue create mode 100644 frontend/vju_display/src/components/pages/AudioPage.vue delete mode 100644 frontend/vju_display/src/components/pages/PinPage.vue diff --git a/ansible_deploy/playbook.yaml b/ansible_deploy/playbook.yaml index 8c4fbc1..cb79108 100644 --- a/ansible_deploy/playbook.yaml +++ b/ansible_deploy/playbook.yaml @@ -1,9 +1,12 @@ - name: Test playbook + vars: + # TODO: maybe don't hardcode this? + PROJECT_BASE: "/home/kat/Documents/polzp/fri_multimedia_rework" hosts: P01 # vars_files: # - secret - vars: + # addr: "192.168.122.245" handlers: @@ -185,19 +188,24 @@ backup: yes + - name: Build frontend + delegate_to: localhost + command: + chdir: "{{PROJECT_BASE}}/frontend/vju_display/" + cmd: "npm run build" - name: copy frontend to webroot become: true ansible.builtin.copy: - src: /home/kat/Documents/polzp/fri_multimedia_rework/frontend/vju_display/dist/ - #src: /home/kat/fri_multimedia_rework/frontend/vju_display/dist - #remote_src: true - #dest: /srv/www + src: "{{PROJECT_BASE}}/frontend/vju_display/dist/" dest: /var/www/html/ - #dest: /home/kat/testoa owner: root - group: root + group: www-data mode: '0755' backup: yes + - name: daemon reload + become: true + ansible.builtin.systemd_service: + daemon_reload: true diff --git a/ansible_deploy/service.j2 b/ansible_deploy/service.j2 index 133b2f6..b232bbc 100644 --- a/ansible_deploy/service.j2 +++ b/ansible_deploy/service.j2 @@ -3,7 +3,7 @@ Description={{ script_file }} After=multi-user.target [Service] -ExecStart=/usr/local/bin/poetry run python3 {{ script_file }} +ExecStart=/usr/local/bin/poetry run python3 -u {{ script_file }} Type=simple Restart=always User=pi diff --git a/barco_telnet/barco_G62_control.py b/barco_telnet/barco_G62_control.py index c3cd2b2..14031c1 100644 --- a/barco_telnet/barco_G62_control.py +++ b/barco_telnet/barco_G62_control.py @@ -13,6 +13,7 @@ barcoIP: str telnetPort: int mqttPort: int mqttIP: str +barcoReached: bool cmdMap = { 'power': 'POWR', @@ -23,7 +24,7 @@ reverseCmdMap = {v: k for k, v in cmdMap.items()} def parse_barco_response(raw: str): - global room, barcoPosition + global room, barcoPosition, barcoReached raw = raw[1:-1] # strip square brackets #print(raw) if raw.startswith("ERR"): @@ -33,6 +34,7 @@ def parse_barco_response(raw: str): #print(cmd + " " + status) cmd = reverseCmdMap[cmd] status = '1' if status == '01' else '0' + barcoReached = True return cmd, status @@ -91,7 +93,7 @@ async def barco_telnet_query_status(writer, select: str): async def main(): - global room + global room, barcoReached global barcoPosition, barcoIP, telnetPort, mqttIP, mqttPort if len(sys.argv) < 2: sys.exit("No position provided") @@ -102,20 +104,26 @@ async def main(): g62Barcos = {k: v for k,v in conf["barco_G62"].items()} currentBarco = g62Barcos[barcoPosition] barcoIP = currentBarco['ip'] - telnetPort = currentBarco["port"] + telnetPort = int(currentBarco["port"]) room = conf["global"]["room"] - mqttPort = conf["global"]["mqttPort"] + mqttPort = int(conf["global"]["mqttPort"]) mqttIP = conf["global"]["mqttIp"] + barcoReached = False + try: + barcoReader, barcoWriter = await telnetlib3.open_connection(barcoIP, telnetPort) + barcoReached = True + except Exception as e: + print("Connection failed: " + barcoIP + ": " + str(e)) + barcoReached = False + finally: + async with aiomqtt.Client(mqttIP, mqttPort) as client: + task_status_query_barco = asyncio.create_task(barco_telnet_query_status(barcoWriter, barcoPosition)) + task_status_reader_barco = asyncio.create_task(barco_telnet_read_status(client, barcoReader, barcoPosition)) + task_control_barco = asyncio.create_task(barco_telnet_command(client, barcoWriter, barcoPosition)) - barcoReader, barcoWriter = await telnetlib3.open_connection(barcoIP, telnetPort) - async with aiomqtt.Client(mqttIP, mqttPort) as client: - task_status_query_barco = asyncio.create_task(barco_telnet_query_status(barcoWriter, barcoPosition)) - task_status_reader_barco = asyncio.create_task(barco_telnet_read_status(client, barcoReader, barcoPosition)) - task_control_barco = asyncio.create_task(barco_telnet_command(client, barcoWriter, barcoPosition)) - - await asyncio.gather(task_status_query_barco, task_status_reader_barco, task_control_barco) - + await asyncio.gather(task_status_query_barco, task_status_reader_barco, task_control_barco) + await client.publish(f"{room}/projectors/{barcoPosition}/error", payload=("UNREACHABLE" if not barcoReached else "OK")) ### fuj to, ne tk delat diff --git a/frontend/vju_display/src/App.vue b/frontend/vju_display/src/App.vue index 724acdf..32334e9 100644 --- a/frontend/vju_display/src/App.vue +++ b/frontend/vju_display/src/App.vue @@ -1,66 +1,77 @@ diff --git a/frontend/vju_display/src/assets/base.css b/frontend/vju_display/src/assets/base.css deleted file mode 100644 index 8ea68d2..0000000 --- a/frontend/vju_display/src/assets/base.css +++ /dev/null @@ -1,32 +0,0 @@ -*, -*::before, -*::after { - box-sizing: border-box; - margin: 0; - font-weight: normal; -} - -:root { - --color-text: #000; - --color-background: #EEE; - - --color-brand-ul-red: #e03127; - --color-brand-ul-light-grey: #E6E7E8; - --color-brand-ul-medium-grey: #A7A8AA; - --color-brand-ul-dark-grey: #58595b; -} - -body { - min-height: 100vh; - color: var(--color-text); - background: var(--color-background); - transition: - color 0.5s, - background-color 0.5s; - line-height: 1.6; - font-family: sans-serif; - font-size: 17px; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; -} diff --git a/frontend/vju_display/src/assets/main.css b/frontend/vju_display/src/assets/main.css index 13c87d0..f43dca1 100644 --- a/frontend/vju_display/src/assets/main.css +++ b/frontend/vju_display/src/assets/main.css @@ -1,7 +1,47 @@ -@import './base.css'; +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +:root { + --color-text: #000; + --color-background: #EEE; + + --color-brand-ul-red: #e03127; + --color-brand-ul-light-grey: #E6E7E8; + --color-brand-ul-medium-grey: #A7A8AA; + --color-brand-ul-dark-grey: #58595b; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: "Noto Sans", sans-serif; + font-size: 17px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + + +* { + user-select: none; +} +html, body { + touch-action: manipulation; +} #app { max-width: 1280px; + height: 100vh; margin: 0 auto; } @@ -26,12 +66,46 @@ a, } } -button { - border: none; - background-color: #aaa; - cursor: pointer; + +.mstatus { + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; } -button:hover, button:focus, button:active { - background-color: #ccc; +button { + background: lightgray; + font-size: 1.3em; + font-weight: bold; } + +button:focus:not(:active) { + background: lightgray; +} + +button:focus-visible(:active) { + background: gray; +} + + + +button { + border: none; + background-color: lightgray; +} + +button:active { + background: gray; +} + + +h1 { + text-align: center; +} +h3 { + font-weight: bold; +} + +.currentlyActive { + background-color: orange !important +} \ No newline at end of file diff --git a/frontend/vju_display/src/components/AudioControlModule.vue b/frontend/vju_display/src/components/AudioControlModule.vue index 65592b2..eafb029 100644 --- a/frontend/vju_display/src/components/AudioControlModule.vue +++ b/frontend/vju_display/src/components/AudioControlModule.vue @@ -6,6 +6,7 @@ import { $mqtt } from 'vue-paho-mqtt' const props = defineProps({ room: String, + big: [Boolean, null] }) const topicstrs = [ //TODO everything else @@ -65,23 +66,20 @@ const roomState = ref(0) diff --git a/frontend/vju_display/src/components/LectureModule.vue b/frontend/vju_display/src/components/LectureModule.vue index de8802a..3c00fc2 100644 --- a/frontend/vju_display/src/components/LectureModule.vue +++ b/frontend/vju_display/src/components/LectureModule.vue @@ -1,47 +1,57 @@ diff --git a/frontend/vju_display/src/components/Lift.vue b/frontend/vju_display/src/components/Lift.vue index 8dea428..de00b71 100644 --- a/frontend/vju_display/src/components/Lift.vue +++ b/frontend/vju_display/src/components/Lift.vue @@ -1,14 +1,14 @@ + + + + diff --git a/frontend/vju_display/src/components/PinPopup.vue b/frontend/vju_display/src/components/PinPopup.vue deleted file mode 100644 index 2023278..0000000 --- a/frontend/vju_display/src/components/PinPopup.vue +++ /dev/null @@ -1,78 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/frontend/vju_display/src/components/Platno.vue b/frontend/vju_display/src/components/Platno.vue index 82b50bb..95aebdd 100644 --- a/frontend/vju_display/src/components/Platno.vue +++ b/frontend/vju_display/src/components/Platno.vue @@ -1,15 +1,15 @@ diff --git a/frontend/vju_display/src/components/ProjectorPowerModule.vue b/frontend/vju_display/src/components/ProjectorPowerModule.vue index e2fcf2e..92151a1 100644 --- a/frontend/vju_display/src/components/ProjectorPowerModule.vue +++ b/frontend/vju_display/src/components/ProjectorPowerModule.vue @@ -69,7 +69,7 @@ const roomState = ref(0)

Projektorji

diff --git a/frontend/vju_display/src/components/Projektor.vue b/frontend/vju_display/src/components/Projektor.vue index 938e6ec..bb24a36 100644 --- a/frontend/vju_display/src/components/Projektor.vue +++ b/frontend/vju_display/src/components/Projektor.vue @@ -14,8 +14,11 @@ const topicstrs = [ //TODO everything else props.room + '/projectors/' + props.position + '/status/power', props.room + '/projectors/' + props.position + '/status/shutter', props.room + '/projectors/' + props.position + '/status/freeze', + props.room + '/projectors/' + props.position + '/status', ] +const isUnreachable = ref(false) + const subscriptions = topicstrs.map(topic => { // console.log('subbing to', topic) @@ -27,10 +30,12 @@ const subscriptions = function handleIncomingMQTT(topic: string, msg: string) { console.log('Received on', topic, 'with message', msg) - if (topic.includes('status')) { + if (topic.includes('status') && !topic.endsWith('status')) { //console.log(topic.split('/')) let typ = topic.split('/')[4] handleProjectorStatus(typ, msg) + } else { + isUnreachable.value = msg.length > 1 } } @@ -51,7 +56,7 @@ onMounted(() => { function publishMQTTMsg(topic: string, msg: string) { //msg = msg.toString() console.log('Sending to [', topic, '] with message [', msg, ']') - $mqtt.publish(topic, msg, 'Qr') //todo refactor to 1 or 0 maybe + $mqtt.publish(topic, msg, 'Fnr') //todo refactor to 1 or 0 maybe console.log('sent') } @@ -71,20 +76,21 @@ const projStatus = reactive({