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 type checker
.pyre/ .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.messages',
'django.contrib.staticfiles', 'django.contrib.staticfiles',
'django_countries', 'django_countries',
'rest_framework',
'dcc', 'dcc',
'driver',
'roster', 'roster',
] ]
@@ -47,7 +49,7 @@ MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware', 'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware', 'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware', # 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware', 'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware',

View File

@@ -16,8 +16,27 @@ Including another URLconf
from django.conf import settings from django.conf import settings
from django.conf.urls.static import static from django.conf.urls.static import static
from django.contrib import admin from django.contrib import admin
from django.urls import path from django.urls import include, path
from driver import urls as driver_urls
urlpatterns = [ urlpatterns = [
path('admin/', admin.site.urls), path('admin/', admin.site.urls),
path('dcc/', include(driver_urls)),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ] + 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) purchase_date = models.DateField(null=True, blank=True)
image = models.ImageField( image = models.ImageField(
upload_to='images/', upload_to='media/images/',
null=True, null=True,
blank=True) blank=True)
notes = models.TextField(blank=True) notes = models.TextField(blank=True)