Add driver app

This commit is contained in:
2021-12-18 00:33:46 +01:00
parent 5bab2243bf
commit a6005615e0
18 changed files with 201 additions and 3 deletions

2
.gitignore vendored
View File

@@ -127,3 +127,5 @@ dmypy.json
# Pyre type checker
.pyre/
dcc/media

8
dcc/dcc/parsers.py Normal file
View File

@@ -0,0 +1,8 @@
from rest_framework.parsers import BaseParser
class PlainTextParser(BaseParser):
media_type = 'text/plain'
def parse(self, stream, media_type=None, parser_context=None):
return stream.read()

View File

@@ -39,7 +39,9 @@ INSTALLED_APPS = [
'django.contrib.messages',
'django.contrib.staticfiles',
'django_countries',
'rest_framework',
'dcc',
'driver',
'roster',
]
@@ -47,7 +49,7 @@ MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',

View File

@@ -16,8 +16,27 @@ Including another URLconf
from django.conf import settings
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import path
from django.urls import include, path
from driver import urls as driver_urls
urlpatterns = [
path('admin/', admin.site.urls),
path('dcc/', include(driver_urls)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# if settings.DEBUG:
# from django.views.generic import TemplateView
# from rest_framework.schemas import get_schema_view
#
# urlpatterns += [
# path('swagger/', TemplateView.as_view(
# template_name='swagger.html',
# extra_context={'schema_url': 'openapi-schema'}
# ), name='swagger'),
# path('openapi', get_schema_view(
# title="BITE - A Basic/IoT/Example",
# description="BITE API for IoT",
# version="1.0.0"
# ), name='openapi-schema'),
# ]

Binary file not shown.

BIN
dcc/driver/.views.py.swp Normal file

Binary file not shown.

0
dcc/driver/__init__.py Normal file
View File

3
dcc/driver/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
dcc/driver/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class DriverConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'driver'

35
dcc/driver/connector.py Normal file
View File

@@ -0,0 +1,35 @@
class Connector:
@classmethod
def __mqtt_pub(self, message):
# to be encoded
print(message)
return True
def passthrough(self, address, data):
self.__mqtt_pub(data)
def ops(self, address, data, function=False):
if function:
message = "<F {0} {1} {2}>".format(address, data['function'],
data['state'])
else:
message = "<t 1 {0} {1} {2}>".format(address, data['speed'],
data['direction'])
self.__mqtt_pub(message)
return True
def infra(self, data):
power = data['power']
if "track" in data:
track = " {}".forma(data['track'].upper())
else:
track = ""
if power:
self.__mqtt_pub('<1{}>'.format(track))
else:
self.__mqtt_pub('<0{}>'.format(track))
def emergency(self):
self.__mqtt_pub('<!>')

View File

3
dcc/driver/models.py Normal file
View File

@@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

17
dcc/driver/serializers.py Normal file
View File

@@ -0,0 +1,17 @@
from rest_framework import serializers
class FunctionSerializer(serializers.Serializer):
function = serializers.IntegerField(required=True)
state = serializers.IntegerField(required=True)
class CabSerializer(serializers.Serializer):
speed = serializers.IntegerField(required=True)
direction = serializers.IntegerField(required=True)
class InfraSerializer(serializers.Serializer):
power = serializers.BooleanField(required=True)
track = serializers.ChoiceField(choices=('main', 'prog', 'join'),
required=False)

3
dcc/driver/tests.py Normal file
View File

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

10
dcc/driver/urls.py Normal file
View File

@@ -0,0 +1,10 @@
from django.urls import path
from driver.views import SendCommand, Function, Cab, Emergency, Infra
urlpatterns = [
path('emergency', Emergency.as_view()),
path('infra', Infra.as_view()),
path('<int:address>/command', SendCommand.as_view()),
path('<int:address>/cab', Cab.as_view()),
path('<int:address>/function', Function.as_view()),
]

68
dcc/driver/views.py Normal file
View File

@@ -0,0 +1,68 @@
from django.views import View
from django.http import HttpResponse
from driver.serializers import (
FunctionSerializer, CabSerializer, InfraSerializer)
from rest_framework import status
from rest_framework.views import APIView
from rest_framework.response import Response
from dcc.parsers import PlainTextParser
from driver.connector import Connector
conn = Connector()
class SendCommand(APIView):
parser_classes = [PlainTextParser]
def put(self, request, address):
data = request.data
conn.passthrough(address, data)
return Response(data,
status=status.HTTP_202_ACCEPTED)
class Function(APIView):
def put(self, request, address):
serializer = FunctionSerializer(data=request.data)
if serializer.is_valid():
conn.ops(address, serializer.data, function=True)
return Response(serializer.data,
status=status.HTTP_202_ACCEPTED)
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
class Cab(APIView):
def put(self, request, address):
serializer = CabSerializer(data=request.data)
if serializer.is_valid():
conn.ops(address, serializer.data)
return Response(serializer.data,
status=status.HTTP_202_ACCEPTED)
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
class Infra(APIView):
def put(self, request):
serializer = InfraSerializer(data=request.data)
if serializer.is_valid():
conn.infra(serializer.data)
return Response(serializer.data,
status=status.HTTP_202_ACCEPTED)
return Response(serializer.errors,
status=status.HTTP_400_BAD_REQUEST)
class Emergency(View):
def put(self, request):
conn.emergency()
return HttpResponse()
def get(self, request):
conn.emergency()
return HttpResponse()

View File

@@ -0,0 +1,22 @@
# Generated by Django 4.0 on 2021-12-17 23:21
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('roster', '0013_cab_company'),
]
operations = [
migrations.AlterModelOptions(
name='company',
options={'verbose_name_plural': 'Companies'},
),
migrations.AlterField(
model_name='cab',
name='image',
field=models.ImageField(blank=True, null=True, upload_to='media/images/'),
),
]

View File

@@ -61,7 +61,7 @@ class Cab(models.Model):
purchase_date = models.DateField(null=True, blank=True)
image = models.ImageField(
upload_to='images/',
upload_to='media/images/',
null=True,
blank=True)
notes = models.TextField(blank=True)