diff --git a/MODULE.bazel b/MODULE.bazel new file mode 100644 index 00000000..00bb1836 --- /dev/null +++ b/MODULE.bazel @@ -0,0 +1,6 @@ +############################################################################### +# Bazel now uses Bzlmod by default to manage external dependencies. +# Please consider migrating your external dependencies from WORKSPACE to MODULE.bazel. +# +# For more details, please check https://github.com/bazelbuild/bazel/issues/18958 +############################################################################### diff --git a/MODULE.bazel.lock b/MODULE.bazel.lock new file mode 100644 index 00000000..b9b80d4d --- /dev/null +++ b/MODULE.bazel.lock @@ -0,0 +1,64 @@ +{ + "lockFileVersion": 11, + "registryFileHashes": { + "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497", + "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589", + "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/source.json": "7e3a9adf473e9af076ae485ed649d5641ad50ec5c11718103f34de03170d94ad", + "https://bcr.bazel.build/modules/apple_support/1.5.0/MODULE.bazel": "50341a62efbc483e8a2a6aec30994a58749bd7b885e18dd96aa8c33031e558ef", + "https://bcr.bazel.build/modules/apple_support/1.5.0/source.json": "eb98a7627c0bc486b57f598ad8da50f6625d974c8f723e9ea71bd39f709c9862", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8", + "https://bcr.bazel.build/modules/bazel_features/1.11.0/source.json": "c9320aa53cd1c441d24bd6b716da087ad7e4ff0d9742a9884587596edfe53015", + "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8", + "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a", + "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917", + "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/source.json": "082ed5f9837901fada8c68c2f3ddc958bb22b6d654f71dd73f3df30d45d4b749", + "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84", + "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8", + "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4", + "https://bcr.bazel.build/modules/googletest/1.11.0/source.json": "c73d9ef4268c91bd0c1cd88f1f9dfa08e814b1dbe89b5f594a9f08ba0244d206", + "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee", + "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37", + "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615", + "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814", + "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc", + "https://bcr.bazel.build/modules/platforms/0.0.9/source.json": "cd74d854bf16a9e002fb2ca7b1a421f4403cda29f824a765acd3a8c56f8d43e6", + "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7", + "https://bcr.bazel.build/modules/protobuf/21.7/source.json": "bbe500720421e582ff2d18b0802464205138c06056f443184de39fbb8187b09b", + "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0", + "https://bcr.bazel.build/modules/protobuf/3.19.6/MODULE.bazel": "9233edc5e1f2ee276a60de3eaa47ac4132302ef9643238f23128fea53ea12858", + "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647", + "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c", + "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5", + "https://bcr.bazel.build/modules/rules_cc/0.0.9/source.json": "1f1ba6fea244b616de4a554a0f4983c91a9301640c8fe0dd1d410254115c8430", + "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74", + "https://bcr.bazel.build/modules/rules_java/7.6.5/MODULE.bazel": "481164be5e02e4cab6e77a36927683263be56b7e36fef918b458d7a8a1ebadb1", + "https://bcr.bazel.build/modules/rules_java/7.6.5/source.json": "a805b889531d1690e3c72a7a7e47a870d00323186a9904b36af83aa3d053ee8d", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7", + "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/source.json": "a075731e1b46bc8425098512d038d416e966ab19684a10a34f4741295642fc35", + "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0", + "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d", + "https://bcr.bazel.build/modules/rules_license/0.0.7/source.json": "355cc5737a0f294e560d52b1b7a6492d4fff2caf0bef1a315df5a298fca2d34a", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc", + "https://bcr.bazel.build/modules/rules_pkg/0.7.0/source.json": "c2557066e0c0342223ba592510ad3d812d4963b9024831f7f66fd0584dd8c66c", + "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7", + "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/source.json": "d57902c052424dfda0e71646cb12668d39c4620ee0544294d9d941e7d12bc3a9", + "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f", + "https://bcr.bazel.build/modules/rules_python/0.22.1/MODULE.bazel": "26114f0c0b5e93018c0c066d6673f1a2c3737c7e90af95eff30cfee38d0bbac7", + "https://bcr.bazel.build/modules/rules_python/0.22.1/source.json": "57226905e783bae7c37c2dd662be078728e48fa28ee4324a7eabcafb5a43d014", + "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c", + "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8", + "https://bcr.bazel.build/modules/stardoc/0.5.1/source.json": "a96f95e02123320aa015b956f29c00cb818fa891ef823d55148e1a362caacf29", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43", + "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/source.json": "f1ef7d3f9e0e26d4b23d1c39b5f5de71f584dd7d1b4ef83d9bbba6ec7a6a6459", + "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0", + "https://bcr.bazel.build/modules/zlib/1.2.12/MODULE.bazel": "3b1a8834ada2a883674be8cbd36ede1b6ec481477ada359cd2d3ddc562340b27", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/MODULE.bazel": "af322bc08976524477c79d1e45e241b6efbeb918c497e8840b8ab116802dda79", + "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.3/source.json": "2be409ac3c7601245958cd4fcdff4288be79ed23bd690b4b951f500d54ee6e7d" + }, + "selectedYankedVersions": {}, + "moduleExtensions": {} +} diff --git a/Makefile b/Makefile index 0dbd4c26..4e417b22 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,8 @@ update-deps: cd desktop && flutter pub upgrade && flutter build linux run-all: + mkdir -p desktop/data/csv + chmod u+rwx desktop/data/csv $(MAKE) -j 2 run-proxy run-desktop run-proxy: diff --git a/api/app.py b/api/app.py index cf8ea91e..3b3f3801 100644 --- a/api/app.py +++ b/api/app.py @@ -110,6 +110,11 @@ def emit(self, record): from api.mainservice.router import router as mainservice_router from proxy.app.services.mainservice import initialize_mainservice +# fcfilelogger +from api.fcfileloggerapp.socketio import register_fcfileloggerapp_socketio +from api.fcfileloggerapp.router import router as fcfilelogger_router +from proxy.app.services.fcfileloggerapp import initialize_fcfileloggerapp + sio = AsyncServer( async_mode='asgi', @@ -138,6 +143,7 @@ def emit(self, record): app.include_router(primer_router) app.include_router(recovery_router) app.include_router(mainservice_router) +app.include_router(fcfilelogger_router) register_servoservice_socketio(sio) register_engineservice_socketio(sio) @@ -150,6 +156,7 @@ def emit(self, record): register_fileloggerapp_socketio(sio) register_fcsysstatservice_socketio(sio) register_mainservice_socketio(sio) +register_fcfileloggerapp_socketio(sio) @app.middleware("http") async def log_requests(request, call_next): @@ -186,6 +193,7 @@ async def lifespan(app: FastAPI): gps_task = asyncio.create_task(run_gpsservice_manager(sd_instance)) mainserivce_task = asyncio.create_task(run_mainservice_manager(sd_instance)) fcservice_task = asyncio.create_task(run_fcsysstatservice_manager(sd_instance)) + fcfilelogger_task = asyncio.create_task(run_fcsysstatservice_manager(sd_instance)) yield @@ -237,6 +245,9 @@ async def run_mainservice_manager(sd): async def run_fcsysstatservice_manager(sd): await initialize_fcsysstatservice(sd) +async def fc_fileloggerservice_manager(sd): + await initialize_fcfileloggerapp(sd) + if __name__ == '__main__': import uvicorn diff --git a/api/engineservice/router.py b/api/engineservice/router.py index 76bc0876..0c392488 100644 --- a/api/engineservice/router.py +++ b/api/engineservice/router.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Body, HTTPException from fastapi.responses import JSONResponse from loguru import logger -from proxy.app.dataclasses.engineservice_dataclass import (StartOut, SetModeOut) +from proxy.app.dataclasses.engineservice_dataclass import (SetVentValveOut, SetModeOut, StartOut, GetModeOut) from proxy.app.services.engineservice import EngineServiceManager from api.common import process_method_result @@ -12,6 +12,20 @@ ) +@router.post("/getmode") +async def getmode(data: dict = Body(...)): + try: + service_manager = EngineServiceManager() + params = data or {} + method_result = await service_manager.GetMode(**params) + return process_method_result(method_result, deserialization_class=GetModeOut) + except Exception as e: + logger.exception("Error in getmode handler: %s", e) + return JSONResponse( + status_code=500, + content={"error": str(e)} + ) + @router.post("/setmode") async def setmode(data: dict = Body(...)): try: @@ -26,6 +40,20 @@ async def setmode(data: dict = Body(...)): content={"error": str(e)} ) +@router.post("/setventvalve") +async def setventvalve(data: dict = Body(...)): + try: + service_manager = EngineServiceManager() + params = data or {} + method_result = await service_manager.SetVentValve(**params) + return process_method_result(method_result, deserialization_class=SetVentValveOut) + except Exception as e: + logger.exception("Error in setventvalve handler: %s", e) + return JSONResponse( + status_code=500, + content={"error": str(e)} + ) + @router.post("/start") async def start(data: dict = Body(...)): try: diff --git a/api/engineservice/socketio.py b/api/engineservice/socketio.py index 43d49564..c6cc5f51 100644 --- a/api/engineservice/socketio.py +++ b/api/engineservice/socketio.py @@ -34,3 +34,35 @@ async def get_currentmode(sid, data): room=sid, namespace=namespace) + @sio.on('newhbstatus', namespace=namespace) + async def get_newhbstatus(sid, data): + try: + manager = EngineServiceManager() + response = manager.get_newhbstatus() + await sio.emit('newhbstatus', + {'event_name': 'newhbstatus', 'response': response}, + room=sid, + namespace=namespace) + except Exception as e: + logger.exception("Error handling event newhbstatus: %s", e) + await sio.emit('event_error', + {'error': str(e)}, + room=sid, + namespace=namespace) + + @sio.on('newventvalvestatus', namespace=namespace) + async def get_newventvalvestatus(sid, data): + try: + manager = EngineServiceManager() + response = manager.get_newventvalvestatus() + await sio.emit('newventvalvestatus', + {'event_name': 'newventvalvestatus', 'response': response}, + room=sid, + namespace=namespace) + except Exception as e: + logger.exception("Error handling event newventvalvestatus: %s", e) + await sio.emit('event_error', + {'error': str(e)}, + room=sid, + namespace=namespace) + diff --git a/api/envapp/router.py b/api/envapp/router.py index e69de29b..03937744 100644 --- a/api/envapp/router.py +++ b/api/envapp/router.py @@ -0,0 +1,55 @@ + +from fastapi import APIRouter, Body, HTTPException +from fastapi.responses import JSONResponse +from loguru import logger +from proxy.app.dataclasses.envapp_dataclass import (GetLowerTankTempOut, GetUpperTankTempOut, GetTankPressureOut) +from proxy.app.services.envapp import EnvAppManager +from api.common import process_method_result + +router = APIRouter( + prefix="/envapp", + tags=["envapp"] +) + + +@router.post("/getlowertanktemp") +async def getlowertanktemp(data: dict = Body(...)): + try: + service_manager = EnvAppManager() + params = data or {} + method_result = await service_manager.GetLowerTankTemp(**params) + return process_method_result(method_result, deserialization_class=GetLowerTankTempOut) + except Exception as e: + logger.exception("Error in getlowertanktemp handler: %s", e) + return JSONResponse( + status_code=500, + content={"error": str(e)} + ) + +@router.post("/gettankpressure") +async def gettankpressure(data: dict = Body(...)): + try: + service_manager = EnvAppManager() + params = data or {} + method_result = await service_manager.GetTankPressure(**params) + return process_method_result(method_result, deserialization_class=GetTankPressureOut) + except Exception as e: + logger.exception("Error in gettankpressure handler: %s", e) + return JSONResponse( + status_code=500, + content={"error": str(e)} + ) + +@router.post("/getuppertanktemp") +async def getuppertanktemp(data: dict = Body(...)): + try: + service_manager = EnvAppManager() + params = data or {} + method_result = await service_manager.GetUpperTankTemp(**params) + return process_method_result(method_result, deserialization_class=GetUpperTankTempOut) + except Exception as e: + logger.exception("Error in getuppertanktemp handler: %s", e) + return JSONResponse( + status_code=500, + content={"error": str(e)} + ) diff --git a/api/fcfileloggerapp/__init__.py b/api/fcfileloggerapp/__init__.py new file mode 100644 index 00000000..fa056a42 --- /dev/null +++ b/api/fcfileloggerapp/__init__.py @@ -0,0 +1 @@ +# Package for fcfileloggerapp API diff --git a/api/fcfileloggerapp/router.py b/api/fcfileloggerapp/router.py new file mode 100644 index 00000000..576a01b0 --- /dev/null +++ b/api/fcfileloggerapp/router.py @@ -0,0 +1,41 @@ + +from fastapi import APIRouter, Body, HTTPException +from fastapi.responses import JSONResponse +from loguru import logger +from proxy.app.dataclasses.fcfileloggerapp_dataclass import (StopOut, StartOut) +from proxy.app.services.fcfileloggerapp import FcFileLoggerAppManager +from api.common import process_method_result + +router = APIRouter( + prefix="/fcfileloggerapp", + tags=["fcfileloggerapp"] +) + + +@router.post("/start") +async def start(data: dict = Body(...)): + try: + service_manager = FcFileLoggerAppManager() + params = data or {} + method_result = await service_manager.Start(**params) + return process_method_result(method_result, deserialization_class=StartOut) + except Exception as e: + logger.exception("Error in start handler: %s", e) + return JSONResponse( + status_code=500, + content={"error": str(e)} + ) + +@router.post("/stop") +async def stop(data: dict = Body(...)): + try: + service_manager = FcFileLoggerAppManager() + params = data or {} + method_result = await service_manager.Stop(**params) + return process_method_result(method_result, deserialization_class=StopOut) + except Exception as e: + logger.exception("Error in stop handler: %s", e) + return JSONResponse( + status_code=500, + content={"error": str(e)} + ) diff --git a/api/fcfileloggerapp/socketio.py b/api/fcfileloggerapp/socketio.py new file mode 100644 index 00000000..273b49a8 --- /dev/null +++ b/api/fcfileloggerapp/socketio.py @@ -0,0 +1,36 @@ + +from socketio import AsyncServer +from loguru import logger +from proxy.app.services.fcfileloggerapp import FcFileLoggerAppManager + +namespace = '/fcfileloggerapp' + +def register_fcfileloggerapp_socketio(sio: AsyncServer): + @sio.on('connect', namespace=namespace) + async def connect(sid, environ): + await sio.emit('connected', + {"message": "Connected to fcfileloggerapp namespace"}, + room=sid, + namespace=namespace) + + @sio.on('disconnect', namespace=namespace) + async def disconnect(sid): + logger.info("Client %s disconnected from fcfileloggerapp namespace", sid) + + + @sio.on('loggingstate', namespace=namespace) + async def get_loggingstate(sid, data): + try: + manager = FcFileLoggerAppManager() + response = manager.get_loggingstate() + await sio.emit('loggingstate', + {'event_name': 'loggingstate', 'response': response}, + room=sid, + namespace=namespace) + except Exception as e: + logger.exception("Error handling event loggingstate: %s", e) + await sio.emit('event_error', + {'error': str(e)}, + room=sid, + namespace=namespace) + diff --git a/api/fileloggerapp/router.py b/api/fileloggerapp/router.py index 34ba8da5..1051259c 100644 --- a/api/fileloggerapp/router.py +++ b/api/fileloggerapp/router.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Body, HTTPException from fastapi.responses import JSONResponse from loguru import logger -from proxy.app.dataclasses.fileloggerapp_dataclass import (StartOut, StopOut) +from proxy.app.dataclasses.fileloggerapp_dataclass import (StopOut, StartOut) from proxy.app.services.fileloggerapp import FileLoggerAppManager from api.common import process_method_result diff --git a/api/primerservice/router.py b/api/primerservice/router.py index 3ef7f9f1..16cfff69 100644 --- a/api/primerservice/router.py +++ b/api/primerservice/router.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Body, HTTPException from fastapi.responses import JSONResponse from loguru import logger -from proxy.app.dataclasses.primerservice_dataclass import (OnPrimeOut, OffPrimeOut, StartPrimeOut) +from proxy.app.dataclasses.primerservice_dataclass import (GetPrimerStateOut, OffPrimeOut, OnPrimeOut, StartPrimeOut) from proxy.app.services.primerservice import PrimerServiceManager from api.common import process_method_result @@ -12,6 +12,20 @@ ) +@router.post("/getprimerstate") +async def getprimerstate(data: dict = Body(...)): + try: + service_manager = PrimerServiceManager() + params = data or {} + method_result = await service_manager.GetPrimerState(**params) + return process_method_result(method_result, deserialization_class=GetPrimerStateOut) + except Exception as e: + logger.exception("Error in getprimerstate handler: %s", e) + return JSONResponse( + status_code=500, + content={"error": str(e)} + ) + @router.post("/offprime") async def offprime(data: dict = Body(...)): try: diff --git a/api/save_to_file/router.py b/api/save_to_file/router.py index d8fb4e82..ae3be6f0 100644 --- a/api/save_to_file/router.py +++ b/api/save_to_file/router.py @@ -16,6 +16,7 @@ from proxy.app.services.primerservice import PrimerServiceManager from proxy.app.services.fcsysstatservice import FcSysStatServiceManager from proxy.app.services.mainservice import MainServiceManager +from proxy.app.services.fcfileloggerapp import FcFileLoggerAppManager # Get the project root directory (parent of 'api' directory) current_file_dir = os.path.dirname(os.path.abspath(__file__)) @@ -30,7 +31,7 @@ csv_lock = asyncio.Lock() -managers = [EngineServiceManager(), EnvAppManager(), ServoServiceManager(), SysStatServiceManager(), EnvAppFcManager(), RecoveryServiceManager(), GPSServiceManager(), PrimerServiceManager(), FcSysStatServiceManager(), MainServiceManager()] +managers = [FcFileLoggerAppManager() ,EngineServiceManager(), EnvAppManager(), ServoServiceManager(), SysStatServiceManager(), EnvAppFcManager(), RecoveryServiceManager(), GPSServiceManager(), PrimerServiceManager(), FcSysStatServiceManager(), MainServiceManager()] # Task tracking save_task = None diff --git a/api/servoservice/router.py b/api/servoservice/router.py index 5477388b..f2dce484 100644 --- a/api/servoservice/router.py +++ b/api/servoservice/router.py @@ -2,7 +2,7 @@ from fastapi import APIRouter, Body, HTTPException from fastapi.responses import JSONResponse from loguru import logger -from proxy.app.dataclasses.servoservice_dataclass import (ReadMainServoValueOut, SetVentServoValueOut, ReadDumpValueOut, SetDumpValueOut, ReadVentServoValueOut, SetMainServoValueOut) +from proxy.app.dataclasses.servoservice_dataclass import (SetVentServoValueOut, ReadDumpValueOut, SetMainServoValueOut, ReadMainServoValueOut, ReadVentServoValueOut, SetDumpValueOut) from proxy.app.services.servoservice import ServoServiceManager from api.common import process_method_result diff --git a/desktop/data/csv/data.csv b/desktop/data/csv/data.csv new file mode 100644 index 00000000..2be5a9c3 --- /dev/null +++ b/desktop/data/csv/data.csv @@ -0,0 +1,27 @@ +timestamp,currentmode,newboardtempevent1,newboardtempevent2,newboardtempevent3,newdpressevent,newpressevent,newtempevent_1,newtempevent_2,newtempevent_3,newtensoevent,servodumpstatusevent,servostatusevent,servoventstatusevent,newsystemusage,newbme280event,newboardtempevent_1,newboardtempevent_2,newboardtempevent_3,newparachutestatusevent,gpsstatusevent,primestatusevent,newsystemusage,currentmodestatusevent +20:39:49.322026,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:49.429321,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:49.536239,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:49.644243,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:49.752508,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:49.860218,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:49.969078,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:50.078250,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:50.185476,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:50.295754,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:50.404576,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:50.515110,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:50.625011,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:50.733640,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:50.842295,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:50.951425,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:51.059143,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:51.169295,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:51.276101,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:51.385436,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:51.492021,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:51.600668,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:51.708092,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:51.816189,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:51.925023,2,,,,,15,,72,,,,,,,,,,,,,,, +20:39:52.031943,2,,,,,15,,72,,,,,,,,,,,,,,, diff --git a/desktop/lib/views/home.dart b/desktop/lib/views/home.dart index 87c640a8..aa69b787 100644 --- a/desktop/lib/views/home.dart +++ b/desktop/lib/views/home.dart @@ -20,12 +20,30 @@ class Home extends StatelessWidget { "name": "SetMode", "id": 2, "in_type": "uint8" + }, + { + "name": "GetMode", + "id": 3, + "in_type": "void" + }, + { + "name": "SetVentValve", + "id": 4, + "in_type": "uint8" } ], "events": [ { "name": "CurrentMode", "id": 32769 + }, + { + "name": "NewVentValveStatus", + "id": 32770 + }, + { + "name": "NewHBStatus", + "id": 32771 } ] }; @@ -33,6 +51,23 @@ class Home extends StatelessWidget { final Map EnvApp = { "serviceName": "EnvApp", "serviceId": 514, + "methods": [ + { + "name": "GetTankPressure", + "id": 1, + "in_type": "void" + }, + { + "name": "GetUpperTankTemp", + "id": 2, + "in_type": "void" + }, + { + "name": "GetLowerTankTemp", + "id": 3, + "in_type": "void" + } + ], "events": [ { "name": "newTempEvent_1", @@ -107,6 +142,29 @@ class Home extends StatelessWidget { ] }; + final Map FcFileLoggerApp = { + "serviceName": "FcFileLoggerApp", + "serviceId": 531, + "methods": [ + { + "name": "Start", + "id": 1, + "in_type": "void" + }, + { + "name": "Stop", + "id": 2, + "in_type": "void" + } + ], + "events": [ + { + "name": "LoggingState", + "id": 32769 + } + ] + }; + final Map MainService = { "serviceName": "MainService", "serviceId": 521, @@ -127,7 +185,13 @@ class Home extends StatelessWidget { final Map RadioService = { "serviceName": "RadioService", - "serviceId": 530 + "serviceId": 530, + "events": [ + { + "name": "RadioStatusEvent", + "id": 32769 + } + ] }; final Map RecoveryService = { @@ -205,6 +269,11 @@ class Home extends StatelessWidget { "name": "StartPrime", "id": 3, "in_type": "void" + }, + { + "name": "GetPrimerState", + "id": 4, + "in_type": "void" } ], "events": [ @@ -276,6 +345,7 @@ class Home extends StatelessWidget { } ] }; + final services = [ EnvApp, ServoService, @@ -287,7 +357,8 @@ class Home extends StatelessWidget { RecoveryService, GPSService, FcSysStatService, - MainService + MainService, + FcFileLoggerApp ]; return Container( diff --git a/desktop/pubspec.lock b/desktop/pubspec.lock index 130f60b6..541acaae 100644 --- a/desktop/pubspec.lock +++ b/desktop/pubspec.lock @@ -268,10 +268,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "45caa6c5917fa127b5dbcfbd1fa60b14e583afdc08bfc96dda38886ca252eb60" + sha256: "046d3928e16fa4dc46e8350415661755ab759d9fc97fc21b5ab295f71e4f0499" url: "https://pub.dev" source: hosted - version: "15.0.2" + version: "15.1.0" web: dependency: transitive description: diff --git a/proxy/app/config.json b/proxy/app/config.json index 92df5b38..9aeeb158 100644 --- a/proxy/app/config.json +++ b/proxy/app/config.json @@ -1,7 +1,7 @@ { "MULTICAST_GROUP": "224.224.224.245", - "INTERFACE_IP": "192.168.10.100", + "INTERFACE_IP": "192.168.10.49", "INTERFACE_IP_FINAL": "10.101.0.1", "SD_PORT": 30490, - "NEXT_PORT": 10306 + "NEXT_PORT": 10319 } \ No newline at end of file diff --git a/proxy/app/dataclasses/engineservice_dataclass.py b/proxy/app/dataclasses/engineservice_dataclass.py index 910d8293..48d40a02 100644 --- a/proxy/app/dataclasses/engineservice_dataclass.py +++ b/proxy/app/dataclasses/engineservice_dataclass.py @@ -2,6 +2,7 @@ from someipy.serialization import ( SomeIpPayload, Bool, + Uint16, Uint8, ) @@ -40,6 +41,36 @@ def from_json(self, json_argument): self.data.value = bool(json_argument) +@dataclass +class GetModeIn(SomeIpPayload): + data: bytes = b'' + + +@dataclass +class GetModeOut(SomeIpPayload): + data: Uint8 + def __init__(self): + self.data = Uint8() + + def from_json(self, json_argument): + self.data.value = int(json_argument) + + +@dataclass +class SetVentValveIn(SomeIpPayload): + data: Uint8 + def __init__(self): + self.data = Uint8() + + def from_json(self, json_argument): + self.data.value = int(json_argument) + + +@dataclass +class SetVentValveOut(SomeIpPayload): + data: bytes = b'' + + @dataclass class CurrentModeOut(SomeIpPayload): data: Uint8 @@ -48,3 +79,23 @@ def __init__(self): def from_json(self, json_argument): self.data.value = int(json_argument) + + +@dataclass +class NewVentValveStatusOut(SomeIpPayload): + data: Uint8 + def __init__(self): + self.data = Uint8() + + def from_json(self, json_argument): + self.data.value = int(json_argument) + + +@dataclass +class NewHBStatusOut(SomeIpPayload): + data: Uint16 + def __init__(self): + self.data = Uint16() + + def from_json(self, json_argument): + self.data.value = int(json_argument) diff --git a/proxy/app/dataclasses/envapp_dataclass.py b/proxy/app/dataclasses/envapp_dataclass.py index 097d4a81..c6a95120 100644 --- a/proxy/app/dataclasses/envapp_dataclass.py +++ b/proxy/app/dataclasses/envapp_dataclass.py @@ -6,6 +6,51 @@ Uint16, ) +@dataclass +class GetTankPressureIn(SomeIpPayload): + data: bytes = b'' + + +@dataclass +class GetTankPressureOut(SomeIpPayload): + data: Uint16 + def __init__(self): + self.data = Uint16() + + def from_json(self, json_argument): + self.data.value = int(json_argument) + + +@dataclass +class GetUpperTankTempIn(SomeIpPayload): + data: bytes = b'' + + +@dataclass +class GetUpperTankTempOut(SomeIpPayload): + data: Uint16 + def __init__(self): + self.data = Uint16() + + def from_json(self, json_argument): + self.data.value = int(json_argument) + + +@dataclass +class GetLowerTankTempIn(SomeIpPayload): + data: bytes = b'' + + +@dataclass +class GetLowerTankTempOut(SomeIpPayload): + data: Uint16 + def __init__(self): + self.data = Uint16() + + def from_json(self, json_argument): + self.data.value = int(json_argument) + + @dataclass class NewTempEvent_1Out(SomeIpPayload): data: Sint16 diff --git a/proxy/app/dataclasses/fcfileloggerapp_dataclass.py b/proxy/app/dataclasses/fcfileloggerapp_dataclass.py new file mode 100644 index 00000000..48b00590 --- /dev/null +++ b/proxy/app/dataclasses/fcfileloggerapp_dataclass.py @@ -0,0 +1,45 @@ +from dataclasses import dataclass +from someipy.serialization import ( + SomeIpPayload, + Bool, + Uint8, +) + +@dataclass +class StartIn(SomeIpPayload): + data: bytes = b'' + + +@dataclass +class StartOut(SomeIpPayload): + data: Bool + def __init__(self): + self.data = Bool() + + def from_json(self, json_argument): + self.data.value = bool(json_argument) + + +@dataclass +class StopIn(SomeIpPayload): + data: bytes = b'' + + +@dataclass +class StopOut(SomeIpPayload): + data: Bool + def __init__(self): + self.data = Bool() + + def from_json(self, json_argument): + self.data.value = bool(json_argument) + + +@dataclass +class LoggingStateOut(SomeIpPayload): + data: Uint8 + def __init__(self): + self.data = Uint8() + + def from_json(self, json_argument): + self.data.value = int(json_argument) diff --git a/proxy/app/dataclasses/fcsysstatservice_dataclass.py b/proxy/app/dataclasses/fcsysstatservice_dataclass.py index 3701dff6..7fe61bfd 100644 --- a/proxy/app/dataclasses/fcsysstatservice_dataclass.py +++ b/proxy/app/dataclasses/fcsysstatservice_dataclass.py @@ -3,14 +3,14 @@ SomeIpPayload, ) from .structs import ( - SysStatType, + FcSysStatType, ) @dataclass class NewSystemUsageOut(SomeIpPayload): - data: SysStatType + data: FcSysStatType def __init__(self): - self.data = SysStatType() + self.data = FcSysStatType() def from_json(self, json_argument): self.data.from_json(json_argument) diff --git a/proxy/app/dataclasses/primerservice_dataclass.py b/proxy/app/dataclasses/primerservice_dataclass.py index a11ad7e8..ce1861e3 100644 --- a/proxy/app/dataclasses/primerservice_dataclass.py +++ b/proxy/app/dataclasses/primerservice_dataclass.py @@ -50,6 +50,21 @@ def from_json(self, json_argument): self.data.value = bool(json_argument) +@dataclass +class GetPrimerStateIn(SomeIpPayload): + data: bytes = b'' + + +@dataclass +class GetPrimerStateOut(SomeIpPayload): + data: Uint8 + def __init__(self): + self.data = Uint8() + + def from_json(self, json_argument): + self.data.value = int(json_argument) + + @dataclass class PrimeStatusEventOut(SomeIpPayload): data: Uint8 diff --git a/proxy/app/dataclasses/radioservice_dataclass.py b/proxy/app/dataclasses/radioservice_dataclass.py index 625d318d..69dd4a78 100644 --- a/proxy/app/dataclasses/radioservice_dataclass.py +++ b/proxy/app/dataclasses/radioservice_dataclass.py @@ -2,4 +2,19 @@ from someipy.serialization import ( SomeIpPayload, ) +from .structs import ( + RadioDataType, +) + +@dataclass +class RadioStatusEventOut(SomeIpPayload): + data: RadioDataType + def __init__(self): + self.data = RadioDataType() + + def from_json(self, json_argument): + self.data.from_json(json_argument) + def deserialize(self, payload: bytes): + self.data.deserialize(payload) + return self \ No newline at end of file diff --git a/proxy/app/dataclasses/structs.py b/proxy/app/dataclasses/structs.py index 6ebd0f3b..8ffa0281 100644 --- a/proxy/app/dataclasses/structs.py +++ b/proxy/app/dataclasses/structs.py @@ -1,6 +1,8 @@ from dataclasses import dataclass from someipy.serialization import ( Float32, + Uint16, + Uint8, ) @dataclass @@ -20,7 +22,6 @@ def from_json(self, json_obj): self.disk_utilization.value = float(json_obj['disk_utilization']) def deserialize(self, payload: bytes): - # ECU wysyƂa 3 x float32 w little-endian from struct import unpack self.mem_usage.value, self.cpu_usage.value, self.disk_utilization.value = unpack( " None: event_group = EventGroup( - id=32769, event_ids=[32769] + id=32769, event_ids=[32769, 32770, 32771] ) engineservice = ( @@ -56,7 +62,7 @@ async def setup_manager(self) -> None: self.instance = await construct_client_service_instance( service=engineservice, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10297), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10309), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, @@ -75,6 +81,20 @@ def event_callback(self, someip_message: SomeIpMessage) -> None: except Exception as e: logger.exception(f"Error in deserialization: {e}") + case 32770: + try: + NewVentValveStatus_msg = NewVentValveStatusOut().deserialize(someip_message.payload) + self.newventvalvestatus = NewVentValveStatus_msg.data.value + except Exception as e: + logger.exception(f"Error in deserialization: {e}") + + case 32771: + try: + NewHBStatus_msg = NewHBStatusOut().deserialize(someip_message.payload) + self.newhbstatus = NewHBStatus_msg.data.value + except Exception as e: + logger.exception(f"Error in deserialization: {e}") + async def shutdown(self): if self.instance: await self.instance.close() @@ -82,6 +102,12 @@ async def shutdown(self): def get_currentmode(self): return self.currentmode + def get_newventvalvestatus(self): + return self.newventvalvestatus + + def get_newhbstatus(self): + return self.newhbstatus + async def Start(self): await self.find_service() method_result = await self.instance.call_method( @@ -100,6 +126,24 @@ async def SetMode(self, setmode): return method_result + async def GetMode(self): + await self.find_service() + method_result = await self.instance.call_method( + 3, b'' + ) + + return method_result + + async def SetVentValve(self, setventvalve): + await self.find_service() + setventvalve_msg = SetVentValveIn() + setventvalve_msg.from_json(setventvalve) + method_result = await self.instance.call_method( + 4, setventvalve_msg.serialize() + ) + + return method_result + async def initialize_engineservice(sd): service_manager = EngineServiceManager() service_manager.assign_service_discovery(sd) diff --git a/proxy/app/services/envapp.py b/proxy/app/services/envapp.py index 0d774db8..e64a5fd4 100644 --- a/proxy/app/services/envapp.py +++ b/proxy/app/services/envapp.py @@ -20,6 +20,9 @@ from proxy.app.dataclasses.envapp_dataclass import NewBoardTempEvent2Out from proxy.app.dataclasses.envapp_dataclass import NewBoardTempEvent3Out from proxy.app.dataclasses.envapp_dataclass import NewTensoEventOut +from proxy.app.dataclasses.envapp_dataclass import GetTankPressureIn +from proxy.app.dataclasses.envapp_dataclass import GetUpperTankTempIn +from proxy.app.dataclasses.envapp_dataclass import GetLowerTankTempIn class EnvAppManager: __instance = None @@ -70,7 +73,7 @@ async def setup_manager(self) -> None: self.instance = await construct_client_service_instance( service=envapp, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10295), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10307), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, @@ -176,6 +179,30 @@ def get_newboardtempevent3(self): def get_newtensoevent(self): return self.newtensoevent + async def GetTankPressure(self): + await self.find_service() + method_result = await self.instance.call_method( + 1, b'' + ) + + return method_result + + async def GetUpperTankTemp(self): + await self.find_service() + method_result = await self.instance.call_method( + 2, b'' + ) + + return method_result + + async def GetLowerTankTemp(self): + await self.find_service() + method_result = await self.instance.call_method( + 3, b'' + ) + + return method_result + async def initialize_envapp(sd): service_manager = EnvAppManager() service_manager.assign_service_discovery(sd) diff --git a/proxy/app/services/envappfc.py b/proxy/app/services/envappfc.py index 2551b1db..3af5bb40 100644 --- a/proxy/app/services/envappfc.py +++ b/proxy/app/services/envappfc.py @@ -60,7 +60,7 @@ async def setup_manager(self) -> None: self.instance = await construct_client_service_instance( service=envappfc, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10300), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10312), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, diff --git a/proxy/app/services/fcfileloggerapp.py b/proxy/app/services/fcfileloggerapp.py new file mode 100644 index 00000000..d4c780d9 --- /dev/null +++ b/proxy/app/services/fcfileloggerapp.py @@ -0,0 +1,110 @@ + +import ipaddress +import asyncio +from loguru import logger + +from someipy import ( + construct_client_service_instance, + TransportLayerProtocol, + ServiceBuilder, + SomeIpMessage, + EventGroup +) +from proxy.app.settings import INTERFACE_IP +from proxy.app.dataclasses.fcfileloggerapp_dataclass import LoggingStateOut +from proxy.app.dataclasses.fcfileloggerapp_dataclass import StartIn +from proxy.app.dataclasses.fcfileloggerapp_dataclass import StopIn + +class FcFileLoggerAppManager: + __instance = None + + def __new__(cls, *args, **kwargs): + if not cls.__instance: + cls.__instance = super(FcFileLoggerAppManager, cls).__new__(cls) + return cls.__instance + + def __init__(self): + if not hasattr(self, 'initialized'): + self.service_discovery = None + self.initialized = False + self.instance = None + self.loggingstate = None + + async def find_service(self): + try: + while not self.instance or not self.instance.service_found(): + logger.debug("Waiting for service") + await asyncio.sleep(0.5) + except asyncio.CancelledError: + return + + def assign_service_discovery(self, new_sd): + self.service_discovery = new_sd + + async def setup_manager(self) -> None: + event_group = EventGroup( + id=32769, event_ids=[32769] + ) + + fcfileloggerapp = ( + ServiceBuilder() + .with_service_id(531) + .with_major_version(1).with_eventgroup(event_group) + .build() + ) + + self.instance = await construct_client_service_instance( + service=fcfileloggerapp, + instance_id=1, + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10315), + ttl=5, + sd_sender=self.service_discovery, + protocol=TransportLayerProtocol.UDP, + ) + self.service_discovery.attach(self.instance) + self.instance.register_callback(self.event_callback) + self.instance.subscribe_eventgroup(event_group.id) + self.service_discovery.attach(self.instance) + + def event_callback(self, someip_message: SomeIpMessage) -> None: + match someip_message.header.method_id: + case 32769: + try: + LoggingState_msg = LoggingStateOut().deserialize(someip_message.payload) + self.loggingstate = LoggingState_msg.data.value + except Exception as e: + logger.exception(f"Error in deserialization: {e}") + + async def shutdown(self): + if self.instance: + await self.instance.close() + + def get_loggingstate(self): + return self.loggingstate + + async def Start(self): + await self.find_service() + method_result = await self.instance.call_method( + 1, b'' + ) + + return method_result + + async def Stop(self): + await self.find_service() + method_result = await self.instance.call_method( + 2, b'' + ) + + return method_result + +async def initialize_fcfileloggerapp(sd): + service_manager = FcFileLoggerAppManager() + service_manager.assign_service_discovery(sd) + await service_manager.setup_manager() + try: + await asyncio.Future() + except asyncio.CancelledError: + logger.info("Shutting down...") + finally: + await service_manager.shutdown() diff --git a/proxy/app/services/fcsysstatservice.py b/proxy/app/services/fcsysstatservice.py index aa5d6dda..aa63e6b1 100644 --- a/proxy/app/services/fcsysstatservice.py +++ b/proxy/app/services/fcsysstatservice.py @@ -54,7 +54,7 @@ async def setup_manager(self) -> None: self.instance = await construct_client_service_instance( service=fcsysstatservice, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10301), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10313), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, diff --git a/proxy/app/services/fileloggerapp.py b/proxy/app/services/fileloggerapp.py index 6d34a608..96d065ee 100644 --- a/proxy/app/services/fileloggerapp.py +++ b/proxy/app/services/fileloggerapp.py @@ -56,7 +56,7 @@ async def setup_manager(self) -> None: self.instance = await construct_client_service_instance( service=fileloggerapp, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10298), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10310), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, diff --git a/proxy/app/services/gpsservice.py b/proxy/app/services/gpsservice.py index fc6362fd..56b85595 100644 --- a/proxy/app/services/gpsservice.py +++ b/proxy/app/services/gpsservice.py @@ -54,7 +54,7 @@ async def setup_manager(self) -> None: self.instance = await construct_client_service_instance( service=gpsservice, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10304), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10317), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, diff --git a/proxy/app/services/mainservice.py b/proxy/app/services/mainservice.py index 02d924b7..66791f23 100644 --- a/proxy/app/services/mainservice.py +++ b/proxy/app/services/mainservice.py @@ -55,7 +55,7 @@ async def setup_manager(self) -> None: self.instance = await construct_client_service_instance( service=mainservice, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10305), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10318), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, diff --git a/proxy/app/services/primerservice.py b/proxy/app/services/primerservice.py index 6f600cea..e79509a4 100644 --- a/proxy/app/services/primerservice.py +++ b/proxy/app/services/primerservice.py @@ -15,6 +15,7 @@ from proxy.app.dataclasses.primerservice_dataclass import OnPrimeIn from proxy.app.dataclasses.primerservice_dataclass import OffPrimeIn from proxy.app.dataclasses.primerservice_dataclass import StartPrimeIn +from proxy.app.dataclasses.primerservice_dataclass import GetPrimerStateIn class PrimerServiceManager: __instance = None @@ -57,7 +58,7 @@ async def setup_manager(self) -> None: self.instance = await construct_client_service_instance( service=primerservice, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10294), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10306), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, @@ -107,6 +108,14 @@ async def StartPrime(self): return method_result + async def GetPrimerState(self): + await self.find_service() + method_result = await self.instance.call_method( + 4, b'' + ) + + return method_result + async def initialize_primerservice(sd): service_manager = PrimerServiceManager() service_manager.assign_service_discovery(sd) diff --git a/proxy/app/services/radioservice.py b/proxy/app/services/radioservice.py index 59919ddc..35d610d3 100644 --- a/proxy/app/services/radioservice.py +++ b/proxy/app/services/radioservice.py @@ -11,6 +11,7 @@ EventGroup ) from proxy.app.settings import INTERFACE_IP +from proxy.app.dataclasses.radioservice_dataclass import RadioStatusEventOut class RadioServiceManager: __instance = None @@ -25,6 +26,7 @@ def __init__(self): self.service_discovery = None self.initialized = False self.instance = None + self.radiostatusevent = None async def find_service(self): try: @@ -37,30 +39,47 @@ async def find_service(self): def assign_service_discovery(self, new_sd): self.service_discovery = new_sd - async def setup_manager(self) -> None: + async def setup_manager(self) -> None: + event_group = EventGroup( + id=32769, event_ids=[32769] + ) radioservice = ( ServiceBuilder() .with_service_id(530) - .with_major_version(1) + .with_major_version(1).with_eventgroup(event_group) .build() ) self.instance = await construct_client_service_instance( service=radioservice, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10303), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10316), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, ) self.service_discovery.attach(self.instance) + self.instance.register_callback(self.event_callback) + self.instance.subscribe_eventgroup(event_group.id) self.service_discovery.attach(self.instance) + def event_callback(self, someip_message: SomeIpMessage) -> None: + match someip_message.header.method_id: + case 32769: + try: + RadioStatusEvent_msg = RadioStatusEventOut().deserialize(someip_message.payload) + self.radiostatusevent = [RadioStatusEvent_msg.data.rxerrors.value, RadioStatusEvent_msg.data.fixed.value, RadioStatusEvent_msg.data.rssi.value, RadioStatusEvent_msg.data.remrssi.value, RadioStatusEvent_msg.data.txbuf.value, RadioStatusEvent_msg.data.noise.value, RadioStatusEvent_msg.data.remnoise.value] + except Exception as e: + logger.exception(f"Error in deserialization: {e}") + async def shutdown(self): if self.instance: await self.instance.close() + def get_radiostatusevent(self): + return self.radiostatusevent + async def initialize_radioservice(sd): service_manager = RadioServiceManager() service_manager.assign_service_discovery(sd) diff --git a/proxy/app/services/recoveryservice.py b/proxy/app/services/recoveryservice.py index 53389a86..398e7dea 100644 --- a/proxy/app/services/recoveryservice.py +++ b/proxy/app/services/recoveryservice.py @@ -56,7 +56,7 @@ async def setup_manager(self) -> None: self.instance = await construct_client_service_instance( service=recoveryservice, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10302), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10314), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, diff --git a/proxy/app/services/servoservice.py b/proxy/app/services/servoservice.py index 468a7097..6ac98594 100644 --- a/proxy/app/services/servoservice.py +++ b/proxy/app/services/servoservice.py @@ -64,7 +64,7 @@ async def setup_manager(self) -> None: self.instance = await construct_client_service_instance( service=servoservice, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10299), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10311), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, diff --git a/proxy/app/services/sysstatservice.py b/proxy/app/services/sysstatservice.py index 8f278496..d3d6a0ec 100644 --- a/proxy/app/services/sysstatservice.py +++ b/proxy/app/services/sysstatservice.py @@ -54,7 +54,7 @@ async def setup_manager(self) -> None: self.instance = await construct_client_service_instance( service=sysstatservice, instance_id=1, - endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10296), + endpoint=(ipaddress.IPv4Address(INTERFACE_IP), 10308), ttl=5, sd_sender=self.service_discovery, protocol=TransportLayerProtocol.UDP, diff --git a/proxy/parsers/gen_api.py b/proxy/parsers/gen_api.py index c8a44af1..85c6bd00 100644 --- a/proxy/parsers/gen_api.py +++ b/proxy/parsers/gen_api.py @@ -11,6 +11,7 @@ from proxy.app.services.sysstatservice import SysStatServiceManager from proxy.app.services.envappfc import EnvAppFcManager from proxy.app.services.fcsysstatservice import FcSysStatServiceManager +from proxy.app.services.fcfileloggerapp import FcFileLoggerAppManager API_BASE_DIR = os.path.join(os.path.dirname(__file__), "../../api") @@ -163,6 +164,7 @@ def generate_service_code(manager): SysStatServiceManager, RecoveryServiceManager, FcSysStatServiceManager, + FcFileLoggerAppManager ] for ManagerClass in manager_classes: diff --git a/system_definition b/system_definition index a8d7eb6f..bf6de725 160000 --- a/system_definition +++ b/system_definition @@ -1 +1 @@ -Subproject commit a8d7eb6fc70f8c27739100b163c2937a0db58742 +Subproject commit bf6de7258008405286801b1b33fc960478481290