Browse Source

Přidány zdrojové kódy a konfigurační soubory

master
doctordehi 4 years ago
parent
commit
9fa4ec7cfb
  1. BIN
      img/htop-running-all_04-05-2021.png
  2. 0
      lucy_webapp/app/__init__.py
  3. 15
      lucy_webapp/app/admin.py
  4. 5
      lucy_webapp/app/apps.py
  5. 36
      lucy_webapp/app/migrations/0001_initial.py
  6. 18
      lucy_webapp/app/migrations/0002_auto_20210331_2003.py
  7. 19
      lucy_webapp/app/migrations/0003_commandexecution_value.py
  8. 18
      lucy_webapp/app/migrations/0004_auto_20210331_2023.py
  9. 18
      lucy_webapp/app/migrations/0005_auto_20210331_2209.py
  10. 23
      lucy_webapp/app/migrations/0006_auto_20210331_2224.py
  11. 13
      lucy_webapp/app/migrations/0007_auto_20210407_1230.py
  12. 17
      lucy_webapp/app/migrations/0008_remove_commandexecution_timestamp.py
  13. 19
      lucy_webapp/app/migrations/0009_commandexecution_timestamp.py
  14. 18
      lucy_webapp/app/migrations/0010_auto_20210407_1237.py
  15. 36
      lucy_webapp/app/migrations/0011_module_module_value.py
  16. 17
      lucy_webapp/app/migrations/0012_auto_20210428_1432.py
  17. 19
      lucy_webapp/app/migrations/0013_auto_20210428_1437.py
  18. 18
      lucy_webapp/app/migrations/0014_auto_20210428_1600.py
  19. 19
      lucy_webapp/app/migrations/0015_modulevalue_unit.py
  20. 18
      lucy_webapp/app/migrations/0016_auto_20210429_2220.py
  21. 0
      lucy_webapp/app/migrations/__init__.py
  22. 43
      lucy_webapp/app/models.py
  23. 4997
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.css
  24. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.css.map
  25. 7
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.min.css
  26. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.min.css.map
  27. 4996
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.rtl.css
  28. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.rtl.css.map
  29. 7
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.rtl.min.css
  30. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.rtl.min.css.map
  31. 426
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.css
  32. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.css.map
  33. 8
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.min.css
  34. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.min.css.map
  35. 423
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.rtl.css
  36. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.rtl.css.map
  37. 8
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.rtl.min.css
  38. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.rtl.min.css.map
  39. 4752
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.css
  40. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.css.map
  41. 7
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.min.css
  42. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.min.css.map
  43. 4743
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.rtl.css
  44. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.rtl.css.map
  45. 7
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.rtl.min.css
  46. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.rtl.min.css.map
  47. 10819
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.css
  48. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.css.map
  49. 7
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.min.css
  50. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.min.css.map
  51. 10795
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.rtl.css
  52. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.rtl.css.map
  53. 7
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.rtl.min.css
  54. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.rtl.min.css.map
  55. 6714
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.bundle.js
  56. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.bundle.js.map
  57. 7
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.bundle.min.js
  58. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.bundle.min.js.map
  59. 4944
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.esm.js
  60. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.esm.js.map
  61. 7
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.esm.min.js
  62. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.esm.min.js.map
  63. 4993
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.js
  64. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.js.map
  65. 7
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.min.js
  66. 1
      lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.min.js.map
  67. 114
      lucy_webapp/app/static/app/css/login.css
  68. 125
      lucy_webapp/app/static/app/css/style.css
  69. BIN
      lucy_webapp/app/static/app/img/favicon.ico
  70. BIN
      lucy_webapp/app/static/app/img/login-back.jpg
  71. BIN
      lucy_webapp/app/static/app/img/login-back2.jpg
  72. 81
      lucy_webapp/app/static/app/js/camera.js
  73. 149
      lucy_webapp/app/static/app/js/control.js.old
  74. 169
      lucy_webapp/app/static/app/js/control.js.orig
  75. 324
      lucy_webapp/app/static/app/js/control.js?v=1.1
  76. 153
      lucy_webapp/app/static/app/js/control_BACKUP_10676.js
  77. 138
      lucy_webapp/app/static/app/js/control_BASE_10475.js
  78. 138
      lucy_webapp/app/static/app/js/control_BASE_10552.js
  79. 138
      lucy_webapp/app/static/app/js/control_BASE_10676.js
  80. 137
      lucy_webapp/app/static/app/js/control_LOCAL_10475.js
  81. 137
      lucy_webapp/app/static/app/js/control_LOCAL_10552.js
  82. 137
      lucy_webapp/app/static/app/js/control_LOCAL_10676.js
  83. 149
      lucy_webapp/app/static/app/js/control_REMOTE_10475.js
  84. 149
      lucy_webapp/app/static/app/js/control_REMOTE_10552.js
  85. 2
      lucy_webapp/app/static/app/js/jquery3.5.1.min.js
  86. 0
      lucy_webapp/app/templatetags/__init__.py
  87. 9
      lucy_webapp/app/templatetags/app_tags.py
  88. 3
      lucy_webapp/app/tests.py
  89. 13
      lucy_webapp/app/urls.py
  90. 90
      lucy_webapp/app/views.py
  91. 0
      lucy_webapp/lucy_webapp/__init__.py
  92. 16
      lucy_webapp/lucy_webapp/asgi.py
  93. 134
      lucy_webapp/lucy_webapp/settings.py
  94. 27
      lucy_webapp/lucy_webapp/urls.py
  95. 16
      lucy_webapp/lucy_webapp/wsgi.py
  96. 22
      lucy_webapp/manage.py
  97. 29
      lucy_webapp/nginx/lucy_webapp.conf
  98. 2
      lucy_webapp/start.sh
  99. 16
      lucy_webapp/stop.txt
  100. 194
      lucy_webapp/templates/app/index.html

BIN
img/htop-running-all_04-05-2021.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

0
lucy_webapp/app/__init__.py

15
lucy_webapp/app/admin.py

@ -0,0 +1,15 @@
from django.contrib import admin
from .models import Command, CommandExecution, Module, ModuleValue
class CommandAdmin(admin.ModelAdmin):
list_display = ['system_name', 'name', 'description', 'flag']
class CommandExecutionAdmin(admin.ModelAdmin):
list_display = ['id', 'command', 'timestamp', 'state', 'result', 'note']
# Register your models here.
admin.site.register(Command, CommandAdmin)
admin.site.register(CommandExecution, CommandExecutionAdmin)
admin.site.register(Module)
admin.site.register(ModuleValue)

5
lucy_webapp/app/apps.py

@ -0,0 +1,5 @@
from django.apps import AppConfig
class AppConfig(AppConfig):
name = 'app'

36
lucy_webapp/app/migrations/0001_initial.py

@ -0,0 +1,36 @@
# Generated by Django 3.1.7 on 2021-02-21 21:23
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Command',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('system_name', models.CharField(max_length=120)),
('name', models.CharField(max_length=120)),
('description', models.CharField(max_length=250)),
('flag', models.BooleanField(default=True)),
],
),
migrations.CreateModel(
name='CommandExecution',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('timestamp', models.DateTimeField(auto_now_add=True)),
('state', models.CharField(default='Created', max_length=60)),
('result', models.CharField(default='Processing', max_length=60)),
('note', models.CharField(max_length=250)),
('command', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.command')),
],
),
]

18
lucy_webapp/app/migrations/0002_auto_20210331_2003.py

@ -0,0 +1,18 @@
# Generated by Django 3.1.6 on 2021-03-31 18:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='commandexecution',
name='timestamp',
field=models.DateTimeField(),
),
]

19
lucy_webapp/app/migrations/0003_commandexecution_value.py

@ -0,0 +1,19 @@
# Generated by Django 3.1.6 on 2021-03-31 18:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0002_auto_20210331_2003'),
]
operations = [
migrations.AddField(
model_name='commandexecution',
name='value',
field=models.IntegerField(default=0),
preserve_default=False,
),
]

18
lucy_webapp/app/migrations/0004_auto_20210331_2023.py

@ -0,0 +1,18 @@
# Generated by Django 3.1.6 on 2021-03-31 18:23
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0003_commandexecution_value'),
]
operations = [
migrations.AlterField(
model_name='commandexecution',
name='value',
field=models.IntegerField(default=0),
),
]

18
lucy_webapp/app/migrations/0005_auto_20210331_2209.py

@ -0,0 +1,18 @@
# Generated by Django 3.1.6 on 2021-03-31 20:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0004_auto_20210331_2023'),
]
operations = [
migrations.AlterField(
model_name='commandexecution',
name='note',
field=models.CharField(max_length=1000),
),
]

23
lucy_webapp/app/migrations/0006_auto_20210331_2224.py

@ -0,0 +1,23 @@
# Generated by Django 3.1.6 on 2021-03-31 20:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0005_auto_20210331_2209'),
]
operations = [
migrations.AlterField(
model_name='commandexecution',
name='result',
field=models.CharField(default='Processing', max_length=250),
),
migrations.AlterField(
model_name='commandexecution',
name='state',
field=models.CharField(default='Created', max_length=250),
),
]

13
lucy_webapp/app/migrations/0007_auto_20210407_1230.py

@ -0,0 +1,13 @@
# Generated by Django 3.1.7 on 2021-04-07 10:30
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0006_auto_20210331_2224'),
]
operations = [
]

17
lucy_webapp/app/migrations/0008_remove_commandexecution_timestamp.py

@ -0,0 +1,17 @@
# Generated by Django 3.1.7 on 2021-04-07 10:32
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('app', '0007_auto_20210407_1230'),
]
operations = [
migrations.RemoveField(
model_name='commandexecution',
name='timestamp',
),
]

19
lucy_webapp/app/migrations/0009_commandexecution_timestamp.py

@ -0,0 +1,19 @@
# Generated by Django 3.1.7 on 2021-04-07 10:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0008_remove_commandexecution_timestamp'),
]
operations = [
migrations.AddField(
model_name='commandexecution',
name='timestamp',
field=models.IntegerField(default=0),
preserve_default=False,
),
]

18
lucy_webapp/app/migrations/0010_auto_20210407_1237.py

@ -0,0 +1,18 @@
# Generated by Django 3.1.7 on 2021-04-07 10:37
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0009_commandexecution_timestamp'),
]
operations = [
migrations.AlterField(
model_name='commandexecution',
name='timestamp',
field=models.BigIntegerField(),
),
]

36
lucy_webapp/app/migrations/0011_module_module_value.py

@ -0,0 +1,36 @@
# Generated by Django 3.1.6 on 2021-04-28 12:30
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('app', '0010_auto_20210407_1237'),
]
operations = [
migrations.CreateModel(
name='Module',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=250)),
('display_name', models.CharField(max_length=250)),
('description', models.CharField(blank=True, max_length=500)),
('error', models.CharField(blank=True, max_length=250)),
('last_update', models.DateTimeField(auto_now=True)),
],
),
migrations.CreateModel(
name='Module_value',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('variable', models.CharField(max_length=100)),
('data_type', models.CharField(max_length=10)),
('value', models.CharField(max_length=100)),
('timestamp', models.DateTimeField(auto_now_add=True)),
('module', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='app.module')),
],
),
]

17
lucy_webapp/app/migrations/0012_auto_20210428_1432.py

@ -0,0 +1,17 @@
# Generated by Django 3.1.6 on 2021-04-28 12:32
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('app', '0011_module_module_value'),
]
operations = [
migrations.RenameModel(
old_name='Module_value',
new_name='ModuleValue',
),
]

19
lucy_webapp/app/migrations/0013_auto_20210428_1437.py

@ -0,0 +1,19 @@
# Generated by Django 3.1.6 on 2021-04-28 12:37
import datetime
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0012_auto_20210428_1432'),
]
operations = [
migrations.AlterField(
model_name='module',
name='last_update',
field=models.DateTimeField(default=datetime.datetime.now),
),
]

18
lucy_webapp/app/migrations/0014_auto_20210428_1600.py

@ -0,0 +1,18 @@
# Generated by Django 3.1.6 on 2021-04-28 14:00
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0013_auto_20210428_1437'),
]
operations = [
migrations.AlterField(
model_name='module',
name='name',
field=models.CharField(max_length=250, unique=True),
),
]

19
lucy_webapp/app/migrations/0015_modulevalue_unit.py

@ -0,0 +1,19 @@
# Generated by Django 3.1.6 on 2021-04-29 20:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0014_auto_20210428_1600'),
]
operations = [
migrations.AddField(
model_name='modulevalue',
name='unit',
field=models.CharField(default='', max_length=10),
preserve_default=False,
),
]

18
lucy_webapp/app/migrations/0016_auto_20210429_2220.py

@ -0,0 +1,18 @@
# Generated by Django 3.1.6 on 2021-04-29 20:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('app', '0015_modulevalue_unit'),
]
operations = [
migrations.AlterField(
model_name='modulevalue',
name='unit',
field=models.CharField(blank=True, max_length=10),
),
]

0
lucy_webapp/app/migrations/__init__.py

43
lucy_webapp/app/models.py

@ -0,0 +1,43 @@
from django.db import models
from datetime import datetime
class Command(models.Model):
system_name = models.CharField(max_length=120)
name = models.CharField(max_length=120)
description = models.CharField(max_length=250)
flag = models.BooleanField(default=True)
def __str__(self):
return self.system_name
class CommandExecution(models.Model):
command = models.ForeignKey("Command", on_delete=models.CASCADE)
value = models.IntegerField(default=0)
#timestamp = models.DateTimeField(auto_now=False, auto_now_add=True)
#imestamp = models.DateTimeField()
timestamp = models.BigIntegerField()
state = models.CharField(max_length=250, default="Created")
result = models.CharField(max_length=250, default="Processing")
note = models.CharField(max_length=1000)
class Module(models.Model):
name = models.CharField(max_length=250, unique=True)
display_name = models.CharField(max_length=250)
description = models.CharField(max_length=500, blank=True)
error = models.CharField(max_length=250, blank=True)
last_update = models.DateTimeField(default=datetime.now)
def __str__(self):
return self.display_name
class ModuleValue(models.Model):
module = models.ForeignKey("Module", on_delete=models.CASCADE)
variable = models.CharField(max_length=100)
data_type = models.CharField(max_length=10)
value = models.CharField(max_length=100)
unit = models.CharField(max_length=10, blank=True)
timestamp = models.DateTimeField(auto_now_add=True)

4997
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.css

File diff suppressed because it is too large

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.css.map

File diff suppressed because one or more lines are too long

7
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.min.css

File diff suppressed because one or more lines are too long

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.min.css.map

File diff suppressed because one or more lines are too long

4996
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.rtl.css

File diff suppressed because it is too large

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.rtl.css.map

File diff suppressed because one or more lines are too long

7
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.rtl.min.css

File diff suppressed because one or more lines are too long

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-grid.rtl.min.css.map

File diff suppressed because one or more lines are too long

426
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.css

@ -0,0 +1,426 @@
/*!
* Bootstrap Reboot v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
background-color: #fff;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
background-color: currentColor;
border: 0;
opacity: 0.25;
}
hr:not([size]) {
height: 1px;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-bs-original-title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-left: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-left: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.2em;
background-color: #fcf8e3;
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: #0d6efd;
text-decoration: underline;
}
a:hover {
color: #0a58ca;
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
direction: ltr /* rtl:ignore */;
unicode-bidi: bidi-override;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: #d63384;
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.2rem 0.4rem;
font-size: 0.875em;
color: #fff;
background-color: #212529;
border-radius: 0.2rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
font-weight: 700;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: #6c757d;
text-align: left;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]::-webkit-calendar-picker-indicator {
display: none;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: left;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: left;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
outline-offset: -2px;
-webkit-appearance: textfield;
}
/* rtl:raw:
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
*/
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::file-selector-button {
font: inherit;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.css.map */

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.css.map

File diff suppressed because one or more lines are too long

8
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.min.css

@ -0,0 +1,8 @@
/*!
* Bootstrap Reboot v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-left:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-left:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:left}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:left;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:left}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.min.css.map */

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.min.css.map

File diff suppressed because one or more lines are too long

423
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.rtl.css

@ -0,0 +1,423 @@
/*!
* Bootstrap Reboot v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/
*,
*::before,
*::after {
box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
:root {
scroll-behavior: smooth;
}
}
body {
margin: 0;
font-family: system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", "Liberation Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
background-color: #fff;
-webkit-text-size-adjust: 100%;
-webkit-tap-highlight-color: rgba(0, 0, 0, 0);
}
hr {
margin: 1rem 0;
color: inherit;
background-color: currentColor;
border: 0;
opacity: 0.25;
}
hr:not([size]) {
height: 1px;
}
h6, h5, h4, h3, h2, h1 {
margin-top: 0;
margin-bottom: 0.5rem;
font-weight: 500;
line-height: 1.2;
}
h1 {
font-size: calc(1.375rem + 1.5vw);
}
@media (min-width: 1200px) {
h1 {
font-size: 2.5rem;
}
}
h2 {
font-size: calc(1.325rem + 0.9vw);
}
@media (min-width: 1200px) {
h2 {
font-size: 2rem;
}
}
h3 {
font-size: calc(1.3rem + 0.6vw);
}
@media (min-width: 1200px) {
h3 {
font-size: 1.75rem;
}
}
h4 {
font-size: calc(1.275rem + 0.3vw);
}
@media (min-width: 1200px) {
h4 {
font-size: 1.5rem;
}
}
h5 {
font-size: 1.25rem;
}
h6 {
font-size: 1rem;
}
p {
margin-top: 0;
margin-bottom: 1rem;
}
abbr[title],
abbr[data-bs-original-title] {
-webkit-text-decoration: underline dotted;
text-decoration: underline dotted;
cursor: help;
-webkit-text-decoration-skip-ink: none;
text-decoration-skip-ink: none;
}
address {
margin-bottom: 1rem;
font-style: normal;
line-height: inherit;
}
ol,
ul {
padding-right: 2rem;
}
ol,
ul,
dl {
margin-top: 0;
margin-bottom: 1rem;
}
ol ol,
ul ul,
ol ul,
ul ol {
margin-bottom: 0;
}
dt {
font-weight: 700;
}
dd {
margin-bottom: 0.5rem;
margin-right: 0;
}
blockquote {
margin: 0 0 1rem;
}
b,
strong {
font-weight: bolder;
}
small {
font-size: 0.875em;
}
mark {
padding: 0.2em;
background-color: #fcf8e3;
}
sub,
sup {
position: relative;
font-size: 0.75em;
line-height: 0;
vertical-align: baseline;
}
sub {
bottom: -0.25em;
}
sup {
top: -0.5em;
}
a {
color: #0d6efd;
text-decoration: underline;
}
a:hover {
color: #0a58ca;
}
a:not([href]):not([class]), a:not([href]):not([class]):hover {
color: inherit;
text-decoration: none;
}
pre,
code,
kbd,
samp {
font-family: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
font-size: 1em;
direction: ltr ;
unicode-bidi: bidi-override;
}
pre {
display: block;
margin-top: 0;
margin-bottom: 1rem;
overflow: auto;
font-size: 0.875em;
}
pre code {
font-size: inherit;
color: inherit;
word-break: normal;
}
code {
font-size: 0.875em;
color: #d63384;
word-wrap: break-word;
}
a > code {
color: inherit;
}
kbd {
padding: 0.2rem 0.4rem;
font-size: 0.875em;
color: #fff;
background-color: #212529;
border-radius: 0.2rem;
}
kbd kbd {
padding: 0;
font-size: 1em;
font-weight: 700;
}
figure {
margin: 0 0 1rem;
}
img,
svg {
vertical-align: middle;
}
table {
caption-side: bottom;
border-collapse: collapse;
}
caption {
padding-top: 0.5rem;
padding-bottom: 0.5rem;
color: #6c757d;
text-align: right;
}
th {
text-align: inherit;
text-align: -webkit-match-parent;
}
thead,
tbody,
tfoot,
tr,
td,
th {
border-color: inherit;
border-style: solid;
border-width: 0;
}
label {
display: inline-block;
}
button {
border-radius: 0;
}
button:focus:not(:focus-visible) {
outline: 0;
}
input,
button,
select,
optgroup,
textarea {
margin: 0;
font-family: inherit;
font-size: inherit;
line-height: inherit;
}
button,
select {
text-transform: none;
}
[role=button] {
cursor: pointer;
}
select {
word-wrap: normal;
}
select:disabled {
opacity: 1;
}
[list]::-webkit-calendar-picker-indicator {
display: none;
}
button,
[type=button],
[type=reset],
[type=submit] {
-webkit-appearance: button;
}
button:not(:disabled),
[type=button]:not(:disabled),
[type=reset]:not(:disabled),
[type=submit]:not(:disabled) {
cursor: pointer;
}
::-moz-focus-inner {
padding: 0;
border-style: none;
}
textarea {
resize: vertical;
}
fieldset {
min-width: 0;
padding: 0;
margin: 0;
border: 0;
}
legend {
float: right;
width: 100%;
padding: 0;
margin-bottom: 0.5rem;
font-size: calc(1.275rem + 0.3vw);
line-height: inherit;
}
@media (min-width: 1200px) {
legend {
font-size: 1.5rem;
}
}
legend + * {
clear: right;
}
::-webkit-datetime-edit-fields-wrapper,
::-webkit-datetime-edit-text,
::-webkit-datetime-edit-minute,
::-webkit-datetime-edit-hour-field,
::-webkit-datetime-edit-day-field,
::-webkit-datetime-edit-month-field,
::-webkit-datetime-edit-year-field {
padding: 0;
}
::-webkit-inner-spin-button {
height: auto;
}
[type=search] {
outline-offset: -2px;
-webkit-appearance: textfield;
}
[type="tel"],
[type="url"],
[type="email"],
[type="number"] {
direction: ltr;
}
::-webkit-search-decoration {
-webkit-appearance: none;
}
::-webkit-color-swatch-wrapper {
padding: 0;
}
::file-selector-button {
font: inherit;
}
::-webkit-file-upload-button {
font: inherit;
-webkit-appearance: button;
}
output {
display: inline-block;
}
iframe {
border: 0;
}
summary {
display: list-item;
cursor: pointer;
}
progress {
vertical-align: baseline;
}
[hidden] {
display: none !important;
}
/*# sourceMappingURL=bootstrap-reboot.rtl.css.map */

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.rtl.css.map

File diff suppressed because one or more lines are too long

8
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.rtl.min.css

@ -0,0 +1,8 @@
/*!
* Bootstrap Reboot v5.0.0-beta3 (https://getbootstrap.com/)
* Copyright 2011-2021 The Bootstrap Authors
* Copyright 2011-2021 Twitter, Inc.
* Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)
* Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
*/*,::after,::before{box-sizing:border-box}@media (prefers-reduced-motion:no-preference){:root{scroll-behavior:smooth}}body{margin:0;font-family:system-ui,-apple-system,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans","Liberation Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";font-size:1rem;font-weight:400;line-height:1.5;color:#212529;background-color:#fff;-webkit-text-size-adjust:100%;-webkit-tap-highlight-color:transparent}hr{margin:1rem 0;color:inherit;background-color:currentColor;border:0;opacity:.25}hr:not([size]){height:1px}h1,h2,h3,h4,h5,h6{margin-top:0;margin-bottom:.5rem;font-weight:500;line-height:1.2}h1{font-size:calc(1.375rem + 1.5vw)}@media (min-width:1200px){h1{font-size:2.5rem}}h2{font-size:calc(1.325rem + .9vw)}@media (min-width:1200px){h2{font-size:2rem}}h3{font-size:calc(1.3rem + .6vw)}@media (min-width:1200px){h3{font-size:1.75rem}}h4{font-size:calc(1.275rem + .3vw)}@media (min-width:1200px){h4{font-size:1.5rem}}h5{font-size:1.25rem}h6{font-size:1rem}p{margin-top:0;margin-bottom:1rem}abbr[data-bs-original-title],abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted;cursor:help;-webkit-text-decoration-skip-ink:none;text-decoration-skip-ink:none}address{margin-bottom:1rem;font-style:normal;line-height:inherit}ol,ul{padding-right:2rem}dl,ol,ul{margin-top:0;margin-bottom:1rem}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}dt{font-weight:700}dd{margin-bottom:.5rem;margin-right:0}blockquote{margin:0 0 1rem}b,strong{font-weight:bolder}small{font-size:.875em}mark{padding:.2em;background-color:#fcf8e3}sub,sup{position:relative;font-size:.75em;line-height:0;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}a{color:#0d6efd;text-decoration:underline}a:hover{color:#0a58ca}a:not([href]):not([class]),a:not([href]):not([class]):hover{color:inherit;text-decoration:none}code,kbd,pre,samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;font-size:1em;direction:ltr;unicode-bidi:bidi-override}pre{display:block;margin-top:0;margin-bottom:1rem;overflow:auto;font-size:.875em}pre code{font-size:inherit;color:inherit;word-break:normal}code{font-size:.875em;color:#d63384;word-wrap:break-word}a>code{color:inherit}kbd{padding:.2rem .4rem;font-size:.875em;color:#fff;background-color:#212529;border-radius:.2rem}kbd kbd{padding:0;font-size:1em;font-weight:700}figure{margin:0 0 1rem}img,svg{vertical-align:middle}table{caption-side:bottom;border-collapse:collapse}caption{padding-top:.5rem;padding-bottom:.5rem;color:#6c757d;text-align:right}th{text-align:inherit;text-align:-webkit-match-parent}tbody,td,tfoot,th,thead,tr{border-color:inherit;border-style:solid;border-width:0}label{display:inline-block}button{border-radius:0}button:focus:not(:focus-visible){outline:0}button,input,optgroup,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}button,select{text-transform:none}[role=button]{cursor:pointer}select{word-wrap:normal}select:disabled{opacity:1}[list]::-webkit-calendar-picker-indicator{display:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]:not(:disabled),[type=reset]:not(:disabled),[type=submit]:not(:disabled),button:not(:disabled){cursor:pointer}::-moz-focus-inner{padding:0;border-style:none}textarea{resize:vertical}fieldset{min-width:0;padding:0;margin:0;border:0}legend{float:right;width:100%;padding:0;margin-bottom:.5rem;font-size:calc(1.275rem + .3vw);line-height:inherit}@media (min-width:1200px){legend{font-size:1.5rem}}legend+*{clear:right}::-webkit-datetime-edit-day-field,::-webkit-datetime-edit-fields-wrapper,::-webkit-datetime-edit-hour-field,::-webkit-datetime-edit-minute,::-webkit-datetime-edit-month-field,::-webkit-datetime-edit-text,::-webkit-datetime-edit-year-field{padding:0}::-webkit-inner-spin-button{height:auto}[type=search]{outline-offset:-2px;-webkit-appearance:textfield}[type=email],[type=number],[type=tel],[type=url]{direction:ltr}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-color-swatch-wrapper{padding:0}::file-selector-button{font:inherit}::-webkit-file-upload-button{font:inherit;-webkit-appearance:button}output{display:inline-block}iframe{border:0}summary{display:list-item;cursor:pointer}progress{vertical-align:baseline}[hidden]{display:none!important}
/*# sourceMappingURL=bootstrap-reboot.rtl.min.css.map */

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-reboot.rtl.min.css.map

File diff suppressed because one or more lines are too long

4752
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.css

File diff suppressed because it is too large

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.css.map

File diff suppressed because one or more lines are too long

7
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.min.css

File diff suppressed because one or more lines are too long

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.min.css.map

File diff suppressed because one or more lines are too long

4743
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.rtl.css

File diff suppressed because it is too large

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.rtl.css.map

File diff suppressed because one or more lines are too long

7
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.rtl.min.css

File diff suppressed because one or more lines are too long

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap-utilities.rtl.min.css.map

File diff suppressed because one or more lines are too long

10819
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.css

File diff suppressed because it is too large

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.css.map

File diff suppressed because one or more lines are too long

7
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.min.css

File diff suppressed because one or more lines are too long

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.min.css.map

File diff suppressed because one or more lines are too long

10795
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.rtl.css

File diff suppressed because it is too large

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.rtl.css.map

File diff suppressed because one or more lines are too long

7
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.rtl.min.css

File diff suppressed because one or more lines are too long

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/css/bootstrap.rtl.min.css.map

File diff suppressed because one or more lines are too long

6714
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.bundle.js

File diff suppressed because it is too large

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.bundle.js.map

File diff suppressed because one or more lines are too long

7
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.bundle.min.js

File diff suppressed because one or more lines are too long

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.bundle.min.js.map

File diff suppressed because one or more lines are too long

4944
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.esm.js

File diff suppressed because it is too large

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.esm.js.map

File diff suppressed because one or more lines are too long

7
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.esm.min.js

File diff suppressed because one or more lines are too long

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.esm.min.js.map

File diff suppressed because one or more lines are too long

4993
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.js

File diff suppressed because it is too large

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.js.map

File diff suppressed because one or more lines are too long

7
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.min.js

File diff suppressed because one or more lines are too long

1
lucy_webapp/app/static/app/bootstrap-5.0.0-beta3-dist/js/bootstrap.min.js.map

File diff suppressed because one or more lines are too long

114
lucy_webapp/app/static/app/css/login.css

@ -0,0 +1,114 @@
html,body{
background-size: cover;
background-repeat: no-repeat;
height: 100%;
}
input {
display: block;
width: 100%;
padding: .375rem .75rem;
font-size: 1rem;
font-weight: 400;
line-height: 1.5;
color: #212529;
background-color: #fff;
background-clip: padding-box;
border: 1px solid #ced4da;
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
border-radius: .25rem;
transition: border-color .15s ease-in-out,box-shadow .15s ease-in-out;
}
}
/* Made with love by Mutiullah Samim*/
/*
@import url('https://fonts.googleapis.com/css?family=Numans');
html,body{
background-image: url('http://getwallpapers.com/wallpaper/full/a/5/d/544750.jpg');
background-size: cover;
background-repeat: no-repeat;
height: 100%;
}
.container{
height: 100%;
align-content: center;
}
.card{
height: 370px;
margin-top: auto;
margin-bottom: auto;
width: 400px;
background-color: rgba(0,0,0,0.5) !important;
}
.social_icon span{
font-size: 60px;
margin-left: 10px;
color: #FFC312;
}
.social_icon span:hover{
color: white;
cursor: pointer;
}
.card-header h3{
color: white;
}
.social_icon{
position: absolute;
right: 20px;
top: -45px;
}
.input-group-prepend span{
width: 50px;
background-color: #FFC312;
color: black;
border:0 !important;
}
input:focus{
outline: 0 0 0 0 !important;
box-shadow: 0 0 0 0 !important;
}
.remember{
color: white;
}
.remember input
{
width: 20px;
height: 20px;
margin-left: 15px;
margin-right: 5px;
}
.login_btn{
color: black;
background-color: #FFC312;
width: 100px;
}
.login_btn:hover{
color: black;
background-color: white;
}
.links{
color: white;
}
.links a{
margin-left: 4px;
}*/*/*/

125
lucy_webapp/app/static/app/css/style.css

@ -0,0 +1,125 @@
body {
box-sizing: border-box;
}
#content {
padding-top: 1vh;
}
#camera {
width: 100vw;
max-height: 70vh;
display: flex;
}
#camera #camera__img {
width: 100%;
height: 100%;
}
#movement-control {
padding-left: 1vw;
display: block;
}
#powerSlider {
max-width: 30vw;
}
#arrows {
max-width: 30vw;
}
#arrows__grid {
display: grid;
grid-template-columns: 10vw 10vw 10vw;
grid-template-rows: auto auto auto;
}
#arrows__grid .btn--arrow {
display: flex;
justify-content: center;
align-items: center;
width: 9vw;
height: 9vw;
max-width: 90px;
max-height: 90px;
margin-bottom: 1vw;
}
#arrows .arrow {
width: 8vw;
height: 8vw;
}
#module-data {
margin-top: 2vh;
margin-left: 2vw;
color: #212529;
padding: 10px;
}
#module_data p {
margin-top: 0;
padding-top: 0;
}
@media (max-width: 420px) {
#arrows {
max-width: 60vw;
}
#arrows__grid {
display: grid;
grid-template-columns: 20vw 20vw 20vw;
grid-template-rows: auto auto auto;
}
#arrows__grid .btn--arrow {
width: 19vw;
height: 19vw;
}
}
@media (min-width: 992px) {
#camera {
width: 50vw;
max-height: 100vh;
}
#movement-control {
min-width: 300px;
padding-right: 1vw;
}
#powerSlider {
width: 290px;
}
#arrows__grid {
display: grid;
grid-template-columns: 100px 100px 100px;
grid-template-rows: auto auto auto;
}
#arrows__grid .btn--arrow {
margin-bottom: 10px;
}
}
.unclickable {
pointer-events: none;
}
input[type=range]::range-track {
width: 100%;
height: 20px;
border-radius: 10px;
background-color: #eee;
border: 2px solid #ccc;
}

BIN
lucy_webapp/app/static/app/img/favicon.ico

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
lucy_webapp/app/static/app/img/login-back.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 KiB

BIN
lucy_webapp/app/static/app/img/login-back2.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 MiB

81
lucy_webapp/app/static/app/js/camera.js

@ -0,0 +1,81 @@
//
// !!! ZKOPÍROVANÁ ČÁST Z PANELU WEBOVÉ KAMERY ==> NEDOLADĚNO !!!
//
function hashHandler() {
switch(window.location.hash){
case '#full':
case '#fullscreen':
if (mjpeg_img !== null && document.getElementsByClassName("fullscreen").length == 0) {
toggle_fullscreen(mjpeg_img);
}
break;
case '#normal':
case '#normalscreen':
if (mjpeg_img !== null && document.getElementsByClassName("fullscreen").length != 0) {
toggle_fullscreen(mjpeg_img);
}
break;
}
}
//
// MJPEG
//
var mjpeg_img;
var halted = 0;
var previous_halted = 99;
var mjpeg_mode = 0;
var preview_delay = 0;
var btn_class_p = "btn btn-primary"
var btn_class_a = "btn btn-warning"
function reload_img () {
if(!halted) mjpeg_img.src = host + "/cam_pic.php?time=" + new Date().getTime() + "&pDelay=" + preview_delay;
else setTimeout("reload_img()", 500);
}
function error_img () {
setTimeout("mjpeg_img.src = 'cam_pic.php?time=' + new Date().getTime();", 100);
}
function updatePreview(cycle)
{
if (mjpegmode)
{
if (cycle !== undefined && cycle == true)
{
mjpeg_img.src = host + "/updating.jpg";
setTimeout("mjpeg_img.src = \"cam_pic_new.php?time=\" + new Date().getTime() + \"&pDelay=\" + preview_delay;", 1000);
return;
}
if (previous_halted != halted)
{
if(!halted)
{
mjpeg_img.src = host + "/cam_pic_new.php?time=" + new Date().getTime() + "&pDelay=" + preview_delay;
}
else
{
mjpeg_img.src = host + "/unavailable.jpg";
}
}
previous_halted = halted;
}
}
//
// Init
//
function init(mjpeg, video_fps, divider) {
mjpeg_img = document.getElementById("mjpeg_dest");
hashHandler();
window.onhashchange = hashHandler;
preview_delay = Math.floor(divider / Math.max(video_fps,1) * 1000000);
if (mjpeg) {
mjpegmode = 1;
} else {
mjpegmode = 0;
mjpeg_img.onload = reload_img;
mjpeg_img.onerror = error_img;
reload_img();
}
}

149
lucy_webapp/app/static/app/js/control.js.old

@ -0,0 +1,149 @@
*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
var pressed_keys = new Set();
var old_pressed_keys = null;
var command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = command;
}, 50)
setInterval(function(){
if (document.visibilityState == "visible") {
send_command('COMMAND_CONTINUE');
}
}, 1000);
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
if (!old_pressed_keys == pressed_keys)
old_pressed_keys = new Set(pressed_keys);
else
return;
if (pressed_keys.size == 0) {
command = "COMMAND_STOP";
return;
}
else if (pressed_keys.size > 2) {
command = null;
return;
}
else {
command = map_key_with_command(pressed_keys);
send_command(command)
}
}
function map_key_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
function send_command(command) {
$.post(
send_command_url,
{
command : command
},
function(response){
if (response.status == "ERROR") {
alert(response.message);
}
});
}

169
lucy_webapp/app/static/app/js/control.js.orig

@ -0,0 +1,169 @@
/*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
var pressed_keys = new Set();
<<<<<<< HEAD
var old_pressed_keys = new Set();
||||||| b5b6fbc
=======
var old_pressed_keys = null;
>>>>>>> 23ad3d98e06a44c06467ddf2c1d2c0c8bfb9880f
var command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = command;
}, 50)
/*
setInterval(function(){
if (document.visibilityState == "visible") {
send_command('COMMAND_CONTINUE');
}
}, 1000);
*/
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
<<<<<<< HEAD
if (old_pressed_keys == pressed_keys)
return;
||||||| b5b6fbc
if (old_pressed_keys == pressed_keys)
old_pressed_keys = new Set(pressed_keys);
=======
if (!old_pressed_keys == pressed_keys)
old_pressed_keys = new Set(pressed_keys);
>>>>>>> 23ad3d98e06a44c06467ddf2c1d2c0c8bfb9880f
else
old_pressed_keys = new Set(pressed_keys);
if (pressed_keys.size == 0) {
command = "COMMAND_STOP";
send_command(command);
return;
}
else if (pressed_keys.size > 2) {
command = 'COMMAND_CONTINUE';
return;
}
else {
command = map_key_with_command(pressed_keys);
send_command(command);
return;
}
}
function map_key_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
function send_command(command) {
$.ajax({
headers: { "X-CSRFToken": csrf_token },
url: send_command_url,
type: 'post',
dataType: 'json',
data: {
command : command,
},
success: function(response){
if (response.status == "ERROR") {
alert(response.message);
}
},
});
}

324
lucy_webapp/app/static/app/js/control.js?v=1.1

@ -0,0 +1,324 @@
/*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
// ### MOVEMENT COMMANDS ###
const COMMANDS_NEED_CONTINUE = [
"COMMAND_CONTINUE",
"COMMAND_RIDE_FORWARD",
"COMMAND_FORWARD_STEER_LEFT",
"COMMAND_FORWARD_STEER_RIGHT",
"COMMAND_RIDE_BACKWARD",
"COMMAND_BACKWARD_STEER_LEFT",
"COMMAND_BACKWARD_STEER_RIGHT",
"COMMAND_TURN_LEFT",
"COMMAND_TURN_RIGHT"
]
var pressed_keys = new Set();
var old_pressed_keys = new Set();
var last_command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = last_command;
}, 50)
setInterval(function(){
if (document.visibilityState == "visible" && last_command) {
if (COMMANDS_NEED_CONTINUE.includes(last_command)) {
send_command('COMMAND_CONTINUE');
}
}
}, 1000);
setInterval(function() {refresh_module_data()}, 1000)
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
if (eqSet(pressed_keys, old_pressed_keys)) {
return;
}
else {
old_pressed_keys = new Set(pressed_keys);
}
if (pressed_keys.size == 0) {
send_command("COMMAND_STOP");
return;
}
else if (pressed_keys.size > 2) {
return;
}
else {
command = map_keys_with_command(pressed_keys);
send_command(command);
return;
}
}
function map_keys_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
$('.btn--arrow').mousedown(function(e) {
if (e.target.value) {
send_command(e.target.value);
}
});
$('.btn--arrow').mouseup(function(e) {
send_command("COMMAND_STOP");
});
$('.btn--arrow').on('touchstart', function(e) {
if (e.target.value) {
send_command(e.target.value);
}
});
$('.btn--arrow').on('touchend', function(e) {
send_command("COMMAND_STOP");
});
function send_command(command, value=0) {
last_command = command;
$.ajax({
headers: { "X-CSRFToken": csrf_token },
url: send_command_url,
type: 'post',
dataType: 'json',
data: {
command : command,
value: value,
timestamp: Date.now(),
},
success: function(response){
document.getElementById("response").innerHTML = response.status;
document.getElementById("response-time").innerHTML = Date.now();
if (response.status == "ERROR") {
alert(response.message);
pressed_keys = new Set();
}
},
});
}
function eqSet(as, bs) {
if (as.size !== bs.size) return false;
for (var a of as) if (!bs.has(a)) return false;
return true;
}
// ### POWER SLIDER ###
var slider = document.getElementById("powerSlider");
var output = document.getElementById("powerSliderValue");
output.innerHTML = slider.value; // Display the default slider value
// Update the current slider value (each time you drag the slider handle)
slider.oninput = function() {
output.innerHTML = this.value;
send_command("COMMAND_SET_PWM_BYTE", this.value);
}
// SYSTEM SHUTDOWN
function system_shutdown_countdown() {
$("#system_shutdown-modal").modal({
backdrop: 'static',
keyboard: false
});
$("#system_shutdown-modal").modal('show');
$("#system_shutdown-modal__waiting").show();
$("#system_shutdown-modal__ready").hide();
var seconds = 30; //**change for any number you want, it's the seconds **//
function secondPassed() {
var minutes = Math.round((seconds - 30)/60);
var remainingSeconds = seconds % 60;
if (remainingSeconds < 10) {
remainingSeconds = "0" + remainingSeconds;
}
document.getElementById('system_shutdown-modal__countdown').innerHTML = minutes + ":" + remainingSeconds;
if (seconds == 0) {
$("#system_shutdown-modal__waiting").hide();
$("#system_shutdown-modal__ready").show();
clearInterval(countdownTimer);
} else {
seconds--;
}
}
var countdownTimer = setInterval(secondPassed, 1000);
}
$("#btn-system_shutdown_confirm").click(function(){
$("#system_shutdown_confirm-modal").hide();
$.ajax({
headers: { "X-CSRFToken": csrf_token },
url: '/_system_shutdown',
type: 'get',
success: function(response){
system_shutdown_countdown();
},
error: function(response) {
alert(response.responseText);
}
});
});
// MODULE DATA
function refresh_module_data() {
$.ajax({
headers: { "X-CSRFToken": csrf_token },
url: '/_get_module_data',
type: 'get',
success: function(response){
module_data = response["module_data"];
// delete old module data
$('#module-data__content').empty();
// display new module data
if (Object.keys(module_data).length == 0) {
document.getElementById("module-data__content").innerHTML = "Nejsou dostupná žádná data";
return;
}
for (var module in module_data) {
var module_div = document.createElement("div");
module_div.classList.add("module");
var h_element = document.createElement("H5");
var text_element = document.createTextNode(`Modul: ${module}`);
h_element.appendChild(text_element);
module_div.append(h_element);
for (var variable in module_data[module]) {
var var_element = document.createElement("p");
var_element.innerHTML = variable + ": ";
var val_element = document.createElement("span");
var val_text_element = document.createTextNode(module_data[module][variable])
val_element.appendChild(val_text_element);
var_element.append(val_element);
module_div.appendChild(var_element);
}
$('#module-data__content').append(module_div);
}
},
error: function(response) {
document.getElementById("module-data__content").innerHTML = "Nepodařilo se načíst data z modulů!";
}
});
}
function init_control() {
send_command("COMMAND_SET_PWM_BYTE", slider.value);
refresh_module_data();
}
init_control();
// PRO ZOBRAZENÍ BLIŽŠÍCH INFORMACÍ ==> ODKOMENTOVAT
// debug = true;
// if (debug) {
// $("#debug").show();
// }

153
lucy_webapp/app/static/app/js/control_BACKUP_10676.js

@ -0,0 +1,153 @@
/*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
var pressed_keys = new Set();
var command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = command;
}, 50)
setInterval(function(){
if (document.visibilityState == "visible") {
send_command('COMMAND_CONTINUE');
}
}, 1000);
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
if (pressed_keys.size == 0) {
command = "COMMAND_STOP";
send_command(command);
return;
}
else if (pressed_keys.size > 2) {
command = 'COMMAND_CONTINUE';
return;
}
else {
command = map_key_with_command(pressed_keys);
send_command(command);
return;
}
}
function map_key_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
function send_command(command) {
$.ajax({
headers: { "X-CSRFToken": csrf_token },
url: send_command_url,
type: 'post',
dataType: 'json',
data: {
command : command,
},
success: function(response){
if (response.status == "ERROR") {
alert(response.message);
}
<<<<<<< HEAD
});
=======
},
});
>>>>>>> 6ed9fd3ed23dc484d7f10d563125ee5446afe181
}

138
lucy_webapp/app/static/app/js/control_BASE_10475.js

@ -0,0 +1,138 @@
/*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
var pressed_keys = new Set();
var command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = command;
}, 50)
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
if (pressed_keys.size == 0) {
command = "COMMAND_STOP";
return;
}
else if (pressed_keys.size > 2) {
command = null;
return;
}
else {
command = map_key_with_command(pressed_keys);
send_command(command)
}
}
function map_key_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
function send_command(command) {
$.post(
send_command_url,
{
command : command
},
function(response){
if (response.status == "ERROR") {
alert(response.message);
}
});
);
}

138
lucy_webapp/app/static/app/js/control_BASE_10552.js

@ -0,0 +1,138 @@
/*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
var pressed_keys = new Set();
var command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = command;
}, 50)
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
if (pressed_keys.size == 0) {
command = "COMMAND_STOP";
return;
}
else if (pressed_keys.size > 2) {
command = null;
return;
}
else {
command = map_key_with_command(pressed_keys);
send_command(command)
}
}
function map_key_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
function send_command(command) {
$.post(
send_command_url,
{
command : command
},
function(response){
if (response.status == "ERROR") {
alert(response.message);
}
});
);
}

138
lucy_webapp/app/static/app/js/control_BASE_10676.js

@ -0,0 +1,138 @@
/*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
var pressed_keys = new Set();
var command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = command;
}, 50)
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
if (pressed_keys.size == 0) {
command = "COMMAND_STOP";
return;
}
else if (pressed_keys.size > 2) {
command = null;
return;
}
else {
command = map_key_with_command(pressed_keys);
send_command(command)
}
}
function map_key_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
function send_command(command) {
$.post(
send_command_url,
{
command : command
},
function(response){
if (response.status == "ERROR") {
alert(response.message);
}
});
);
}

137
lucy_webapp/app/static/app/js/control_LOCAL_10475.js

@ -0,0 +1,137 @@
/*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
var pressed_keys = new Set();
var command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = command;
}, 50)
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
if (pressed_keys.size == 0) {
command = "COMMAND_STOP";
return;
}
else if (pressed_keys.size > 2) {
command = null;
return;
}
else {
command = map_key_with_command(pressed_keys);
send_command(command)
}
}
function map_key_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
function send_command(command) {
$.post(
send_command_url,
{
command : command
},
function(response){
if (response.status == "ERROR") {
alert(response.message);
}
});
}

137
lucy_webapp/app/static/app/js/control_LOCAL_10552.js

@ -0,0 +1,137 @@
/*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
var pressed_keys = new Set();
var command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = command;
}, 50)
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
if (pressed_keys.size == 0) {
command = "COMMAND_STOP";
return;
}
else if (pressed_keys.size > 2) {
command = null;
return;
}
else {
command = map_key_with_command(pressed_keys);
send_command(command)
}
}
function map_key_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
function send_command(command) {
$.post(
send_command_url,
{
command : command
},
function(response){
if (response.status == "ERROR") {
alert(response.message);
}
});
}

137
lucy_webapp/app/static/app/js/control_LOCAL_10676.js

@ -0,0 +1,137 @@
/*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
var pressed_keys = new Set();
var command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = command;
}, 50)
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
if (pressed_keys.size == 0) {
command = "COMMAND_STOP";
return;
}
else if (pressed_keys.size > 2) {
command = null;
return;
}
else {
command = map_key_with_command(pressed_keys);
send_command(command)
}
}
function map_key_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
function send_command(command) {
$.post(
send_command_url,
{
command : command
},
function(response){
if (response.status == "ERROR") {
alert(response.message);
}
});
}

149
lucy_webapp/app/static/app/js/control_REMOTE_10475.js

@ -0,0 +1,149 @@
/*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
var pressed_keys = new Set();
var command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = command;
}, 50)
setInterval(function(){
if (document.visibilityState == "visible") {
send_command('COMMAND_CONTINUE');
}
}, 1000);
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
if (pressed_keys.size == 0) {
command = "COMMAND_STOP";
send_command(command);
return;
}
else if (pressed_keys.size > 2) {
command = 'COMMAND_CONTINUE';
return;
}
else {
command = map_key_with_command(pressed_keys);
send_command(command);
return;
}
}
function map_key_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
function send_command(command) {
$.ajax({
headers: { "X-CSRFToken": csrf_token },
url: send_command_url,
type: 'post',
dataType: 'json',
data: {
command : command,
},
success: function(response){
if (response.status == "ERROR") {
alert(response.message);
}
},
});
}

149
lucy_webapp/app/static/app/js/control_REMOTE_10552.js

@ -0,0 +1,149 @@
/*
############
# COMMANDS #
############
COMMAND_CONTINUE
COMMAND_STOP
COMMAND_RIDE_FORWARD
COMMAND_FORWARD_STEER_LEFT
COMMAND_FORWARD_STEER_RIGHT
COMMAND_RIDE_BACKWARD
COMMAND_BACKWARD_STEER_LEFT
COMMAND_BACKWARD_STEER_RIGHT
COMMAND_TURN_LEFT
COMMAND_TURN_RIGHT
COMMAND_SEND_STATE
COMMAND_SET_PWM_BYTE
COMMAND_SET_SPEED_LEVEL
COMMAND_SET_SAFE_STOP_INTENSITY
COMMAND_SET_FREE_SPACE_MULTIPLIER
*/
var pressed_keys = new Set();
var command = null;
// pressed_keys.add("UP");
setInterval(function(){
document.getElementById("keys").innerHTML = Array.from(pressed_keys).join(' ');
}, 50);
setInterval(function(){
document.getElementById("command").innerHTML = command;
}, 50)
setInterval(function(){
if (document.visibilityState == "visible") {
send_command('COMMAND_CONTINUE');
}
}, 1000);
document.addEventListener('keydown', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.add("UP");
break;
case 'ArrowDown':
pressed_keys.add("DOWN");
break;
case 'ArrowLeft':
pressed_keys.add("LEFT");
break;
case 'ArrowRight':
pressed_keys.add("RIGHT");
break;
}
update_state();
});
document.addEventListener('keyup', function(event) {
switch (event.code){
case 'ArrowUp':
pressed_keys.delete("UP");
break;
case 'ArrowDown':
pressed_keys.delete("DOWN");
break;
case 'ArrowLeft':
pressed_keys.delete("LEFT");
break;
case 'ArrowRight':
pressed_keys.delete("RIGHT");
break;
}
update_state();
});
function update_state() {
if (pressed_keys.size == 0) {
command = "COMMAND_STOP";
send_command(command);
return;
}
else if (pressed_keys.size > 2) {
command = 'COMMAND_CONTINUE';
return;
}
else {
command = map_key_with_command(pressed_keys);
send_command(command);
return;
}
}
function map_key_with_command(pressed_keys) {
if (pressed_keys.has("UP")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_FORWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_FORWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_FORWARD_STEER_RIGHT";
else if (pressed_keys.has("DOWN")) {
return "COMMAND_STOP";
}
}
else if (pressed_keys.has("DOWN")) {
if (pressed_keys.size == 1)
return "COMMAND_RIDE_BACKWARD";
else if (pressed_keys.has("LEFT"))
return "COMMAND_BACKWARD_STEER_LEFT";
else if (pressed_keys.has("RIGHT"))
return "COMMAND_BACKWARD_STEER_RIGHT";
}
else if (pressed_keys.has("LEFT")) {
return "COMMAND_TURN_LEFT";
}
else if (pressed_keys.has("RIGHT")) {
return "COMMAND_TURN_RIGHT";
}
return null;
}
function send_command(command) {
$.ajax({
headers: { "X-CSRFToken": csrf_token },
url: send_command_url,
type: 'post',
dataType: 'json',
data: {
command : command,
},
success: function(response){
if (response.status == "ERROR") {
alert(response.message);
}
},
});
}

2
lucy_webapp/app/static/app/js/jquery3.5.1.min.js

File diff suppressed because one or more lines are too long

0
lucy_webapp/app/templatetags/__init__.py

9
lucy_webapp/app/templatetags/app_tags.py

@ -0,0 +1,9 @@
from django import template
register = template.Library()
@register.simple_tag(name="get_webcam_address", takes_context=True)
def get_webcam_address(context):
request = context['request']
return ' '.join([str(elem) for elem in request.get_host().split(':')[0:1]]) + ':90'

3
lucy_webapp/app/tests.py

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

13
lucy_webapp/app/urls.py

@ -0,0 +1,13 @@
from django.urls import path
from .views import *
app_name='app'
urlpatterns = [
path('', index_view, name="index"),
path('_send_command', recieve_command, name="send_command"),
path('_system_shutdown', system_shutdown, name="system_shutdown"),
path('_get_module_data', send_module_data, name='get_module_data'),
]

90
lucy_webapp/app/views.py

@ -0,0 +1,90 @@
from .models import *
from django.shortcuts import render
from django.http import HttpResponse, JsonResponse
from django.views.decorators.http import require_http_methods
from django.contrib.auth.decorators import login_required
from django.core.exceptions import ObjectDoesNotExist
import os
from threading import Thread
from time import sleep
from datetime import datetime, timedelta, timezone
# Create your views here.
@login_required
def index_view(request):
return render(request, 'app/index.html')
@require_http_methods(["POST"])
def recieve_command(request):
# continue only if user is logged in
if request.user.is_authenticated:
# insert command into database
try:
com_exec = CommandExecution(
command=Command.objects.get(
system_name=request.POST.get('command'),
),
value=request.POST.get('value'),
timestamp=int(request.POST.get('timestamp'))
)
print("Command %s recieved" % request.POST.get('command'))
com_exec.save()
response = {"status" : "OK", "message" : ""}
except ObjectDoesNotExist:
response = {"status" : "ERROR", "message" : "Error: Command doesn't exist"}
except ValueError:
response = {"status" : "ERROR", "message" : "Error: Uknown error"}
else:
response = {"status" : "ERROR", "message" : "Error: You must be logged in to send commands!"}
return JsonResponse(response)
def system_shutdown(request):
if request.user.is_authenticated:
try:
def shutdown_thread_function():
sleep(2)
os.system("sudo shutdown -h now")
shutdown_thread = Thread(target = shutdown_thread_function)
shutdown_thread.start()
response = HttpResponse("Ok")
except Exception as e:
response = HttpResponse("Error: %s" % e)
response.status_code = 500
else:
response = HttpResponse("Error: You are not allowed to do this!")
response.status_code = 403
return response
def get_variable_text(module_value):
if module_value.unit:
return "%s [%s]" % (module_value.variable, module_value.unit)
else:
return module_value.variable
def send_module_data(request):
newest_values = ModuleValue.objects.filter(timestamp__gte=(datetime.now(timezone.utc) - timedelta(minutes=1))).order_by('-timestamp')
if not newest_values:
return JsonResponse({ "module_data" : {} })
else:
module_data = {}
for module_value in newest_values:
# if module isn't in module data dict
if not module_value.module.display_name in module_data.keys():
module_data[module_value.module.display_name] = { get_variable_text(module_value) : module_value.value }
else:
# if module is in module data dict but the variable isn't
if not module_value.variable in module_data[module_value.module.display_name].keys():
module_data[module_value.module.display_name][get_variable_text(module_value)] = module_value.value
return JsonResponse({ "module_data" : module_data}, safe=False)

0
lucy_webapp/lucy_webapp/__init__.py

16
lucy_webapp/lucy_webapp/asgi.py

@ -0,0 +1,16 @@
"""
ASGI config for lucy_webapp project.
It exposes the ASGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/asgi/
"""
import os
from django.core.asgi import get_asgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lucy_webapp.settings')
application = get_asgi_application()

134
lucy_webapp/lucy_webapp/settings.py

@ -0,0 +1,134 @@
"""
Django settings for lucy_webapp project.
Generated by 'django-admin startproject' using Django 3.1.6.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/3.1/ref/settings/
"""
from pathlib import Path
import os
# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.1/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = '@&yqehm=^s5som$-4i^i0#jiztzg6nbg_8sm_)xx%#a1a9w2^n'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ["127.0.0.1", "192.168.1.4", "lucy.odbornaskola.cz"]
# Application definition
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'lucy_webapp',
'app',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'lucy_webapp.urls'
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')],
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'lucy_webapp.wsgi.application'
# Database
# https://docs.djangoproject.com/en/3.1/ref/settings/#databases
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': 'lucy_main',
'USER': 'lucy_webapp',
'PASSWORD': 'lucy1234',
'HOST': 'localhost',
'PORT': '',
}
}
# Password validation
# https://docs.djangoproject.com/en/3.1/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/3.1/topics/i18n/
LANGUAGE_CODE = 'cs'
TIME_ZONE = 'Europe/Prague'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/3.1/howto/static-files/
STATIC_URL = '/static/'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
LOGIN_REDIRECT_URL = '/'
LOGOUT_REDIRECT_URL = 'login'
WEBCAM_SERVER_PORT = 90

27
lucy_webapp/lucy_webapp/urls.py

@ -0,0 +1,27 @@
"""lucy_webapp URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/3.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
app_name = 'lucy_webapp'
urlpatterns = [
path('', include('app.urls', 'app')),
path('admin/', admin.site.urls),
path('accounts/', include('django.contrib.auth.urls')),
]

16
lucy_webapp/lucy_webapp/wsgi.py

@ -0,0 +1,16 @@
"""
WSGI config for lucy_webapp project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/3.1/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lucy_webapp.settings')
application = get_wsgi_application()

22
lucy_webapp/manage.py

@ -0,0 +1,22 @@
#!/usr/bin/env python
"""Django's command-line utility for administrative tasks."""
import os
import sys
def main():
"""Run administrative tasks."""
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'lucy_webapp.settings')
try:
from django.core.management import execute_from_command_line
except ImportError as exc:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
) from exc
execute_from_command_line(sys.argv)
if __name__ == '__main__':
main()

29
lucy_webapp/nginx/lucy_webapp.conf

@ -0,0 +1,29 @@
http {
# ...
upstream lucy_webapp {
server 127.0.0.1:8000;
}
server {
listen 80;
server_name _;
root /home/pi/dev_lucy/Lucy/lucy_webapp;
location / {
index index.html;
}
location /staticfiles/ {
alias /home/pi/dev_lucy/Lucy/lucy_webapp/staticfiles;
}
location /main {
include /etc/nginx/uwsgi_params;
uwsgi_pass lucy_webapp;
uwsgi_param Host $host;
uwsgi_param X-Real-IP $remote_addr;
uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
}
}
}

2
lucy_webapp/start.sh

@ -0,0 +1,2 @@
#!/bin/bash
python3 manage.py runserver 192.168.1.4:8000

16
lucy_webapp/stop.txt

@ -0,0 +1,16 @@
+++ readlink -f /home/pi/dev_lucy/RPi_Cam_Web_Interface/./stop.sh
++ dirname /home/pi/dev_lucy/RPi_Cam_Web_Interface/stop.sh
+ cd /home/pi/dev_lucy/RPi_Cam_Web_Interface
+ source ./config.txt
++ rpicamdir=html
++ webserver=apache
++ webport=80
++ user=
++ webpasswd=
++ autostart=yes
++ jpglink=no
++ phpversion=7.3
+ fn_stop
+ sudo killall raspimjpeg
+ sudo killall php
+ sudo killall motion

194
lucy_webapp/templates/app/index.html

@ -0,0 +1,194 @@
<!DOCTYPE html>
<html lang="cs">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<title>Lucy - ovládací panel</title>
{% load static app_tags %}
<link rel="stylesheet" type="text/css" href="{% static 'app/bootstrap-5.0.0-beta3-dist/css/bootstrap.min.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'app/css/style.css'%}">
<link rel="shortcut icon" type="image/png" href="{% static 'app/img/favicon.ico' %}"/>
</head>
<body class="bg-light">
<nav class="navbar navbar-dark bg-dark">
<div class="container-fluid">
<a class="navbar-brand" href="#">Lucy - ovládací panel</a>
<button class="navbar-toggler collapsed" type="button" data-bs-toggle="collapse" data-bs-target="#navbar" aria-controls="navbar" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="navbar-collapse collapse" id="navbar" style="">
<ul class="navbar-nav me-auto mb-2">
<li class="nav-item">
<a class="nav-link active" aria-current="page" href="#">Ovládací panel</a>
</li>
<li class="nav-item">
<a class="nav-link" href="{% url 'admin:index' %}" target="_blank">Admin</a>
</li>
<li class="nav-item">
<button class="btn btn-danger mb-1" data-bs-toggle="modal" data-bs-target="#system_shutdown_confirm-modal">Vypnout systém</button>
</li>
<li class="nav-item">
<button class="btn btn-outline-light" type="submit" onclick="location.href='{% url "logout" %}'">Odhlásit se</button>
</li>
</ul>
</div>
</div>
</nav>
<div id="content" class="container-fluid">
<div class="row">
<div id="debug" style="display: none;">
<h5>Debug</h5>
<div>Pressed keys: <span id="keys" style="height: 20px;"></span></div>
<div>Last command: <span id="command"></span></div>
<div>Response: <span id="response"></span></div>
<div>Response time: <span id="response-time"></div>
</div>
<div id="camera" class="col-lg-6 col-md-12 col-sm-12">
<img id="camera__img" src="https://lucy-cam.odbornaskola.cz/stream.mjpg" width="640px" height="480px" class="shadow" style="transform:rotate(180deg);"/>
</div>
<div id="movement-control" class="col-lg-3 col-md-6 col-sm-6">
<div id="power">
<input type="range" min="1" max="255" value="70" class="slider" id="powerSlider"oninput="this.parentNode.style.setProperty('--value',this.value); this.parentNode.style.setProperty('--text-value', JSON.stringify((+this.value).toLocaleString()))">
<output></output>
<div class='range-slider__progress'></div>
<p>Výkon: <span id="powerSliderValue"></span></p>
</div>
<div id="arrows">
<div id="arrows__grid">
<div>
<button type="button" class="btn btn-secondary btn--arrow" value="COMMAND_FORWARD_STEER_LEFT">
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-arrow-up-left arrows__arrow unclickable" viewBox="0 0 16 16">
<path class="unclickable" fill-rule="evenodd" d="M2 2.5a.5.5 0 0 1 .5-.5h6a.5.5 0 0 1 0 1H3.707l10.147 10.146a.5.5 0 0 1-.708.708L3 3.707V8.5a.5.5 0 0 1-1 0v-6z"/>
</svg>
</button>
</div>
<div>
<button type="button" class="btn btn-secondary btn--arrow" value="COMMAND_RIDE_FORWARD">
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-arrow-up arrows__arrow unclickable" viewBox="0 0 16 16">
<path class="unclickable" fill-rule="evenodd" d="M8 15a.5.5 0 0 0 .5-.5V2.707l3.146 3.147a.5.5 0 0 0 .708-.708l-4-4a.5.5 0 0 0-.708 0l-4 4a.5.5 0 1 0 .708.708L7.5 2.707V14.5a.5.5 0 0 0 .5.5z"/>
</svg>
</button>
</div>
<div>
<button type="button" class="btn btn-secondary btn--arrow" value="COMMAND_FORWARD_STEER_RIGHT">
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-arrow-up-right arrows__arrow unclickable" viewBox="0 0 16 16">
<path class="unclickable" fill-rule="evenodd" d="M14 2.5a.5.5 0 0 0-.5-.5h-6a.5.5 0 0 0 0 1h4.793L2.146 13.146a.5.5 0 0 0 .708.708L13 3.707V8.5a.5.5 0 0 0 1 0v-6z"/>
</svg>
</button>
</div>
<div>
<button type="button" class="btn btn-secondary btn--arrow" value="COMMAND_TURN_LEFT">
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-arrow-left arrows__arrow unclickable" viewBox="0 0 16 16">
<path class="unclickable" fill-rule="evenodd" d="M15 8a.5.5 0 0 0-.5-.5H2.707l3.147-3.146a.5.5 0 1 0-.708-.708l-4 4a.5.5 0 0 0 0 .708l4 4a.5.5 0 0 0 .708-.708L2.707 8.5H14.5A.5.5 0 0 0 15 8z"/>
</svg>
</button>
</div>
<div>
<button type="button" class="btn btn-secondary btn--arrow" value="COMMAND_STOP">
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-record-circle arrows__arrow unclickable" viewBox="0 0 16 16">
<path class="unclickable" d="M8 15A7 7 0 1 1 8 1a7 7 0 0 1 0 14zm0 1A8 8 0 1 0 8 0a8 8 0 0 0 0 16z"/>
<path class="unclickable" d="M11 8a3 3 0 1 1-6 0 3 3 0 0 1 6 0z"/>
</svg>
</button>
</div>
<div>
<button type="button" class="btn btn-secondary btn--arrow" value="COMMAND_TURN_RIGHT">
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-arrow-right arrows__arrow unclickable" viewBox="0 0 16 16">
<path class="unclickable" fill-rule="evenodd" d="M1 8a.5.5 0 0 1 .5-.5h11.793l-3.147-3.146a.5.5 0 0 1 .708-.708l4 4a.5.5 0 0 1 0 .708l-4 4a.5.5 0 0 1-.708-.708L13.293 8.5H1.5A.5.5 0 0 1 1 8z"/>
</svg>
</button>
</div>
<div>
<button type="button" class="btn btn-secondary btn--arrow" value="COMMAND_BACKWARD_STEER_LEFT">
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-arrow-down-left arrows__arrow unclickable" viewBox="0 0 16 16">
<path class="unclickable" fill-rule="evenodd" d="M2 13.5a.5.5 0 0 0 .5.5h6a.5.5 0 0 0 0-1H3.707L13.854 2.854a.5.5 0 0 0-.708-.708L3 12.293V7.5a.5.5 0 0 0-1 0v6z"/>
</svg>
</button>
</div>
<div>
<button type="button" class="btn btn-secondary btn--arrow" value="COMMAND_RIDE_BACKWARD">
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-arrow-down arrows__arrow unclickable" viewBox="0 0 16 16">
<path class="unclickable" fill-rule="evenodd" d="M8 1a.5.5 0 0 1 .5.5v11.793l3.146-3.147a.5.5 0 0 1 .708.708l-4 4a.5.5 0 0 1-.708 0l-4-4a.5.5 0 0 1 .708-.708L7.5 13.293V1.5A.5.5 0 0 1 8 1z"></path>
</svg>
</button>
</div>
<div>
<button type="button" class="btn btn-secondary btn--arrow" value="COMMAND_BACKWARD_STEER_RIGHT">
<svg xmlns="http://www.w3.org/2000/svg" fill="currentColor" class="bi bi-arrow-down-right arrows__arrow unclickable" viewBox="0 0 16 16">
<path class="unclickable" fill-rule="evenodd" d="M14 13.5a.5.5 0 0 1-.5.5h-6a.5.5 0 0 1 0-1h4.793L2.146 2.854a.5.5 0 1 1 .708-.708L13 12.293V7.5a.5.5 0 0 1 1 0v6z"/>
</svg>
</button>
</div>
</div>
</div>
</div>
<div id="module-data" class="col-lg-2 col-md-6 col-sm-6 shadow bg-info rounded">
<h3 class="border-bottom border-dark">Data z modulů</h3>
<div id="module-data__content"></div>
</div>
</div>
</div>
<!-- MODALS -->
<div id="system_shutdown-modal" class="modal hide fade in" tabindex="-1">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Vypínání systému</h5>
</button>
</div>
<div class="modal-body">
<div id="system_shutdown-modal__waiting">
<p>Probíhá vypínání systému, nevypínejte vozítko.</p>
<p id="system_shutdown-modal__countdown"></p>
</div>
<div id="system_shutdown-modal__ready">
<p>Nyní můžete vozítko vypnout.</p>
</div>
</div>
</div>
</div>
</div>
<div id="system_shutdown_confirm-modal" class="modal" tabindex="-1">
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Vypnout systém</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>Opravdu si přejete vypnout operační systém vozítka?</p>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Zavřít</button>
<button id="btn-system_shutdown_confirm" type="button" class="btn btn-primary">Vypnout systém</button>
</div>
</div>
</div>
</div>
<script type="text/javascript" src="{% static 'app/js/jquery3.5.1.min.js' %}"></script>
<script type="text/javascript" src="{% static 'app/bootstrap-5.0.0-beta3-dist/js/bootstrap.min.js' %}"></script>
<script type="text/javascript">
var send_command_url = "{% url 'app:send_command' %}";
var csrf_token = "{{ csrf_token }}";
var host = "https://lucy-cam.odbornaskola.cz";
setInterval(function(){
document.getElementById("camera__img").src = "https://lucy-cam.odbornaskola.cz/stream.mjpg";
}, 2000)
</script>
<script type="text/javascript" src="{% static 'app/js/control.js?v=1.1' %}"></script>
</body>
</html>

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

Loading…
Cancel
Save