diff --git a/client_s2/.gitignore b/client_s2/.gitignore new file mode 100644 index 0000000..bf3e4d7 --- /dev/null +++ b/client_s2/.gitignore @@ -0,0 +1,312 @@ +# Created by https://www.toptal.com/developers/gitignore/api/macos,python,pycharm +# Edit at https://www.toptal.com/developers/gitignore?templates=macos,python,pycharm + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### PyCharm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### PyCharm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# End of https://www.toptal.com/developers/gitignore/api/macos,python,pycharm diff --git a/client_s2/compLib/.gitignore b/client_s2/compLib/.gitignore new file mode 100644 index 0000000..b612971 --- /dev/null +++ b/client_s2/compLib/.gitignore @@ -0,0 +1,312 @@ +# Created by https://www.toptal.com/developers/gitignore/api/macos,python,pycharm +# Edit at https://www.toptal.com/developers/gitignore?templates=macos,python,pycharm + +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + +### PyCharm ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### PyCharm Patch ### +# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 + +# *.iml +# modules.xml +# .idea/misc.xml +# *.ipr + +# Sonarlint plugin +# https://plugins.jetbrains.com/plugin/7973-sonarlint +.idea/**/sonarlint/ + +# SonarQube Plugin +# https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin +.idea/**/sonarIssues.xml + +# Markdown Navigator plugin +# https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced +.idea/**/markdown-navigator.xml +.idea/**/markdown-navigator-enh.xml +.idea/**/markdown-navigator/ + +# Cache file creation bug +# See https://youtrack.jetbrains.com/issue/JBR-2257 +.idea/$CACHE_FILE$ + +# CodeStream plugin +# https://plugins.jetbrains.com/plugin/12206-codestream +.idea/codestream.xml + +# Azure Toolkit for IntelliJ plugin +# https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij +.idea/**/azureSettings.xml + +### Python ### +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +#.idea/ + +# End of https://www.toptal.com/developers/gitignore/api/macos,python,pycharm \ No newline at end of file diff --git a/client_s2/compLib/CompLib.proto b/client_s2/compLib/CompLib.proto index 8185499..1af66ad 100644 --- a/client_s2/compLib/CompLib.proto +++ b/client_s2/compLib/CompLib.proto @@ -58,16 +58,24 @@ message IRSensorsReadAllResponse { repeated uint32 data = 3 [packed = true]; } +message MotorSetPowerRequest { + uint32 port = 1; + double power = 2; +} + message MotorsSetPowerRequest { Header header = 1; - uint32 port = 2; - double power = 3; + repeated MotorSetPowerRequest requests = 2; +} + +message MotorSetSpeedRequest { + uint32 port = 1; + double speed = 2; } message MotorsSetSpeedRequest { Header header = 1; - uint32 port = 2; - double speed = 3; + repeated MotorSetSpeedRequest requests = 2; } message OdometryReadRequest { @@ -98,4 +106,8 @@ message DriveRequest { Header header = 1; double linear_velocity_m_s = 2; double angular_velocity_rad_s = 3; +} + +message HealthUpdateRequest { + Header header = 1; } \ No newline at end of file diff --git a/client_s2/compLib/CompLibClient.py b/client_s2/compLib/CompLibClient.py index 00599c9..dcc9871 100644 --- a/client_s2/compLib/CompLibClient.py +++ b/client_s2/compLib/CompLibClient.py @@ -1,30 +1,65 @@ import socket +from threading import Lock import compLib.CompLib_pb2 as CompLib_pb2 -UNIX_SOCKET_PATH = "/tmp/compLib" -TCP_SOCKET_HOST = "192.168.0.151" -TCP_SOCKET_PORT = 9090 - class CompLibClient(object): + USE_UNIX_SOCKET = False + UNIX_SOCKET_PATH = "/tmp/compLib" + USE_TCP_SOCKET = False + TCP_SOCKET_HOST = "10.20.5.1" + TCP_SOCKET_PORT = 9090 + SOCKET = None + LOCK = Lock() + + @staticmethod + def use_unix_socket(socket_path="/tmp/compLib"): + CompLibClient.UNIX_SOCKET_PATH = socket_path + CompLibClient.USE_UNIX_SOCKET = True + CompLibClient.USE_TCP_SOCKET = False + + CompLibClient.SOCKET = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + CompLibClient.SOCKET.connect(CompLibClient.UNIX_SOCKET_PATH) + + from compLib.HealthCheck import HealthUpdater + HealthUpdater.start() + + @staticmethod + def use_tcp_socket(socket_host, socket_port=TCP_SOCKET_PORT): + CompLibClient.TCP_SOCKET_HOST = socket_host + CompLibClient.TCP_SOCKET_PORT = socket_port + CompLibClient.USE_UNIX_SOCKET = False + CompLibClient.USE_TCP_SOCKET = True + + CompLibClient.SOCKET = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + CompLibClient.SOCKET.connect((CompLibClient.TCP_SOCKET_HOST, CompLibClient.TCP_SOCKET_PORT)) + + from compLib.HealthCheck import HealthUpdater + HealthUpdater.start() @staticmethod def send(data: bytes, size: int) -> bytes: - with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock: - sock.connect((TCP_SOCKET_HOST, TCP_SOCKET_PORT)) + with CompLibClient.LOCK: + # if CompLibClient.USE_TCP_SOCKET: + # sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) + # sock.connect((CompLibClient.TCP_SOCKET_HOST, CompLibClient.TCP_SOCKET_PORT)) + # + # elif CompLibClient.USE_UNIX_SOCKET: + # sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) + # sock.connect(CompLibClient.UNIX_SOCKET_PATH) + # + # else: + # return bytes(0) - # with socket.socket(socket.AF_UNIX, socket.SOCK_STREAM) as sock: - # sock.connect(UNIX_SOCKET_PATH) + CompLibClient.SOCKET.sendall(size.to_bytes(1, byteorder='big')) + CompLibClient.SOCKET.sendall(data) - sock.sendall(size.to_bytes(1, byteorder='big')) - sock.sendall(data) - - response_size_bytes = sock.recv(1) + response_size_bytes = CompLibClient.SOCKET.recv(1) response_size = int.from_bytes(response_size_bytes, byteorder="big") # print(response_size) - response_bytes = sock.recv(response_size) + response_bytes = CompLibClient.SOCKET.recv(response_size) # print(response_bytes.hex()) # print(len(response_bytes)) @@ -34,7 +69,7 @@ class CompLibClient(object): @staticmethod def check_response(response_bytes: bytes) -> bool: - print(f"{response_bytes}") + # print(f"{response_bytes}") res = CompLib_pb2.GenericResponse() res.ParseFromString(response_bytes) diff --git a/client_s2/compLib/CompLib_pb2.py b/client_s2/compLib/CompLib_pb2.py index ebe2d4c..2b76409 100644 --- a/client_s2/compLib/CompLib_pb2.py +++ b/client_s2/compLib/CompLib_pb2.py @@ -1,220 +1,1069 @@ # -*- coding: utf-8 -*- # Generated by the protocol buffer compiler. DO NOT EDIT! # source: CompLib.proto -"""Generated protocol buffer code.""" + from google.protobuf import descriptor as _descriptor -from google.protobuf import descriptor_pool as _descriptor_pool from google.protobuf import message as _message from google.protobuf import reflection as _reflection from google.protobuf import symbol_database as _symbol_database + # @@protoc_insertion_point(imports) _sym_db = _symbol_database.Default() +DESCRIPTOR = _descriptor.FileDescriptor( + name='CompLib.proto', + package='CompLib', + syntax='proto3', + serialized_options=None, + create_key=_descriptor._internal_create_key, + serialized_pb=b'\n\rCompLib.proto\x12\x07\x43ompLib\"\x1e\n\x06Header\x12\x14\n\x0cmessage_type\x18\x01 \x01(\t\"3\n\x06Status\x12\x12\n\nsuccessful\x18\x01 \x01(\x08\x12\x15\n\rerror_message\x18\x02 \x01(\t\"1\n\x0eGenericRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\"S\n\x0fGenericResponse\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1f\n\x06status\x18\x02 \x01(\x0b\x32\x0f.CompLib.Status\">\n\x1b\x45ncoderReadPositionsRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\"w\n\x1c\x45ncoderReadPositionsResponse\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1f\n\x06status\x18\x02 \x01(\x0b\x32\x0f.CompLib.Status\x12\x15\n\tpositions\x18\x03 \x03(\x05\x42\x02\x10\x01\"?\n\x1c\x45ncoderReadVelocitiesRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\"y\n\x1d\x45ncoderReadVelocitiesResponse\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1f\n\x06status\x18\x02 \x01(\x0b\x32\x0f.CompLib.Status\x12\x16\n\nvelocities\x18\x03 \x03(\x01\x42\x02\x10\x01\"9\n\x16IRSensorsEnableRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\":\n\x17IRSensorsDisableRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\":\n\x17IRSensorsReadAllRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\"n\n\x18IRSensorsReadAllResponse\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1f\n\x06status\x18\x02 \x01(\x0b\x32\x0f.CompLib.Status\x12\x10\n\x04\x64\x61ta\x18\x03 \x03(\rB\x02\x10\x01\"3\n\x14MotorSetPowerRequest\x12\x0c\n\x04port\x18\x01 \x01(\r\x12\r\n\x05power\x18\x02 \x01(\x01\"i\n\x15MotorsSetPowerRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12/\n\x08requests\x18\x02 \x03(\x0b\x32\x1d.CompLib.MotorSetPowerRequest\"3\n\x14MotorSetSpeedRequest\x12\x0c\n\x04port\x18\x01 \x01(\r\x12\r\n\x05speed\x18\x02 \x01(\x01\"i\n\x15MotorsSetSpeedRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12/\n\x08requests\x18\x02 \x03(\x0b\x32\x1d.CompLib.MotorSetSpeedRequest\"6\n\x13OdometryReadRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\"\x95\x01\n\x14OdometryReadResponse\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1f\n\x06status\x18\x02 \x01(\x0b\x32\x0f.CompLib.Status\x12\x12\n\nx_position\x18\x03 \x01(\x01\x12\x12\n\ny_position\x18\x04 \x01(\x01\x12\x13\n\x0borientation\x18\x05 \x01(\x01\"a\n\x14\x44riveDistanceRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x12\n\ndistance_m\x18\x02 \x01(\x01\x12\x14\n\x0cvelocity_m_s\x18\x03 \x01(\x01\"d\n\x12TurnDegreesRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x15\n\rangle_degrees\x18\x02 \x01(\x01\x12\x16\n\x0evelocity_rad_s\x18\x03 \x01(\x01\"l\n\x0c\x44riveRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1b\n\x13linear_velocity_m_s\x18\x02 \x01(\x01\x12\x1e\n\x16\x61ngular_velocity_rad_s\x18\x03 \x01(\x01\"6\n\x13HealthUpdateRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Headerb\x06proto3' +) +_HEADER = _descriptor.Descriptor( + name='Header', + full_name='CompLib.Header', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='message_type', full_name='CompLib.Header.message_type', index=0, + number=1, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=26, + serialized_end=56, +) +_STATUS = _descriptor.Descriptor( + name='Status', + full_name='CompLib.Status', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='successful', full_name='CompLib.Status.successful', index=0, + number=1, type=8, cpp_type=7, label=1, + has_default_value=False, default_value=False, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='error_message', full_name='CompLib.Status.error_message', index=1, + number=2, type=9, cpp_type=9, label=1, + has_default_value=False, default_value=b"".decode('utf-8'), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=58, + serialized_end=109, +) -DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\rCompLib.proto\x12\x07\x43ompLib\"\x1e\n\x06Header\x12\x14\n\x0cmessage_type\x18\x01 \x01(\t\"3\n\x06Status\x12\x12\n\nsuccessful\x18\x01 \x01(\x08\x12\x15\n\rerror_message\x18\x02 \x01(\t\"1\n\x0eGenericRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\"S\n\x0fGenericResponse\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1f\n\x06status\x18\x02 \x01(\x0b\x32\x0f.CompLib.Status\">\n\x1b\x45ncoderReadPositionsRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\"w\n\x1c\x45ncoderReadPositionsResponse\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1f\n\x06status\x18\x02 \x01(\x0b\x32\x0f.CompLib.Status\x12\x15\n\tpositions\x18\x03 \x03(\x05\x42\x02\x10\x01\"?\n\x1c\x45ncoderReadVelocitiesRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\"y\n\x1d\x45ncoderReadVelocitiesResponse\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1f\n\x06status\x18\x02 \x01(\x0b\x32\x0f.CompLib.Status\x12\x16\n\nvelocities\x18\x03 \x03(\x01\x42\x02\x10\x01\"9\n\x16IRSensorsEnableRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\":\n\x17IRSensorsDisableRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\":\n\x17IRSensorsReadAllRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\"n\n\x18IRSensorsReadAllResponse\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1f\n\x06status\x18\x02 \x01(\x0b\x32\x0f.CompLib.Status\x12\x10\n\x04\x64\x61ta\x18\x03 \x03(\rB\x02\x10\x01\"U\n\x15MotorsSetPowerRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\r\n\x05power\x18\x03 \x01(\x01\"U\n\x15MotorsSetSpeedRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x0c\n\x04port\x18\x02 \x01(\r\x12\r\n\x05speed\x18\x03 \x01(\x01\"6\n\x13OdometryReadRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\"\x95\x01\n\x14OdometryReadResponse\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1f\n\x06status\x18\x02 \x01(\x0b\x32\x0f.CompLib.Status\x12\x12\n\nx_position\x18\x03 \x01(\x01\x12\x12\n\ny_position\x18\x04 \x01(\x01\x12\x13\n\x0borientation\x18\x05 \x01(\x01\"a\n\x14\x44riveDistanceRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x12\n\ndistance_m\x18\x02 \x01(\x01\x12\x14\n\x0cvelocity_m_s\x18\x03 \x01(\x01\"d\n\x12TurnDegreesRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x15\n\rangle_degrees\x18\x02 \x01(\x01\x12\x16\n\x0evelocity_rad_s\x18\x03 \x01(\x01\"l\n\x0c\x44riveRequest\x12\x1f\n\x06header\x18\x01 \x01(\x0b\x32\x0f.CompLib.Header\x12\x1b\n\x13linear_velocity_m_s\x18\x02 \x01(\x01\x12\x1e\n\x16\x61ngular_velocity_rad_s\x18\x03 \x01(\x01\x62\x06proto3') +_GENERICREQUEST = _descriptor.Descriptor( + name='GenericRequest', + full_name='CompLib.GenericRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.GenericRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=111, + serialized_end=160, +) +_GENERICRESPONSE = _descriptor.Descriptor( + name='GenericResponse', + full_name='CompLib.GenericResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.GenericResponse.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status', full_name='CompLib.GenericResponse.status', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=162, + serialized_end=245, +) +_ENCODERREADPOSITIONSREQUEST = _descriptor.Descriptor( + name='EncoderReadPositionsRequest', + full_name='CompLib.EncoderReadPositionsRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.EncoderReadPositionsRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=247, + serialized_end=309, +) + +_ENCODERREADPOSITIONSRESPONSE = _descriptor.Descriptor( + name='EncoderReadPositionsResponse', + full_name='CompLib.EncoderReadPositionsResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.EncoderReadPositionsResponse.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status', full_name='CompLib.EncoderReadPositionsResponse.status', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='positions', full_name='CompLib.EncoderReadPositionsResponse.positions', index=2, + number=3, type=5, cpp_type=1, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=311, + serialized_end=430, +) + +_ENCODERREADVELOCITIESREQUEST = _descriptor.Descriptor( + name='EncoderReadVelocitiesRequest', + full_name='CompLib.EncoderReadVelocitiesRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.EncoderReadVelocitiesRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=432, + serialized_end=495, +) + +_ENCODERREADVELOCITIESRESPONSE = _descriptor.Descriptor( + name='EncoderReadVelocitiesResponse', + full_name='CompLib.EncoderReadVelocitiesResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.EncoderReadVelocitiesResponse.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status', full_name='CompLib.EncoderReadVelocitiesResponse.status', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='velocities', full_name='CompLib.EncoderReadVelocitiesResponse.velocities', index=2, + number=3, type=1, cpp_type=5, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=497, + serialized_end=618, +) + +_IRSENSORSENABLEREQUEST = _descriptor.Descriptor( + name='IRSensorsEnableRequest', + full_name='CompLib.IRSensorsEnableRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.IRSensorsEnableRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=620, + serialized_end=677, +) + +_IRSENSORSDISABLEREQUEST = _descriptor.Descriptor( + name='IRSensorsDisableRequest', + full_name='CompLib.IRSensorsDisableRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.IRSensorsDisableRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=679, + serialized_end=737, +) + +_IRSENSORSREADALLREQUEST = _descriptor.Descriptor( + name='IRSensorsReadAllRequest', + full_name='CompLib.IRSensorsReadAllRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.IRSensorsReadAllRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=739, + serialized_end=797, +) + +_IRSENSORSREADALLRESPONSE = _descriptor.Descriptor( + name='IRSensorsReadAllResponse', + full_name='CompLib.IRSensorsReadAllResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.IRSensorsReadAllResponse.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status', full_name='CompLib.IRSensorsReadAllResponse.status', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='data', full_name='CompLib.IRSensorsReadAllResponse.data', index=2, + number=3, type=13, cpp_type=3, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=b'\020\001', file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=799, + serialized_end=909, +) + +_MOTORSETPOWERREQUEST = _descriptor.Descriptor( + name='MotorSetPowerRequest', + full_name='CompLib.MotorSetPowerRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='port', full_name='CompLib.MotorSetPowerRequest.port', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='power', full_name='CompLib.MotorSetPowerRequest.power', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=911, + serialized_end=962, +) + +_MOTORSSETPOWERREQUEST = _descriptor.Descriptor( + name='MotorsSetPowerRequest', + full_name='CompLib.MotorsSetPowerRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.MotorsSetPowerRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='requests', full_name='CompLib.MotorsSetPowerRequest.requests', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=964, + serialized_end=1069, +) + +_MOTORSETSPEEDREQUEST = _descriptor.Descriptor( + name='MotorSetSpeedRequest', + full_name='CompLib.MotorSetSpeedRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='port', full_name='CompLib.MotorSetSpeedRequest.port', index=0, + number=1, type=13, cpp_type=3, label=1, + has_default_value=False, default_value=0, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='speed', full_name='CompLib.MotorSetSpeedRequest.speed', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1071, + serialized_end=1122, +) + +_MOTORSSETSPEEDREQUEST = _descriptor.Descriptor( + name='MotorsSetSpeedRequest', + full_name='CompLib.MotorsSetSpeedRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.MotorsSetSpeedRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='requests', full_name='CompLib.MotorsSetSpeedRequest.requests', index=1, + number=2, type=11, cpp_type=10, label=3, + has_default_value=False, default_value=[], + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1124, + serialized_end=1229, +) + +_ODOMETRYREADREQUEST = _descriptor.Descriptor( + name='OdometryReadRequest', + full_name='CompLib.OdometryReadRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.OdometryReadRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1231, + serialized_end=1285, +) + +_ODOMETRYREADRESPONSE = _descriptor.Descriptor( + name='OdometryReadResponse', + full_name='CompLib.OdometryReadResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.OdometryReadResponse.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status', full_name='CompLib.OdometryReadResponse.status', index=1, + number=2, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='x_position', full_name='CompLib.OdometryReadResponse.x_position', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='y_position', full_name='CompLib.OdometryReadResponse.y_position', index=3, + number=4, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='orientation', full_name='CompLib.OdometryReadResponse.orientation', index=4, + number=5, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1288, + serialized_end=1437, +) + +_DRIVEDISTANCEREQUEST = _descriptor.Descriptor( + name='DriveDistanceRequest', + full_name='CompLib.DriveDistanceRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.DriveDistanceRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='distance_m', full_name='CompLib.DriveDistanceRequest.distance_m', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='velocity_m_s', full_name='CompLib.DriveDistanceRequest.velocity_m_s', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1439, + serialized_end=1536, +) + +_TURNDEGREESREQUEST = _descriptor.Descriptor( + name='TurnDegreesRequest', + full_name='CompLib.TurnDegreesRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.TurnDegreesRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='angle_degrees', full_name='CompLib.TurnDegreesRequest.angle_degrees', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='velocity_rad_s', full_name='CompLib.TurnDegreesRequest.velocity_rad_s', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1538, + serialized_end=1638, +) + +_DRIVEREQUEST = _descriptor.Descriptor( + name='DriveRequest', + full_name='CompLib.DriveRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.DriveRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='linear_velocity_m_s', full_name='CompLib.DriveRequest.linear_velocity_m_s', index=1, + number=2, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='angular_velocity_rad_s', full_name='CompLib.DriveRequest.angular_velocity_rad_s', index=2, + number=3, type=1, cpp_type=5, label=1, + has_default_value=False, default_value=float(0), + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1640, + serialized_end=1748, +) + +_HEALTHUPDATEREQUEST = _descriptor.Descriptor( + name='HealthUpdateRequest', + full_name='CompLib.HealthUpdateRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='header', full_name='CompLib.HealthUpdateRequest.header', index=0, + number=1, type=11, cpp_type=10, label=1, + has_default_value=False, default_value=None, + message_type=None, enum_type=None, containing_type=None, + is_extension=False, extension_scope=None, + serialized_options=None, file=DESCRIPTOR, create_key=_descriptor._internal_create_key), + ], + extensions=[ + ], + nested_types=[], + enum_types=[ + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[ + ], + serialized_start=1750, + serialized_end=1804, +) + +_GENERICREQUEST.fields_by_name['header'].message_type = _HEADER +_GENERICRESPONSE.fields_by_name['header'].message_type = _HEADER +_GENERICRESPONSE.fields_by_name['status'].message_type = _STATUS +_ENCODERREADPOSITIONSREQUEST.fields_by_name['header'].message_type = _HEADER +_ENCODERREADPOSITIONSRESPONSE.fields_by_name['header'].message_type = _HEADER +_ENCODERREADPOSITIONSRESPONSE.fields_by_name['status'].message_type = _STATUS +_ENCODERREADVELOCITIESREQUEST.fields_by_name['header'].message_type = _HEADER +_ENCODERREADVELOCITIESRESPONSE.fields_by_name['header'].message_type = _HEADER +_ENCODERREADVELOCITIESRESPONSE.fields_by_name['status'].message_type = _STATUS +_IRSENSORSENABLEREQUEST.fields_by_name['header'].message_type = _HEADER +_IRSENSORSDISABLEREQUEST.fields_by_name['header'].message_type = _HEADER +_IRSENSORSREADALLREQUEST.fields_by_name['header'].message_type = _HEADER +_IRSENSORSREADALLRESPONSE.fields_by_name['header'].message_type = _HEADER +_IRSENSORSREADALLRESPONSE.fields_by_name['status'].message_type = _STATUS +_MOTORSSETPOWERREQUEST.fields_by_name['header'].message_type = _HEADER +_MOTORSSETPOWERREQUEST.fields_by_name['requests'].message_type = _MOTORSETPOWERREQUEST +_MOTORSSETSPEEDREQUEST.fields_by_name['header'].message_type = _HEADER +_MOTORSSETSPEEDREQUEST.fields_by_name['requests'].message_type = _MOTORSETSPEEDREQUEST +_ODOMETRYREADREQUEST.fields_by_name['header'].message_type = _HEADER +_ODOMETRYREADRESPONSE.fields_by_name['header'].message_type = _HEADER +_ODOMETRYREADRESPONSE.fields_by_name['status'].message_type = _STATUS +_DRIVEDISTANCEREQUEST.fields_by_name['header'].message_type = _HEADER +_TURNDEGREESREQUEST.fields_by_name['header'].message_type = _HEADER +_DRIVEREQUEST.fields_by_name['header'].message_type = _HEADER +_HEALTHUPDATEREQUEST.fields_by_name['header'].message_type = _HEADER +DESCRIPTOR.message_types_by_name['Header'] = _HEADER +DESCRIPTOR.message_types_by_name['Status'] = _STATUS +DESCRIPTOR.message_types_by_name['GenericRequest'] = _GENERICREQUEST +DESCRIPTOR.message_types_by_name['GenericResponse'] = _GENERICRESPONSE +DESCRIPTOR.message_types_by_name['EncoderReadPositionsRequest'] = _ENCODERREADPOSITIONSREQUEST +DESCRIPTOR.message_types_by_name['EncoderReadPositionsResponse'] = _ENCODERREADPOSITIONSRESPONSE +DESCRIPTOR.message_types_by_name['EncoderReadVelocitiesRequest'] = _ENCODERREADVELOCITIESREQUEST +DESCRIPTOR.message_types_by_name['EncoderReadVelocitiesResponse'] = _ENCODERREADVELOCITIESRESPONSE +DESCRIPTOR.message_types_by_name['IRSensorsEnableRequest'] = _IRSENSORSENABLEREQUEST +DESCRIPTOR.message_types_by_name['IRSensorsDisableRequest'] = _IRSENSORSDISABLEREQUEST +DESCRIPTOR.message_types_by_name['IRSensorsReadAllRequest'] = _IRSENSORSREADALLREQUEST +DESCRIPTOR.message_types_by_name['IRSensorsReadAllResponse'] = _IRSENSORSREADALLRESPONSE +DESCRIPTOR.message_types_by_name['MotorSetPowerRequest'] = _MOTORSETPOWERREQUEST +DESCRIPTOR.message_types_by_name['MotorsSetPowerRequest'] = _MOTORSSETPOWERREQUEST +DESCRIPTOR.message_types_by_name['MotorSetSpeedRequest'] = _MOTORSETSPEEDREQUEST +DESCRIPTOR.message_types_by_name['MotorsSetSpeedRequest'] = _MOTORSSETSPEEDREQUEST +DESCRIPTOR.message_types_by_name['OdometryReadRequest'] = _ODOMETRYREADREQUEST +DESCRIPTOR.message_types_by_name['OdometryReadResponse'] = _ODOMETRYREADRESPONSE +DESCRIPTOR.message_types_by_name['DriveDistanceRequest'] = _DRIVEDISTANCEREQUEST +DESCRIPTOR.message_types_by_name['TurnDegreesRequest'] = _TURNDEGREESREQUEST +DESCRIPTOR.message_types_by_name['DriveRequest'] = _DRIVEREQUEST +DESCRIPTOR.message_types_by_name['HealthUpdateRequest'] = _HEALTHUPDATEREQUEST +_sym_db.RegisterFileDescriptor(DESCRIPTOR) -_HEADER = DESCRIPTOR.message_types_by_name['Header'] -_STATUS = DESCRIPTOR.message_types_by_name['Status'] -_GENERICREQUEST = DESCRIPTOR.message_types_by_name['GenericRequest'] -_GENERICRESPONSE = DESCRIPTOR.message_types_by_name['GenericResponse'] -_ENCODERREADPOSITIONSREQUEST = DESCRIPTOR.message_types_by_name['EncoderReadPositionsRequest'] -_ENCODERREADPOSITIONSRESPONSE = DESCRIPTOR.message_types_by_name['EncoderReadPositionsResponse'] -_ENCODERREADVELOCITIESREQUEST = DESCRIPTOR.message_types_by_name['EncoderReadVelocitiesRequest'] -_ENCODERREADVELOCITIESRESPONSE = DESCRIPTOR.message_types_by_name['EncoderReadVelocitiesResponse'] -_IRSENSORSENABLEREQUEST = DESCRIPTOR.message_types_by_name['IRSensorsEnableRequest'] -_IRSENSORSDISABLEREQUEST = DESCRIPTOR.message_types_by_name['IRSensorsDisableRequest'] -_IRSENSORSREADALLREQUEST = DESCRIPTOR.message_types_by_name['IRSensorsReadAllRequest'] -_IRSENSORSREADALLRESPONSE = DESCRIPTOR.message_types_by_name['IRSensorsReadAllResponse'] -_MOTORSSETPOWERREQUEST = DESCRIPTOR.message_types_by_name['MotorsSetPowerRequest'] -_MOTORSSETSPEEDREQUEST = DESCRIPTOR.message_types_by_name['MotorsSetSpeedRequest'] -_ODOMETRYREADREQUEST = DESCRIPTOR.message_types_by_name['OdometryReadRequest'] -_ODOMETRYREADRESPONSE = DESCRIPTOR.message_types_by_name['OdometryReadResponse'] -_DRIVEDISTANCEREQUEST = DESCRIPTOR.message_types_by_name['DriveDistanceRequest'] -_TURNDEGREESREQUEST = DESCRIPTOR.message_types_by_name['TurnDegreesRequest'] -_DRIVEREQUEST = DESCRIPTOR.message_types_by_name['DriveRequest'] Header = _reflection.GeneratedProtocolMessageType('Header', (_message.Message,), { - 'DESCRIPTOR' : _HEADER, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.Header) - }) + 'DESCRIPTOR': _HEADER, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.Header) +}) _sym_db.RegisterMessage(Header) Status = _reflection.GeneratedProtocolMessageType('Status', (_message.Message,), { - 'DESCRIPTOR' : _STATUS, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.Status) - }) + 'DESCRIPTOR': _STATUS, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.Status) +}) _sym_db.RegisterMessage(Status) GenericRequest = _reflection.GeneratedProtocolMessageType('GenericRequest', (_message.Message,), { - 'DESCRIPTOR' : _GENERICREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.GenericRequest) - }) + 'DESCRIPTOR': _GENERICREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.GenericRequest) +}) _sym_db.RegisterMessage(GenericRequest) GenericResponse = _reflection.GeneratedProtocolMessageType('GenericResponse', (_message.Message,), { - 'DESCRIPTOR' : _GENERICRESPONSE, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.GenericResponse) - }) + 'DESCRIPTOR': _GENERICRESPONSE, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.GenericResponse) +}) _sym_db.RegisterMessage(GenericResponse) -EncoderReadPositionsRequest = _reflection.GeneratedProtocolMessageType('EncoderReadPositionsRequest', (_message.Message,), { - 'DESCRIPTOR' : _ENCODERREADPOSITIONSREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.EncoderReadPositionsRequest) - }) +EncoderReadPositionsRequest = _reflection.GeneratedProtocolMessageType('EncoderReadPositionsRequest', + (_message.Message,), { + 'DESCRIPTOR': _ENCODERREADPOSITIONSREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.EncoderReadPositionsRequest) + }) _sym_db.RegisterMessage(EncoderReadPositionsRequest) -EncoderReadPositionsResponse = _reflection.GeneratedProtocolMessageType('EncoderReadPositionsResponse', (_message.Message,), { - 'DESCRIPTOR' : _ENCODERREADPOSITIONSRESPONSE, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.EncoderReadPositionsResponse) - }) +EncoderReadPositionsResponse = _reflection.GeneratedProtocolMessageType('EncoderReadPositionsResponse', + (_message.Message,), { + 'DESCRIPTOR': _ENCODERREADPOSITIONSRESPONSE, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.EncoderReadPositionsResponse) + }) _sym_db.RegisterMessage(EncoderReadPositionsResponse) -EncoderReadVelocitiesRequest = _reflection.GeneratedProtocolMessageType('EncoderReadVelocitiesRequest', (_message.Message,), { - 'DESCRIPTOR' : _ENCODERREADVELOCITIESREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.EncoderReadVelocitiesRequest) - }) +EncoderReadVelocitiesRequest = _reflection.GeneratedProtocolMessageType('EncoderReadVelocitiesRequest', + (_message.Message,), { + 'DESCRIPTOR': _ENCODERREADVELOCITIESREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.EncoderReadVelocitiesRequest) + }) _sym_db.RegisterMessage(EncoderReadVelocitiesRequest) -EncoderReadVelocitiesResponse = _reflection.GeneratedProtocolMessageType('EncoderReadVelocitiesResponse', (_message.Message,), { - 'DESCRIPTOR' : _ENCODERREADVELOCITIESRESPONSE, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.EncoderReadVelocitiesResponse) - }) +EncoderReadVelocitiesResponse = _reflection.GeneratedProtocolMessageType('EncoderReadVelocitiesResponse', + (_message.Message,), { + 'DESCRIPTOR': _ENCODERREADVELOCITIESRESPONSE, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.EncoderReadVelocitiesResponse) + }) _sym_db.RegisterMessage(EncoderReadVelocitiesResponse) IRSensorsEnableRequest = _reflection.GeneratedProtocolMessageType('IRSensorsEnableRequest', (_message.Message,), { - 'DESCRIPTOR' : _IRSENSORSENABLEREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.IRSensorsEnableRequest) - }) + 'DESCRIPTOR': _IRSENSORSENABLEREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.IRSensorsEnableRequest) +}) _sym_db.RegisterMessage(IRSensorsEnableRequest) IRSensorsDisableRequest = _reflection.GeneratedProtocolMessageType('IRSensorsDisableRequest', (_message.Message,), { - 'DESCRIPTOR' : _IRSENSORSDISABLEREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.IRSensorsDisableRequest) - }) + 'DESCRIPTOR': _IRSENSORSDISABLEREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.IRSensorsDisableRequest) +}) _sym_db.RegisterMessage(IRSensorsDisableRequest) IRSensorsReadAllRequest = _reflection.GeneratedProtocolMessageType('IRSensorsReadAllRequest', (_message.Message,), { - 'DESCRIPTOR' : _IRSENSORSREADALLREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.IRSensorsReadAllRequest) - }) + 'DESCRIPTOR': _IRSENSORSREADALLREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.IRSensorsReadAllRequest) +}) _sym_db.RegisterMessage(IRSensorsReadAllRequest) IRSensorsReadAllResponse = _reflection.GeneratedProtocolMessageType('IRSensorsReadAllResponse', (_message.Message,), { - 'DESCRIPTOR' : _IRSENSORSREADALLRESPONSE, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.IRSensorsReadAllResponse) - }) + 'DESCRIPTOR': _IRSENSORSREADALLRESPONSE, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.IRSensorsReadAllResponse) +}) _sym_db.RegisterMessage(IRSensorsReadAllResponse) +MotorSetPowerRequest = _reflection.GeneratedProtocolMessageType('MotorSetPowerRequest', (_message.Message,), { + 'DESCRIPTOR': _MOTORSETPOWERREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.MotorSetPowerRequest) +}) +_sym_db.RegisterMessage(MotorSetPowerRequest) + MotorsSetPowerRequest = _reflection.GeneratedProtocolMessageType('MotorsSetPowerRequest', (_message.Message,), { - 'DESCRIPTOR' : _MOTORSSETPOWERREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.MotorsSetPowerRequest) - }) + 'DESCRIPTOR': _MOTORSSETPOWERREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.MotorsSetPowerRequest) +}) _sym_db.RegisterMessage(MotorsSetPowerRequest) +MotorSetSpeedRequest = _reflection.GeneratedProtocolMessageType('MotorSetSpeedRequest', (_message.Message,), { + 'DESCRIPTOR': _MOTORSETSPEEDREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.MotorSetSpeedRequest) +}) +_sym_db.RegisterMessage(MotorSetSpeedRequest) + MotorsSetSpeedRequest = _reflection.GeneratedProtocolMessageType('MotorsSetSpeedRequest', (_message.Message,), { - 'DESCRIPTOR' : _MOTORSSETSPEEDREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.MotorsSetSpeedRequest) - }) + 'DESCRIPTOR': _MOTORSSETSPEEDREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.MotorsSetSpeedRequest) +}) _sym_db.RegisterMessage(MotorsSetSpeedRequest) OdometryReadRequest = _reflection.GeneratedProtocolMessageType('OdometryReadRequest', (_message.Message,), { - 'DESCRIPTOR' : _ODOMETRYREADREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.OdometryReadRequest) - }) + 'DESCRIPTOR': _ODOMETRYREADREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.OdometryReadRequest) +}) _sym_db.RegisterMessage(OdometryReadRequest) OdometryReadResponse = _reflection.GeneratedProtocolMessageType('OdometryReadResponse', (_message.Message,), { - 'DESCRIPTOR' : _ODOMETRYREADRESPONSE, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.OdometryReadResponse) - }) + 'DESCRIPTOR': _ODOMETRYREADRESPONSE, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.OdometryReadResponse) +}) _sym_db.RegisterMessage(OdometryReadResponse) DriveDistanceRequest = _reflection.GeneratedProtocolMessageType('DriveDistanceRequest', (_message.Message,), { - 'DESCRIPTOR' : _DRIVEDISTANCEREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.DriveDistanceRequest) - }) + 'DESCRIPTOR': _DRIVEDISTANCEREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.DriveDistanceRequest) +}) _sym_db.RegisterMessage(DriveDistanceRequest) TurnDegreesRequest = _reflection.GeneratedProtocolMessageType('TurnDegreesRequest', (_message.Message,), { - 'DESCRIPTOR' : _TURNDEGREESREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.TurnDegreesRequest) - }) + 'DESCRIPTOR': _TURNDEGREESREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.TurnDegreesRequest) +}) _sym_db.RegisterMessage(TurnDegreesRequest) DriveRequest = _reflection.GeneratedProtocolMessageType('DriveRequest', (_message.Message,), { - 'DESCRIPTOR' : _DRIVEREQUEST, - '__module__' : 'CompLib_pb2' - # @@protoc_insertion_point(class_scope:CompLib.DriveRequest) - }) + 'DESCRIPTOR': _DRIVEREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.DriveRequest) +}) _sym_db.RegisterMessage(DriveRequest) -if _descriptor._USE_C_DESCRIPTORS == False: +HealthUpdateRequest = _reflection.GeneratedProtocolMessageType('HealthUpdateRequest', (_message.Message,), { + 'DESCRIPTOR': _HEALTHUPDATEREQUEST, + '__module__': 'CompLib_pb2' + # @@protoc_insertion_point(class_scope:CompLib.HealthUpdateRequest) +}) +_sym_db.RegisterMessage(HealthUpdateRequest) - DESCRIPTOR._options = None - _ENCODERREADPOSITIONSRESPONSE.fields_by_name['positions']._options = None - _ENCODERREADPOSITIONSRESPONSE.fields_by_name['positions']._serialized_options = b'\020\001' - _ENCODERREADVELOCITIESRESPONSE.fields_by_name['velocities']._options = None - _ENCODERREADVELOCITIESRESPONSE.fields_by_name['velocities']._serialized_options = b'\020\001' - _IRSENSORSREADALLRESPONSE.fields_by_name['data']._options = None - _IRSENSORSREADALLRESPONSE.fields_by_name['data']._serialized_options = b'\020\001' - _HEADER._serialized_start=26 - _HEADER._serialized_end=56 - _STATUS._serialized_start=58 - _STATUS._serialized_end=109 - _GENERICREQUEST._serialized_start=111 - _GENERICREQUEST._serialized_end=160 - _GENERICRESPONSE._serialized_start=162 - _GENERICRESPONSE._serialized_end=245 - _ENCODERREADPOSITIONSREQUEST._serialized_start=247 - _ENCODERREADPOSITIONSREQUEST._serialized_end=309 - _ENCODERREADPOSITIONSRESPONSE._serialized_start=311 - _ENCODERREADPOSITIONSRESPONSE._serialized_end=430 - _ENCODERREADVELOCITIESREQUEST._serialized_start=432 - _ENCODERREADVELOCITIESREQUEST._serialized_end=495 - _ENCODERREADVELOCITIESRESPONSE._serialized_start=497 - _ENCODERREADVELOCITIESRESPONSE._serialized_end=618 - _IRSENSORSENABLEREQUEST._serialized_start=620 - _IRSENSORSENABLEREQUEST._serialized_end=677 - _IRSENSORSDISABLEREQUEST._serialized_start=679 - _IRSENSORSDISABLEREQUEST._serialized_end=737 - _IRSENSORSREADALLREQUEST._serialized_start=739 - _IRSENSORSREADALLREQUEST._serialized_end=797 - _IRSENSORSREADALLRESPONSE._serialized_start=799 - _IRSENSORSREADALLRESPONSE._serialized_end=909 - _MOTORSSETPOWERREQUEST._serialized_start=911 - _MOTORSSETPOWERREQUEST._serialized_end=996 - _MOTORSSETSPEEDREQUEST._serialized_start=998 - _MOTORSSETSPEEDREQUEST._serialized_end=1083 - _ODOMETRYREADREQUEST._serialized_start=1085 - _ODOMETRYREADREQUEST._serialized_end=1139 - _ODOMETRYREADRESPONSE._serialized_start=1142 - _ODOMETRYREADRESPONSE._serialized_end=1291 - _DRIVEDISTANCEREQUEST._serialized_start=1293 - _DRIVEDISTANCEREQUEST._serialized_end=1390 - _TURNDEGREESREQUEST._serialized_start=1392 - _TURNDEGREESREQUEST._serialized_end=1492 - _DRIVEREQUEST._serialized_start=1494 - _DRIVEREQUEST._serialized_end=1602 +_ENCODERREADPOSITIONSRESPONSE.fields_by_name['positions']._options = None +_ENCODERREADVELOCITIESRESPONSE.fields_by_name['velocities']._options = None +_IRSENSORSREADALLRESPONSE.fields_by_name['data']._options = None # @@protoc_insertion_point(module_scope) diff --git a/client_s2/compLib/HealthCheck.py b/client_s2/compLib/HealthCheck.py new file mode 100644 index 0000000..39a4241 --- /dev/null +++ b/client_s2/compLib/HealthCheck.py @@ -0,0 +1,23 @@ +import threading +import time + +import compLib.CompLib_pb2 as CompLib_pb2 +from compLib.CompLibClient import CompLibClient + + +class HealthUpdater(object): + started = False + + @staticmethod + def start(): + if not HealthUpdater.started: + threading.Thread(target=HealthUpdater.loop, daemon=True).start() + HealthUpdater.started = True + + @staticmethod + def loop(): + while True: + request = CompLib_pb2.HealthUpdateRequest() + request.header.message_type = request.DESCRIPTOR.full_name + CompLibClient.send(request.SerializeToString(), request.ByteSize()) + time.sleep(0.25) diff --git a/client_s2/compLib/IRSensor.py b/client_s2/compLib/IRSensor.py index 840c839..a0075ce 100644 --- a/client_s2/compLib/IRSensor.py +++ b/client_s2/compLib/IRSensor.py @@ -1,4 +1,5 @@ import compLib.CompLib_pb2 as CompLib_pb2 + from compLib.CompLibClient import CompLibClient @@ -10,7 +11,7 @@ class IRSensor(object): def read_all(): """Read all IR sensors at once. - :return: Tuple of all current ir sensors + :return: Array of all current ir sensors """ request = CompLib_pb2.IRSensorsReadAllRequest() request.header.message_type = request.DESCRIPTOR.full_name @@ -18,7 +19,7 @@ class IRSensor(object): response = CompLib_pb2.IRSensorsReadAllResponse() response.ParseFromString(CompLibClient.send(request.SerializeToString(), request.ByteSize())) - return tuple(i for i in response.data) + return [i for i in response.data] @staticmethod def enable(): diff --git a/client_s2/compLib/Motor.py b/client_s2/compLib/Motor.py index 27ce586..fbfced1 100644 --- a/client_s2/compLib/Motor.py +++ b/client_s2/compLib/Motor.py @@ -30,6 +30,31 @@ class Motor(object): CompLibClient.send(request.SerializeToString(), request.ByteSize()) + @staticmethod + def multiple_power(*arguments: tuple[int, float]): + """Set specified motors to percentage power + + :param arguments: tuples of port, percentage + :raises: IndexError + """ + request = CompLib_pb2.MotorsSetPowerRequest() + request.header.message_type = request.DESCRIPTOR.full_name + + for port, percent in arguments: + if port < 0 or port >= MOTOR_COUNT: + raise IndexError("Invalid Motor port specified!") + + if percent < -100 or percent > 100: + raise IndexError("Invalid Motor speed specified! Speed is between -100 and 100 percent!") + + inner_request = CompLib_pb2.MotorSetPowerRequest() + inner_request.port = port + inner_request.power = percent + + request.requests.append(inner_request) + + CompLibClient.send(request.SerializeToString(), request.ByteSize()) + @staticmethod def speed(port: int, speed: float): """Set specified motor to percentage power @@ -49,6 +74,29 @@ class Motor(object): CompLibClient.send(request.SerializeToString(), request.ByteSize()) + @staticmethod + def multiple_speed(*arguments: tuple[int, float]): + """Set specified motor to percentage power + + :param arguments: tuples of port, speed in rpm + :raises: IndexError + """ + + request = CompLib_pb2.MotorsSetSpeedRequest() + request.header.message_type = request.DESCRIPTOR.full_name + + for port, speed in arguments: + if port < 0 or port >= MOTOR_COUNT: + raise IndexError("Invalid Motor port specified!") + + inner_request = CompLib_pb2.MotorSetSpeedRequest() + inner_request.port = port + inner_request.speed = speed + + request.requests.append(inner_request) + + CompLibClient.send(request.SerializeToString(), request.ByteSize()) + # @staticmethod # def all_off(): # """ diff --git a/client_s2/compLib/__pycache__/CompLibClient.cpython-39.pyc b/client_s2/compLib/__pycache__/CompLibClient.cpython-39.pyc deleted file mode 100644 index 7dc2349..0000000 Binary files a/client_s2/compLib/__pycache__/CompLibClient.cpython-39.pyc and /dev/null differ diff --git a/client_s2/compLib/__pycache__/CompLib_pb2.cpython-39.pyc b/client_s2/compLib/__pycache__/CompLib_pb2.cpython-39.pyc deleted file mode 100644 index 272a68d..0000000 Binary files a/client_s2/compLib/__pycache__/CompLib_pb2.cpython-39.pyc and /dev/null differ diff --git a/client_s2/compLib/__pycache__/Encoder.cpython-39.pyc b/client_s2/compLib/__pycache__/Encoder.cpython-39.pyc deleted file mode 100644 index 737675b..0000000 Binary files a/client_s2/compLib/__pycache__/Encoder.cpython-39.pyc and /dev/null differ diff --git a/client_s2/compLib/__pycache__/IRSensor.cpython-39.pyc b/client_s2/compLib/__pycache__/IRSensor.cpython-39.pyc deleted file mode 100644 index 9f4e309..0000000 Binary files a/client_s2/compLib/__pycache__/IRSensor.cpython-39.pyc and /dev/null differ diff --git a/client_s2/compLib/__pycache__/Motor.cpython-39.pyc b/client_s2/compLib/__pycache__/Motor.cpython-39.pyc deleted file mode 100644 index a989671..0000000 Binary files a/client_s2/compLib/__pycache__/Motor.cpython-39.pyc and /dev/null differ diff --git a/client_s2/compLib/__pycache__/Movement.cpython-39.pyc b/client_s2/compLib/__pycache__/Movement.cpython-39.pyc deleted file mode 100644 index 1f185a1..0000000 Binary files a/client_s2/compLib/__pycache__/Movement.cpython-39.pyc and /dev/null differ diff --git a/client_s2/compLib/__pycache__/__init__.cpython-39.pyc b/client_s2/compLib/__pycache__/__init__.cpython-39.pyc deleted file mode 100644 index f848f0a..0000000 Binary files a/client_s2/compLib/__pycache__/__init__.cpython-39.pyc and /dev/null differ diff --git a/client_s2/dev01.py b/client_s2/dev01.py new file mode 100644 index 0000000..6ebfb8c --- /dev/null +++ b/client_s2/dev01.py @@ -0,0 +1,24 @@ +import time + +from compLib.CompLibClient import CompLibClient + + +def main(): + from compLib.Motor import Motor + + # Motor.speed(0, -50) + # Motor.speed(3, 50) + + Motor.power(0, 50) + Motor.power(3, -50) + + time.sleep(2) + + Motor.power(0, 0) + Motor.power(3, -0) + + +if __name__ == '__main__': + CompLibClient.use_tcp_socket("dev01.local") + # follow() + main() diff --git a/client_s2/dev03.py b/client_s2/dev03.py new file mode 100644 index 0000000..d4ed808 --- /dev/null +++ b/client_s2/dev03.py @@ -0,0 +1,34 @@ +import time + +from compLib.CompLibClient import CompLibClient +from compLib.IRSensor import IRSensor + + +def main(): + # Motor.speed(0, -50) + # Motor.speed(3, 50) + + # Motor.power(0, 50) + # Motor.power(3, -50) + # + # time.sleep(2) + # + # Motor.power(0, 0) + # Motor.power(3, -0) + + start_time = time.time() + for i in range(0, 1000): + IRSensor.read_all() + # Motor.multiple_power((0, 1), (3, 1)) + # Motor.speed(0, 1) + # Motor.speed(3, 1) + + print(1000.0 / (time.time() - start_time)) + + +if __name__ == '__main__': + # CompLibClient.use_tcp_socket("dev03.local") + CompLibClient.use_unix_socket() + # follow() + # cProfile.run("main()") + main() diff --git a/client_s2/lf.py b/client_s2/lf.py new file mode 100644 index 0000000..faacc30 --- /dev/null +++ b/client_s2/lf.py @@ -0,0 +1,109 @@ +import time + +from compLib.CompLibClient import CompLibClient +from compLib.IRSensor import IRSensor +from compLib.Motor import Motor + +DRIVE_SPEED = 5.0 +COLOR_BREAK = 1500.0 +KP = 2.0 +KD = 0.0 + + +def drive(left_speed, right_speed): + print(left_speed, right_speed) + + right_speed *= -1.0 + + Motor.speed(0, right_speed) + Motor.speed(3, left_speed) + + +def follow(sleep_time=0.1): + last_error = 0 + sensors_black = 0 + while sensors_black <= 3: + sensor_values = IRSensor.read_all() + + sensors_black = 0 + for sensor in sensor_values: + if sensor > COLOR_BREAK: + sensors_black += 1 + + error = last_error + if sensor_values[2] > COLOR_BREAK: + error = 0 + elif sensor_values[0] > COLOR_BREAK: + error = -1.5 + elif sensor_values[4] > COLOR_BREAK: + error = 1.5 + elif sensor_values[1] > COLOR_BREAK: + error = -1 + elif sensor_values[3] > COLOR_BREAK: + error = 1 + elif error == 1.5: + error = 3.5 + elif error == -1.5: + error = -3.5 + + last_error = error + + adjustment = KP * error + KD * (error - last_error) + left_speed = DRIVE_SPEED + adjustment + right_speed = DRIVE_SPEED - adjustment + + print(sensor_values) + print(f"{left_speed} {right_speed} {adjustment} {error}") + drive(left_speed, right_speed) + + drive(0, 0) + time.sleep(sleep_time) + + +def follow_simple(): + left_speed = DRIVE_SPEED + right_speed = DRIVE_SPEED + sensor_values = IRSensor.read_all() + while True: + sensor_values = IRSensor.read_all() + # for i in range(len(sensor_values)): + # sensor_values[i] = (sensor_values[i] + new_sensor_values[i]) / 2.0 + + print(sensor_values) + + if sensor_values[0] > COLOR_BREAK and sensor_values[4] > COLOR_BREAK: + break + + if sensor_values[0] > COLOR_BREAK: + left_speed = -DRIVE_SPEED / 2 + right_speed = DRIVE_SPEED + elif sensor_values[4] > COLOR_BREAK: + left_speed = DRIVE_SPEED + right_speed = -DRIVE_SPEED / 2 + elif sensor_values[2] > COLOR_BREAK: + left_speed = DRIVE_SPEED + right_speed = DRIVE_SPEED + + drive(left_speed, right_speed) + + +def main(): + CompLibClient.use_unix_socket() + + IRSensor.enable() + time.sleep(0.1) + + # while True: + # print(IRSensor.read_all()) + + # follow_simple() + # drive(5, 5) + # time.sleep(5) + # follow() + # follow() + # follow() + # follow() + # follow(0.2) + + +main() diff --git a/client_s2/main.py b/client_s2/main.py index 8082ab6..7e75006 100644 --- a/client_s2/main.py +++ b/client_s2/main.py @@ -1,4 +1,6 @@ -SOCKET_PATH = "/tmp/compLib" +import time + +from compLib.CompLibClient import CompLibClient # def send(data, size): @@ -30,61 +32,143 @@ def main(): # send(encoder_read_positions_request.SerializeToString(), encoder_read_positions_request.ByteSize()) # print("--- %s seconds ---" % (time.time() - start_time)) - # from compLib.IRSensor import IRSensor - # IRSensor.read_all() - # + from compLib.IRSensor import IRSensor + IRSensor.enable() + + startTime = time.time() + while time.time() - startTime < 10: + print(IRSensor.read_all()) + time.sleep(0.01) + # from compLib.Encoder import Encoder # print(Encoder.read_all_positions()) # print(Encoder.read_all_velocities()) # from compLib.Motor import Motor - # Motor.speed(0, 50) - # Motor.speed(3, -50) - # - # import time - # time.sleep(2) - # - # Motor.speed(0, 0) - # Motor.speed(3, -0) - # Motor.power(0, 0) - # Motor.power(3, 0) + # Motor.speed(0, -50) + # Motor.speed(3, 50) - # import math - # from compLib.Movement import Movement - # Movement.turn_degrees(90, math.pi * 2) - # Movement.turn_degrees(-90, math.pi * 2) - # - # Movement.turn_degrees(90, math.pi * 2) - # Movement.turn_degrees(90, -math.pi * 2) - # - # Movement.turn_degrees(90, math.pi * 2) - # Movement.turn_degrees(-90, -math.pi * 2) + # Motor.power(0, -50) + # Motor.power(3, 50) - # from compLib.Movement import Movement - # Movement.drive_distance(0.1, 0.5) - # Movement.drive_distance(-0.1, 0.5) - # - # Movement.drive_distance(0.1, 0.5) - # Movement.drive_distance(0.1, -0.5) - # - # Movement.drive_distance(0.1, 0.5) - # Movement.drive_distance(-0.1, -0.5) + # time.sleep(5) - from compLib.Movement import Movement - import math - Movement.drive_distance(0.5, 0.5) - Movement.turn_degrees(90, math.pi * 2) - Movement.drive_distance(0.5, 0.5) - Movement.turn_degrees(90, math.pi * 2) +# +# import time +# time.sleep(2) +# +# Motor.speed(0, 0) +# Motor.speed(3, -0) - Movement.drive_distance(0.5, 0.5) - Movement.turn_degrees(90, math.pi * 2) +# Motor.power(0, 0) +# Motor.power(3, 0) - Movement.drive_distance(0.5, 0.5) - Movement.turn_degrees(90, math.pi * 2) +# import math +# from compLib.Movement import Movement +# Movement.turn_degrees(90, math.pi * 2) +# Movement.turn_degrees(-90, math.pi * 2) +# +# Movement.turn_degrees(90, math.pi * 2) +# Movement.turn_degrees(90, -math.pi * 2) +# +# Movement.turn_degrees(90, math.pi * 2) +# Movement.turn_degrees(-90, -math.pi * 2) + +# from compLib.Movement import Movement +# Movement.drive_distance(0.1, 0.5) +# Movement.drive_distance(-0.1, 0.5) +# +# Movement.drive_distance(0.1, 0.5) +# Movement.drive_distance(0.1, -0.5) +# +# Movement.drive_distance(0.1, 0.5) +# Movement.drive_distance(-0.1, -0.5) + +# from compLib.Movement import Movement +# import math +# import time +# Movement.drive_distance(0.5, 0.5) +# time.sleep(1) +# Movement.turn_degrees(90, math.pi * 2) +# time.sleep(1) +# +# Movement.drive_distance(0.5, 0.5) +# time.sleep(1) +# Movement.turn_degrees(90, math.pi * 2) +# time.sleep(1) +# +# Movement.drive_distance(0.5, 0.5) +# time.sleep(1) +# Movement.turn_degrees(90, math.pi * 2) +# time.sleep(1) +# +# Movement.drive_distance(0.5, 0.5) +# time.sleep(1) +# Movement.turn_degrees(90, math.pi * 2) +# time.sleep(1) + +# import time +# +# from compLib.IRSensor import IRSensor +# from compLib.Motor import Motor +# +# IRSensor.enable() +# +# DRIVE_SPEED = 2.0 +# COLOR_BREAK = 900 +# KP = 0.25 +# KD = 0.0 +# +# +# def drive(leftSpeed, rightSpeed): +# Motor.speed(0, -rightSpeed) +# Motor.power(3, leftSpeed) +# +# +# def follow(sleepTime=0.1): +# lastError = 0 +# sensorsBlack = 0 +# +# while sensorsBlack < 3: +# data = IRSensor.read_all() +# +# sensorsBlack = 0 +# for i in range(len(data)): +# if data[i] > COLOR_BREAK: +# sensorsBlack += 1 +# +# error = lastError +# if data[2] > COLOR_BREAK: +# error = 0 +# elif data[0] > COLOR_BREAK: +# error = -1.5 +# elif data[4] > COLOR_BREAK: +# error = 1.5 +# elif data[1] > COLOR_BREAK: +# error = -1 +# elif data[3] > COLOR_BREAK: +# error = 1 +# elif error == 1.5: +# error = 3 +# elif error == -1.5: +# error = -3 +# +# lastError = error +# +# adjustment = KP * error + KD * (error - lastError) +# leftSpeed = DRIVE_SPEED + adjustment +# rightSpeed = DRIVE_SPEED - adjustment +# +# print(f"{leftSpeed} {rightSpeed} {adjustment} {error}") +# drive(leftSpeed, rightSpeed) +# +# drive(0, 0) +# time.sleep(sleepTime) if __name__ == '__main__': + CompLibClient.use_tcp_socket("dev03.local") + # follow() main() diff --git a/server_v2/.idea/deployment.xml b/server_v2/.idea/deployment.xml index 4205078..c9520d5 100644 --- a/server_v2/.idea/deployment.xml +++ b/server_v2/.idea/deployment.xml @@ -2,7 +2,19 @@ - + + + + + + + + + + + + + @@ -10,6 +22,8 @@ + + diff --git a/server_v2/CMakeLists.txt b/server_v2/CMakeLists.txt index b9dd7c0..7246f94 100755 --- a/server_v2/CMakeLists.txt +++ b/server_v2/CMakeLists.txt @@ -55,12 +55,14 @@ set(SRC_FILES src/communication/MessageBuilder.cpp src/communication/UnixSocketServer.cpp src/communication/TCPSocketServer.cpp - src/GoToController.cpp) + src/GoToController.cpp + src/HealthChecker.cpp) set(HDR_FILES include/spi.hpp include/reset.hpp include/mathUtils.hpp + include/networkUtils.hpp include/IRSensors.hpp include/Robot.hpp include/Cache.hpp @@ -74,7 +76,8 @@ set(HDR_FILES include/communication/MessageBuilder.hpp include/communication/UnixSocketServer.hpp include/communication/TCPSocketServer.hpp - include/GoToController.hpp) + include/GoToController.hpp + include/HealthChecker.hpp) include_directories(third_party/asio) diff --git a/server_v2/include/ClosedLoopMotorController.hpp b/server_v2/include/ClosedLoopMotorController.hpp index eb589e7..23865dd 100644 --- a/server_v2/include/ClosedLoopMotorController.hpp +++ b/server_v2/include/ClosedLoopMotorController.hpp @@ -25,6 +25,8 @@ public: void set_speed(uint8_t port, double speed_rad_s); + void stop_all(); + void generate_step_response_data(); void generate_tuned_step_response_data(); diff --git a/server_v2/include/HealthChecker.hpp b/server_v2/include/HealthChecker.hpp new file mode 100644 index 0000000..15e7784 --- /dev/null +++ b/server_v2/include/HealthChecker.hpp @@ -0,0 +1,35 @@ +#ifndef COMPLIB_SERVER_HEALTHCHECKER_HPP +#define COMPLIB_SERVER_HEALTHCHECKER_HPP + +#include +#include + +#define HEALTH_CHECK_TIMEOUT_MS 500 + +class HealthChecker { +public: + static HealthChecker &getInstance() { + static HealthChecker instance; + return instance; + } + + HealthChecker(HealthChecker const &) = delete; + + void operator=(HealthChecker const &) = delete; + + void update(); + +private: + HealthChecker(); + + [[noreturn]] void check_loop(); + + typedef std::chrono::steady_clock clock; + + std::thread check_thread; + std::chrono::time_point last_update; + bool stop_sent = false; +}; + + +#endif //COMPLIB_SERVER_HEALTHCHECKER_HPP diff --git a/server_v2/include/communication/TCPSocketServer.hpp b/server_v2/include/communication/TCPSocketServer.hpp index a1c0384..83f854e 100644 --- a/server_v2/include/communication/TCPSocketServer.hpp +++ b/server_v2/include/communication/TCPSocketServer.hpp @@ -3,7 +3,6 @@ #include -#define SOCKET_PATH "/tmp/compLib" #define SOCKET_BUFFER_SIZE 128 class TCPSocketServer { diff --git a/server_v2/include/networkUtils.hpp b/server_v2/include/networkUtils.hpp new file mode 100644 index 0000000..561127f --- /dev/null +++ b/server_v2/include/networkUtils.hpp @@ -0,0 +1,49 @@ +#ifndef COMPLIB_SERVER_NETWORKUTILS_H +#define COMPLIB_SERVER_NETWORKUTILS_H + +#include +#include +#include +#include "spdlog/spdlog.h" + +#include +#include + +namespace networkUtils { + inline std::tuple get_current_host_and_ip() { + struct ifaddrs *ifaddr, *ifa; + int family, s; + char host[NI_MAXHOST]; + + if (getifaddrs(&ifaddr) == -1) { + spdlog::error("getifaddrs failed"); + freeifaddrs(ifaddr); + return std::tuple("", ""); + } + + for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { + if (ifa->ifa_addr == NULL) + continue; + + family = ifa->ifa_addr->sa_family; + + if (family == AF_INET) { + s = getnameinfo(ifa->ifa_addr, sizeof(struct sockaddr_in), host, NI_MAXHOST, NULL, 0, NI_NUMERICHOST); + if (s != 0) { + spdlog::error("getnameinfo() failed: {}", gai_strerror(s)); + freeifaddrs(ifaddr); + return std::tuple("", ""); + } + + if (std::string(ifa->ifa_name) != "lo") { + freeifaddrs(ifaddr); + return std::tuple(ifa->ifa_name, std::string(host)); + } + } + } + + return std::tuple("", ""); + } +} + +#endif //COMPLIB_SERVER_NETWORKUTILS_H diff --git a/server_v2/include/spi.hpp b/server_v2/include/spi.hpp index 856fff0..1aa08ed 100644 --- a/server_v2/include/spi.hpp +++ b/server_v2/include/spi.hpp @@ -31,6 +31,8 @@ public: void write_array(uint8_t reg, uint8_t length, const uint8_t *data); + std::array read_version(); + enum Register : uint8_t { IDENTIFICATION_MODEL_ID = 1, IDENTIFICATION_MODEL_REV_MAJOR = 2, diff --git a/server_v2/protos/CompLib.proto b/server_v2/protos/CompLib.proto index 8185499..1af66ad 100644 --- a/server_v2/protos/CompLib.proto +++ b/server_v2/protos/CompLib.proto @@ -58,16 +58,24 @@ message IRSensorsReadAllResponse { repeated uint32 data = 3 [packed = true]; } +message MotorSetPowerRequest { + uint32 port = 1; + double power = 2; +} + message MotorsSetPowerRequest { Header header = 1; - uint32 port = 2; - double power = 3; + repeated MotorSetPowerRequest requests = 2; +} + +message MotorSetSpeedRequest { + uint32 port = 1; + double speed = 2; } message MotorsSetSpeedRequest { Header header = 1; - uint32 port = 2; - double speed = 3; + repeated MotorSetSpeedRequest requests = 2; } message OdometryReadRequest { @@ -98,4 +106,8 @@ message DriveRequest { Header header = 1; double linear_velocity_m_s = 2; double angular_velocity_rad_s = 3; +} + +message HealthUpdateRequest { + Header header = 1; } \ No newline at end of file diff --git a/server_v2/src/ClosedLoopMotorController.cpp b/server_v2/src/ClosedLoopMotorController.cpp index 48d670c..ad893cf 100644 --- a/server_v2/src/ClosedLoopMotorController.cpp +++ b/server_v2/src/ClosedLoopMotorController.cpp @@ -184,3 +184,9 @@ void ClosedLoopMotorController::calibrate_wheel_ticks(double turns, double ticks std::this_thread::sleep_for(std::chrono::milliseconds(100)); } + +void ClosedLoopMotorController::stop_all() { + for (int i = 0; i < ROBOT_MOTOR_COUNT; i++) { + set_power(i, 0); + } +} diff --git a/server_v2/src/HealthChecker.cpp b/server_v2/src/HealthChecker.cpp new file mode 100644 index 0000000..c260d5e --- /dev/null +++ b/server_v2/src/HealthChecker.cpp @@ -0,0 +1,28 @@ +#include "include/HealthChecker.hpp" +#include "include/ClosedLoopMotorController.hpp" +#include "include/spi.hpp" +#include "include/IRSensors.hpp" + +HealthChecker::HealthChecker() { + last_update = clock::now(); + check_thread = std::thread(&HealthChecker::check_loop, this); + check_thread.detach(); +} + +void HealthChecker::update() { + last_update = clock::now(); +} + +void HealthChecker::check_loop() { + while (true) { + if (clock::now() - last_update < std::chrono::milliseconds(HEALTH_CHECK_TIMEOUT_MS)) { + Spi::getInstance().read_version(); + stop_sent = false; + } else if (!stop_sent) { + ClosedLoopMotorController::getInstance().stop_all(); + IRSensors::disable(); + stop_sent = true; + } + std::this_thread::sleep_for(std::chrono::milliseconds(HEALTH_CHECK_TIMEOUT_MS / 2)); + } +} diff --git a/server_v2/src/IRSensors.cpp b/server_v2/src/IRSensors.cpp index 9edd035..bc80e26 100644 --- a/server_v2/src/IRSensors.cpp +++ b/server_v2/src/IRSensors.cpp @@ -2,6 +2,7 @@ #include "include/spi.hpp" #include "include/Robot.hpp" #include "include/mathUtils.hpp" +#include "spdlog/spdlog.h" void IRSensors::enable() { uint8_t data[ROBOT_IR_SENSOR_COUNT] = {}; diff --git a/server_v2/src/communication/MessageProcessor.cpp b/server_v2/src/communication/MessageProcessor.cpp index 283177e..bfd8543 100644 --- a/server_v2/src/communication/MessageProcessor.cpp +++ b/server_v2/src/communication/MessageProcessor.cpp @@ -7,6 +7,7 @@ #include "include/IRSensors.hpp" #include "include/ClosedLoopMotorController.hpp" #include "include/GoToController.hpp" +#include "include/HealthChecker.hpp" using namespace CompLib; @@ -14,7 +15,7 @@ google::protobuf::Message *MessageProcessor::process_message(const std::string & CompLib::GenericRequest message; message.ParseFromString(serializedMessage); auto messageTypeName = message.header().message_type(); - spdlog::debug("Got request with type {}", messageTypeName); +// spdlog::debug("Got request with type {}", messageTypeName); try { // Encoder @@ -39,12 +40,16 @@ google::protobuf::Message *MessageProcessor::process_message(const std::string & if (messageTypeName == MotorsSetPowerRequest::GetDescriptor()->full_name()) { MotorsSetPowerRequest request; request.ParseFromString(serializedMessage); - ClosedLoopMotorController::getInstance().set_power(request.port(), request.power()); + for (const auto &innerRequest: request.requests()) { + ClosedLoopMotorController::getInstance().set_power(innerRequest.port(), innerRequest.power()); + } return MessageBuilder::default_successful_generic_response(); } else if (messageTypeName == MotorsSetSpeedRequest::GetDescriptor()->full_name()) { MotorsSetSpeedRequest request; request.ParseFromString(serializedMessage); - ClosedLoopMotorController::getInstance().set_speed(request.port(), request.speed()); + for (const auto &innerRequest: request.requests()) { + ClosedLoopMotorController::getInstance().set_speed(innerRequest.port(), innerRequest.speed()); + } return MessageBuilder::default_successful_generic_response(); } @@ -65,6 +70,15 @@ google::protobuf::Message *MessageProcessor::process_message(const std::string & GoToController::diff_drive_inverse_kinematics(request.linear_velocity_m_s(), request.angular_velocity_rad_s()); return MessageBuilder::default_successful_generic_response(); } + + // Health + if (messageTypeName == HealthUpdateRequest::GetDescriptor()->full_name()) { + HealthUpdateRequest request; + request.ParseFromString(serializedMessage); + HealthChecker::getInstance().update(); + return MessageBuilder::default_successful_generic_response(); + } + } catch (const std::exception &ex) { spdlog::error("Error when processing message with header {}: {}", messageTypeName, ex.what()); google::protobuf::Message *returnMessage = MessageBuilder::generic_response(false, ex.what()); diff --git a/server_v2/src/communication/UnixSocketServer.cpp b/server_v2/src/communication/UnixSocketServer.cpp index f9b336a..b9500ef 100644 --- a/server_v2/src/communication/UnixSocketServer.cpp +++ b/server_v2/src/communication/UnixSocketServer.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "include/communication/UnixSocketServer.hpp" #include "include/communication/MessageProcessor.hpp" @@ -23,6 +24,8 @@ UnixSocketServer::UnixSocketServer() { exit(-1); } + chmod(SOCKET_PATH, 0777); + if (listen(socket_file_descriptor, 1) == -1) { exit(-2); } @@ -32,23 +35,31 @@ UnixSocketServer::UnixSocketServer() { for (;;) { int client_file_descriptor = accept(socket_file_descriptor, NULL, NULL); - read(client_file_descriptor, read_buffer, 1); - uint8_t message_size = read_buffer[0]; + while (true) { + int bytes_received = read(client_file_descriptor, read_buffer, 1); + if (bytes_received <= 0) { + break; + } + uint8_t message_size = read_buffer[0]; - read(client_file_descriptor, read_buffer, read_buffer[0]); - std::string string_message; - for (int i{}; i < message_size; i++) { - string_message += read_buffer[i]; + bytes_received = read(client_file_descriptor, read_buffer, read_buffer[0]); + if (bytes_received <= 0) { + break; + } + std::string string_message; + for (int i{}; i < message_size; i++) { + string_message += read_buffer[i]; + } + + auto response = MessageProcessor::process_message(string_message); + uint8_t response_size = response->ByteSizeLong(); + write_buffer[0] = response_size; + write(client_file_descriptor, write_buffer, 1); + + response->SerializeToArray(write_buffer, SOCKET_BUFFER_SIZE); + write(client_file_descriptor, write_buffer, response_size); } - auto response = MessageProcessor::process_message(string_message); - uint8_t response_size = response->ByteSizeLong(); - write_buffer[0] = response_size; - write(client_file_descriptor, write_buffer, 1); - - response->SerializeToArray(write_buffer, SOCKET_BUFFER_SIZE); - write(client_file_descriptor, write_buffer, response_size); - close(client_file_descriptor); } } \ No newline at end of file diff --git a/server_v2/src/main.cpp b/server_v2/src/main.cpp index 5c83c54..eb4c87b 100644 --- a/server_v2/src/main.cpp +++ b/server_v2/src/main.cpp @@ -6,18 +6,22 @@ #include "include/ClosedLoopMotorController.hpp" #include "include/communication/UnixSocketServer.hpp" #include "include/communication/TCPSocketServer.hpp" +#include "include/HealthChecker.hpp" #include "include/GoToController.hpp" #include "include/Encoders.hpp" +#include "include/networkUtils.hpp" using namespace std; int main(int argc, char *argv[]) { Reset::reset_robot(); spdlog::set_pattern("%H:%M:%S.%e %^%-8l%$: %v"); - spdlog::set_level(spdlog::level::info); + spdlog::set_level(spdlog::level::debug); + spdlog::info("Starting complib_server..."); UnixSocketServer unixSocketServer; TCPSocketServer tcpSocketServer; + HealthChecker::getInstance(); // ClosedLoopMotorController::getInstance().set_speed(ROBOT_ODOMETRY_CONTROLLER_RIGHT_PORT, M_PI * ROBOT_ODOMETRY_CONTROLLER_RIGHT_MULT); // ClosedLoopMotorController::getInstance().set_speed(ROBOT_ODOMETRY_CONTROLLER_LEFT_PORT, M_PI_4 * ROBOT_ODOMETRY_CONTROLLER_LEFT_MULT); diff --git a/server_v2/src/spi.cpp b/server_v2/src/spi.cpp index 1374925..f53a343 100644 --- a/server_v2/src/spi.cpp +++ b/server_v2/src/spi.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "include/spi.hpp" #include "include/mathUtils.hpp" @@ -114,6 +115,16 @@ void Spi::transfer() { } } +std::array Spi::read_version() { + uint8_t data[4] = {0}; + read_array(IDENTIFICATION_MODEL_ID, 4, data); + auto result = std::array(); + for (int i = 0; i < 4; i++) { + result.at(i) = data[i]; + } + return result; +} + #else Spi::Spi() {} @@ -147,4 +158,8 @@ void Spi::transfer() { spdlog::warn("Calling SPI without actual interface."); } +std::array Spi::read_version() { + spdlog::warn("Calling SPI without actual interface."); +} + #endif \ No newline at end of file diff --git a/server_v2/test_bin/compsrv b/server_v2/test_bin/compsrv old mode 100644 new mode 100755 index a7feb72..6ec1a70 Binary files a/server_v2/test_bin/compsrv and b/server_v2/test_bin/compsrv differ