
117 changed files with 63371 additions and 0 deletions
After Width: | Height: | Size: 210 KiB |
@ -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) |
@ -0,0 +1,5 @@ |
|||
from django.apps import AppConfig |
|||
|
|||
|
|||
class AppConfig(AppConfig): |
|||
name = 'app' |
@ -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')), |
|||
], |
|||
), |
|||
] |
@ -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(), |
|||
), |
|||
] |
@ -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, |
|||
), |
|||
] |
@ -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), |
|||
), |
|||
] |
@ -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), |
|||
), |
|||
] |
@ -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), |
|||
), |
|||
] |
@ -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 = [ |
|||
] |
@ -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', |
|||
), |
|||
] |
@ -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, |
|||
), |
|||
] |
@ -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(), |
|||
), |
|||
] |
@ -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')), |
|||
], |
|||
), |
|||
] |
@ -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', |
|||
), |
|||
] |
@ -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), |
|||
), |
|||
] |
@ -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), |
|||
), |
|||
] |
@ -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, |
|||
), |
|||
] |
@ -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,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) |
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -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 */ |
File diff suppressed because one or more lines are too long
@ -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 */ |
File diff suppressed because one or more lines are too long
@ -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 */ |
File diff suppressed because one or more lines are too long
@ -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 */ |
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -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; |
|||
}*/*/*/ |
@ -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; |
|||
} |
After Width: | Height: | Size: 15 KiB |
After Width: | Height: | Size: 560 KiB |
After Width: | Height: | Size: 1.5 MiB |
@ -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(); |
|||
} |
|||
} |
@ -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); |
|||
} |
|||
}); |
|||
} |
@ -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); |
|||
} |
|||
}, |
|||
}); |
|||
} |
@ -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(); |
|||
// } |
@ -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 |
|||
} |
@ -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); |
|||
} |
|||
}); |
|||
); |
|||
} |
@ -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); |
|||
} |
|||
}); |
|||
); |
|||
} |
@ -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); |
|||
} |
|||
}); |
|||
); |
|||
} |
@ -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); |
|||
} |
|||
}); |
|||
} |
@ -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); |
|||
} |
|||
}); |
|||
} |
@ -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); |
|||
} |
|||
}); |
|||
} |
@ -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); |
|||
} |
|||
}, |
|||
}); |
|||
} |
@ -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); |
|||
} |
|||
}, |
|||
}); |
|||
} |
File diff suppressed because one or more lines are too long
@ -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' |
@ -0,0 +1,3 @@ |
|||
from django.test import TestCase |
|||
|
|||
# Create your tests here. |
@ -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'), |
|||
] |
@ -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,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() |
@ -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 |
@ -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')), |
|||
] |
@ -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() |
@ -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() |
@ -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; |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,2 @@ |
|||
#!/bin/bash |
|||
python3 manage.py runserver 192.168.1.4:8000 |
@ -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 |
@ -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…
Reference in new issue