mirror of
https://github.com/daniviga/django-ram.git
synced 2025-08-04 13:17:50 +02:00
Refactor communication to daemon
This commit is contained in:
@@ -4,41 +4,45 @@ from driver.models import DriverConfiguration
|
|||||||
|
|
||||||
|
|
||||||
class Connector:
|
class Connector:
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.config = DriverConfiguration.get_solo()
|
self.config = DriverConfiguration.get_solo()
|
||||||
|
|
||||||
def __send_data(self, message):
|
def __send_data(self, message):
|
||||||
# to be encoded
|
resp = b''
|
||||||
|
# convert to binary if str is received
|
||||||
|
if isinstance(message, str):
|
||||||
|
message = message.encode()
|
||||||
|
|
||||||
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
|
||||||
sock.connect((self.config.remote_host, self.config.remote_port))
|
sock.connect((self.config.remote_host, self.config.remote_port))
|
||||||
|
sock.settimeout(self.config.timeout / 1000) # milliseconds
|
||||||
sock.sendall(message)
|
sock.sendall(message)
|
||||||
resp = sock.recv(1024)
|
while True:
|
||||||
|
try:
|
||||||
print(resp)
|
resp += sock.recv(1024)
|
||||||
return True
|
except socket.timeout:
|
||||||
|
break
|
||||||
|
return resp
|
||||||
|
|
||||||
def passthrough(self, data):
|
def passthrough(self, data):
|
||||||
self.__send_data(data)
|
return self.__send_data(data)
|
||||||
|
|
||||||
def ops(self, address, data, function=False):
|
def ops(self, address, data, function=False):
|
||||||
if function:
|
if function:
|
||||||
message = "<F {0} {1} {2}>".format(address, data['function'],
|
message = "<F {0} {1} {2}>".format(
|
||||||
data['state'])
|
address, data['function'], data['state'])
|
||||||
else:
|
else:
|
||||||
message = "<t 1 {0} {1} {2}>".format(address, data['speed'],
|
message = "<t 1 {0} {1} {2}>".format(
|
||||||
data['direction'])
|
address, data['speed'], data['direction'])
|
||||||
self.__send_data(message)
|
self.__send_data(message)
|
||||||
return True
|
|
||||||
|
|
||||||
def infra(self, data):
|
def infra(self, data):
|
||||||
power = data['power']
|
|
||||||
if "track" in data:
|
if "track" in data:
|
||||||
track = " {}".forma(data['track'].upper())
|
track = " {}".format(data["track"].upper())
|
||||||
else:
|
else:
|
||||||
track = ""
|
track = ""
|
||||||
|
|
||||||
if power:
|
if data["power"]:
|
||||||
self.__send_data('<1{}>'.format(track))
|
self.__send_data('<1{}>'.format(track))
|
||||||
else:
|
else:
|
||||||
self.__send_data('<0{}>'.format(track))
|
self.__send_data('<0{}>'.format(track))
|
||||||
|
@@ -0,0 +1,22 @@
|
|||||||
|
# Generated by Django 4.0 on 2022-01-03 19:53
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('driver', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterModelOptions(
|
||||||
|
name='driverconfiguration',
|
||||||
|
options={'verbose_name': 'Configuration'},
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='driverconfiguration',
|
||||||
|
name='timeout',
|
||||||
|
field=models.SmallIntegerField(default=250),
|
||||||
|
),
|
||||||
|
]
|
@@ -6,9 +6,10 @@ class DriverConfiguration(SingletonModel):
|
|||||||
remote_host = models.GenericIPAddressField(
|
remote_host = models.GenericIPAddressField(
|
||||||
protocol="IPv4", default="192.168.4.1")
|
protocol="IPv4", default="192.168.4.1")
|
||||||
remote_port = models.SmallIntegerField(default=2560)
|
remote_port = models.SmallIntegerField(default=2560)
|
||||||
|
timeout = models.SmallIntegerField(default=250)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "Driver Configuration"
|
return "Configuration"
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name = "Driver Configuration"
|
verbose_name = "Configuration"
|
||||||
|
@@ -13,5 +13,6 @@ class CabSerializer(serializers.Serializer):
|
|||||||
|
|
||||||
class InfraSerializer(serializers.Serializer):
|
class InfraSerializer(serializers.Serializer):
|
||||||
power = serializers.BooleanField(required=True)
|
power = serializers.BooleanField(required=True)
|
||||||
track = serializers.ChoiceField(choices=('main', 'prog', 'join'),
|
track = serializers.ChoiceField(
|
||||||
required=False)
|
choices=('main', 'prog', 'join', 'MAIN', 'PROG', 'JOIN'),
|
||||||
|
required=False)
|
||||||
|
@@ -1,7 +1,6 @@
|
|||||||
from django.views import View
|
from django.http import Http404
|
||||||
from django.http import HttpResponse, Http404
|
|
||||||
from django.utils.decorators import method_decorator
|
from django.utils.decorators import method_decorator
|
||||||
from rest_framework import status
|
from rest_framework import status, serializers
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
|
|
||||||
@@ -11,8 +10,6 @@ from driver.serializers import (
|
|||||||
FunctionSerializer, CabSerializer, InfraSerializer)
|
FunctionSerializer, CabSerializer, InfraSerializer)
|
||||||
from roster.models import Cab as CabModel
|
from roster.models import Cab as CabModel
|
||||||
|
|
||||||
conn = Connector()
|
|
||||||
|
|
||||||
|
|
||||||
def addresschecker(f):
|
def addresschecker(f):
|
||||||
def addresslookup(request, address, *args):
|
def addresslookup(request, address, *args):
|
||||||
@@ -29,8 +26,15 @@ class SendCommand(APIView):
|
|||||||
|
|
||||||
def put(self, request):
|
def put(self, request):
|
||||||
data = request.data
|
data = request.data
|
||||||
conn.passthrough(data)
|
if not data:
|
||||||
return Response(data,
|
raise serializers.ValidationError({
|
||||||
|
"error": "a string is expected"})
|
||||||
|
cmd = data.decode().strip()
|
||||||
|
if not (cmd.startswith("<") and cmd.endswith(">")):
|
||||||
|
raise serializers.ValidationError({
|
||||||
|
"error": "please provide a valid command"})
|
||||||
|
response = Connector().passthrough(cmd)
|
||||||
|
return Response({"response": response.decode()},
|
||||||
status=status.HTTP_202_ACCEPTED)
|
status=status.HTTP_202_ACCEPTED)
|
||||||
|
|
||||||
|
|
||||||
@@ -39,7 +43,7 @@ class Function(APIView):
|
|||||||
def put(self, request, address):
|
def put(self, request, address):
|
||||||
serializer = FunctionSerializer(data=request.data)
|
serializer = FunctionSerializer(data=request.data)
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
conn.ops(address, serializer.data, function=True)
|
Connector().ops(address, serializer.data, function=True)
|
||||||
return Response(serializer.data,
|
return Response(serializer.data,
|
||||||
status=status.HTTP_202_ACCEPTED)
|
status=status.HTTP_202_ACCEPTED)
|
||||||
|
|
||||||
@@ -52,7 +56,7 @@ class Cab(APIView):
|
|||||||
def put(self, request, address):
|
def put(self, request, address):
|
||||||
serializer = CabSerializer(data=request.data)
|
serializer = CabSerializer(data=request.data)
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
conn.ops(address, serializer.data)
|
Connector().ops(address, serializer.data)
|
||||||
return Response(serializer.data,
|
return Response(serializer.data,
|
||||||
status=status.HTTP_202_ACCEPTED)
|
status=status.HTTP_202_ACCEPTED)
|
||||||
|
|
||||||
@@ -64,7 +68,7 @@ class Infra(APIView):
|
|||||||
def put(self, request):
|
def put(self, request):
|
||||||
serializer = InfraSerializer(data=request.data)
|
serializer = InfraSerializer(data=request.data)
|
||||||
if serializer.is_valid():
|
if serializer.is_valid():
|
||||||
conn.infra(serializer.data)
|
Connector().infra(serializer.data)
|
||||||
return Response(serializer.data,
|
return Response(serializer.data,
|
||||||
status=status.HTTP_202_ACCEPTED)
|
status=status.HTTP_202_ACCEPTED)
|
||||||
|
|
||||||
@@ -72,11 +76,13 @@ class Infra(APIView):
|
|||||||
status=status.HTTP_400_BAD_REQUEST)
|
status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
|
|
||||||
class Emergency(View):
|
class Emergency(APIView):
|
||||||
def put(self, request):
|
def put(self, request):
|
||||||
conn.emergency()
|
Connector().emergency()
|
||||||
return HttpResponse()
|
return Response({"response": "emergency stop"},
|
||||||
|
status=status.HTTP_202_ACCEPTED)
|
||||||
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
conn.emergency()
|
Connector().emergency()
|
||||||
return HttpResponse()
|
return Response({"response": "emergency stop"},
|
||||||
|
status=status.HTTP_202_ACCEPTED)
|
||||||
|
Reference in New Issue
Block a user