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
View File
@@ -127,3 +127,5 @@ dmypy.json
# Pyre type checker # Pyre type checker
.pyre/ .pyre/
dcc/media
+8
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()
+3 -1
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',
+20 -1
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.
Binary file not shown.
View File
+3
View File
@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class DriverConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'driver'
+35
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
View File
@@ -0,0 +1,3 @@
from django.db import models
# Create your models here.
+17
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
View File
@@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.
+10
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
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()
@@ -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/'),
),
]
+1 -1
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)