added my Recipes

This commit is contained in:
2024-07-11 14:16:35 +02:00
parent 38bc4f53ac
commit 09b621d929
7118 changed files with 525762 additions and 3 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 99 KiB

View File

@@ -0,0 +1,42 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="/favicon.ico" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="theme-color" content="#000000" />
<meta
name="description"
content="Markus Lehr | VR Predictive Maintenance Device."
/>
<meta
data-rh="true"
property="og:image"
content="https://refine.dev/img/refine_social.png"
/>
<meta
data-rh="true"
name="twitter:image"
content="https://refine.dev/img/refine_social.png"
/>
<title>
Markus Lehr | VR Predictive Maintenance Device.
</title>
<script type="module" crossorigin src="/assets/index-952960a4.js"></script>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
<!--
This HTML file is a template.
If you open it directly in the browser, you will see an empty page.
You can add webfonts, meta tags, or analytics to this file.
The build step will place the bundled scripts into the <body> tag.
To begin the development, run `npm dev` or `yarn start`.
To create a production bundle, use `npm run build` or `yarn build`.
-->
</body>
</html>

View File

@@ -0,0 +1,11 @@
class VRPMDV_CreateMonCmd:
def __init__(self, samplerate, sampleperiod, downtime) :
self.cmdid = 1
self.samplerate = samplerate
self.sampleperiod = sampleperiod
self.downtime = downtime

View File

@@ -0,0 +1,50 @@
import uuid
import datetime as dt
from marshmallow import Schema, fields, post_load, post_dump
from vrpmdvcreatemoncmd import VRPMDV_CreateMonCmd
# class VRPMDV_CreateMonSchema(Schema):
# cmdid = fields.Integer()
# id = fields.UUID()
# samplerate = fields.Integer()
# sampleperiod = fields.Integer()
# downtime = fields.Integer()
# status = fields.String()
# #monstate = fields.Enum(VRPMDVMonitoringState)
# # def get_envelope_key(self, many):
# # """Helper to get the envelope key."""
# # key = self.__envelope__["many"] if many else self.__envelope__["single"]
# # assert key is not None, "Envelope key undefined"
# # return key
# # @post_dump(pass_many=True)
# # def wrap_with_envelope(self, data, many, **kwargs):
# # key = self.get_envelope_key(many)
# # return {key: data}
# @post_load
# def make_vrpmdv_Monitoring(self, data, **kwargs):
# mon = VRPMDV_Monitoring(**data)
# return mon
class VRPMDV_CreateMonSchema(Schema):
cmdid = fields.Integer()
samplerate = fields.Integer()
sampleperiod = fields.Integer()
downtime = fields.Integer()
@post_load
def make_vrpmdv_CreateMonitoring(self, data, **kwargs):
mon = VRPMDV_CreateMonCmd(**data)
return mon

View File

@@ -0,0 +1,485 @@
import os
import time
from uuid import uuid4
import uuid
from flask import jsonify
import json
from marshmallow import EXCLUDE, ValidationError
#from vrpmdvcreatemoncmd import VRPMDV_CreateMonCmd
#from vrpmdvcreatemonschema import VRPMDV_CreateMonSchema
#from vrpmdvdeletemoncmd import VRPMDV_DeleteMonCmd
#from vrpmdvdeletemonschema import VRPMDV_DeleteMonSchema
from vrpmdvmonfilescompleteschema import VRPMDV_MonfilesCompleteSchema
from vrpmdvmonfilter import VRPMDV_MonFilter
from vrpmdvmonfilterschema import VRPMDV_MonFilterSchema
from vrpmdvmonsensorschema import VRPMDV_MonSensorSchema
from vrpmdvmonchannelschema import VRPMDV_MonChannelSchema
from vrpmdvmonfilesschema import VRPMDV_MonfilesSchema
from vrpmdvmonitoring import VRPMDV_Monitoring
from vrpmdvmonitoringschema import VRPMDV_MonitoringSchema
from vrpmdvmonreqschema import VRPMDV_MonReqSchema
# from vrpmdvntlink import trySend
from extensions.rt_service import rt_service as rts
from vrpmdvmonitoringState import VRPMDVMonitoringState
#from vrpmdvlogging import createCoproLoggingTask
import logging
class VRPMDV_Data:
def __init__(self):
#self.loaded = False
format = "%(asctime)s: %(message)s"
logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
self.mons:list = []
#TODO ML: uncomment this lines
self.rtservice = rts.RT_Service()
if (self.rtservice != None):
logging.info("init: initCoproFW")
self.rtservice.initCoproFW("home/root/elffile","zephyr_openamp_rsc_table.elf")
self.logTask = None #createCoproLoggingTask()
self.loaded = self.loadFile()
self.monfilespath = '/home/root/monfiles/'
#start the monitorings
time.sleep(1)
self.startMons();
def loadFile(self):
try:
with open('./mons.json', 'r') as f:
fmons = f.read()
if not fmons:
# return no Item
return True
else:
# data = json.loads(fmons)
schema = VRPMDV_MonitoringSchema(many=True)
#res = schema.loads(fmons) # data
self.mons = schema.loads(fmons) # .append(res)
return True
except:
#nothing todo ML we should create a file later the database
print("file not found")
def saveFile(self):
try:
with open('./mons.json', 'w') as f:
schema = VRPMDV_MonitoringSchema()
result = schema.dumps(self.mons, many=True)
f.write(result)
return True
except:
#nothing todo
print("could not write file")
def startMons(self):
try:
logging.info("MainThread: startMons")
# for i, val in enumerate(self.mons):
# if (val.status == 'started') :
# val.startMonitoring()
except:
print("could not start monitorings")
def findMon(mon):
return mon
def getMonitorings(self):
# 1st time read file
# if not self.loaded :
# self.loaded = self.loadFile()
schema = VRPMDV_MonitoringSchema()
result = schema.dumps(self.mons, many=True)
return result
def getMonitoring(self, vrpmid):
try:
matched_obj = next(x for x in self.mons if str(x.id) == vrpmid)
except:
return "no Item found"
# we find it and we return it
schema = VRPMDV_MonitoringSchema()
return schema.dumps(matched_obj)
def setMonitoring(self, id, request):
try:
matched_obj = next(x for x in self.mons if str(x.id) == id)
except:
return "no Item found"
if 'name' in request : matched_obj.name = request['name']
if 'samplerate' in request : matched_obj.samplerate = request['samplerate']
if 'sampleperiod' in request : matched_obj.sampleperiod = request['sampleperiod']
if 'downtime' in request : matched_obj.downtime = request['downtime']
if 'status' in request :
if (request['status'] == 'started'):
if (matched_obj.status == VRPMDVMonitoringState.STOPPED):
logging.info("MainThread: started %s", matched_obj.id)
matched_obj.startMonitoring()
# matched_obj.setStatus(self.createMonOnDevice(matched_obj))
elif (matched_obj.status == 'started') :
logging.info("MainThread: stopped %s", matched_obj.id)
# matched_obj.setStatus(self._stopMonitoring(matched_obj))
matched_obj.stopMonitoring()
self.saveFile()
# we find it and we return it
schema = VRPMDV_MonitoringSchema()
return schema.dumps(matched_obj)
def createMonitoring(self, request):
id = uuid.uuid4()
createjson = request.get_json()
vrpmreq = VRPMDV_MonReqSchema().load(createjson)
mon = VRPMDV_Monitoring(0, id, vrpmreq.name, vrpmreq.samplerate, vrpmreq.sampleperiod, vrpmreq.downtime, vrpmreq.status, vrpmreq.owner)
logging.info("Monitoring %s: creating", str(id))
# create Monitoring on the realtime side
if (vrpmreq.status == 'started'):
logging.info("Monitoring %s: createMonOnDevice", str(id))
mon.startMonitoring()
# status = self.createMonOnDevice(mon)
# logging.info("Monitoring %s: _start executed. status:%s", str(id), str(status))
# mon.status = status
self.mons.append(mon)
#save to file
self.saveFile()
#create result Object in json
schema = VRPMDV_MonitoringSchema()
return schema.dumps(mon)
def deleteMonitoring(self, vrpmid):
# if not self.loaded :
# self.loaded = self.loadFile()
# find monitoring with uuid
#result = filter(lambda mon: str(mon.uuid) == vrpmid["uuid"], self.mons)
try:
matched_obj = next(x for x in self.mons if str(x.id) == vrpmid)
except:
return "no Item found"
# we find it, delete on realtime side and now remove from list
matched_obj.stopMonitoring()
self.mons.remove(matched_obj)
#save the list
self.saveFile()
#make result
schema = VRPMDV_MonitoringSchema()
return schema.dump(matched_obj)
# internal helper function
# ML: transfer to Monitoring class
# def createMonOnDevice(self, monitoring):
# #call the start API of the c++ driver
# try:
# logging.info("MainThread: createMonOnDevice => before vrpmdCreateCmd samplerate:%d, samplerate:%d, samplerate:%d", monitoring.samplerate, monitoring.sampleperiod, monitoring.downtime)
# vrpmdCreateCmd = VRPMDV_CreateMonCmd(monitoring.samplerate, monitoring.sampleperiod, monitoring.downtime)
# logging.info("MainThread: createMonOnDevice => before schemaCreateCmd")
# schemaCreateCmd = VRPMDV_CreateMonSchema()
# logging.info("MainThread: try send start monitoring starting %s", schemaCreateCmd.dumps(vrpmdCreateCmd))
# #res = trySend(schemaCreateCmd.dumps(vrpmdCreateCmd))
# #logging.info("MainThread: try send start monitoring done %s", res)
# self.status = "started"
# # set status if we have a success TODO
# except:
# self.status = "stopped"
# return "stopped"
# return "started"
# def _stopMonitoring(self, monitoring):
# #call the stop API of the c++ driver
# try:
# logging.info("MainThread: stop monitoring")
# vrpmdDeleteCmd = VRPMDV_DeleteMonCmd(2, monitoring.id)
# schemaDeleteCmd = VRPMDV_DeleteMonSchema()
# #trySend(schemaDeleteCmd.dumps(vrpmdDeleteCmd))
# self.status = "stopped"
# logging.info("MainThread: stop monitoring done")
# except:
# self.status = "started"
# return "started"
# return monitoring.status
# old impl ML
#
# def createMonitoring(self, request):
# id = uuid.uuid4()
# createjson = request.get_json()
# vrpmreq = VRPMDV_MonReqSchema().load(createjson)
# vrpmdCreateCmd = VRPMDV_CreateMonCmd(1, id , vrpmreq.samplerate, vrpmreq.sampleperiod, vrpmreq.downtime, vrpmreq.status)
# schemaCreateCmd = VRPMDV_CreateMonSchema()
# valstr = schemaCreateCmd.dumps(vrpmdCreateCmd)
# trySend(schemaCreateCmd.dumps(vrpmdCreateCmd))
# mon = VRPMDV_Monitoring(id, vrpmreq.name, vrpmreq.samplerate, vrpmreq.sampleperiod, vrpmreq.downtime, vrpmreq.status, vrpmreq.owner)
# logging.info("Monitoring %s: starting", str(id))
# mon.startMonitoring()
# self.mons.append(mon)
# #save to file
# self.saveFile()
# #create result Object in json
# schema = VRPMDV_MonitoringSchema()
# return schema.dumps(mon)
# def createMonitoring(self, request):
# id = uuid.uuid4()
# createjson = request.get_json()
# vrpmreq = VRPMDV_MonReqSchema().load(createjson)
# vrpmdCreateCmd = VRPMDV_CreateMonCmd(1, id , vrpmreq.samplerate, vrpmreq.sampleperiod, vrpmreq.downtime, vrpmreq.status)
# schemaCreateCmd = VRPMDV_CreateMonSchema()
# valstr = schemaCreateCmd.dumps(vrpmdCreateCmd)
# trySend(schemaCreateCmd.dumps(vrpmdCreateCmd))
# mon = VRPMDV_Monitoring(id, vrpmreq.name, vrpmreq.samplerate, vrpmreq.sampleperiod, vrpmreq.downtime, vrpmreq.status, vrpmreq.owner)
# logging.info("Monitoring %s: starting", str(id))
# mon.startMonitoring()
# self.mons.append(mon)
# #save to file
# self.saveFile()
# #create result Object in json
# schema = VRPMDV_MonitoringSchema()
# return schema.dumps(mon)
# def deleteMonitoring(self, vrpmid):
# # if not self.loaded :
# # self.loaded = self.loadFile()
# # find monitoring with uuid
# #result = filter(lambda mon: str(mon.uuid) == vrpmid["uuid"], self.mons)
# try:
# matched_obj = next(x for x in self.mons if str(x.id) == vrpmid)
# except:
# return "no Item found"
# # we find it, delete on realtime side and now remove from list
# #matched_obj.deleteMonitoring()
# self.mons.remove(matched_obj)
# #save the list
# self.saveFile()
# #make result
# schema = VRPMDV_MonitoringSchema()
# return schema.dump(matched_obj)
# def startMonitoring(self, vrpmid):
# # if not self.loaded :
# # self.loaded = self.loadFile()
# #call the start API of the c++ driver
# try:
# matched_obj = next(x for x in self.mons if str(x.id) == vrpmid)
# except:
# return "no Item found"
# if matched_obj.startMonitoring() :
# #TODO ML return the state
# return "started"
# return "created"
# def stopMonitoring(self, vrpmid):
# # if not self.loaded :
# # self.loaded = self.loadFile()
# #call the stop API of the c++ driver
# try:
# matched_obj = next(x for x in self.mons if str(x.id) == vrpmid)
# logging.info("MainThread: stop monitoring starting")
# vrpmdDeleteCmd = VRPMDV_DeleteMonCmd(2, matched_obj.id)
# schemaDeleteCmd = VRPMDV_DeleteMonSchema()
# valstr = schemaDeleteCmd.dumps(vrpmdDeleteCmd)
# trySend(schemaDeleteCmd.dumps(vrpmdDeleteCmd))
# logging.info("MainThread: stop monitoring done")
# except:
# return "no Item found"
# matched_obj.stopMonitoring()
# return matched_obj.monstate.name
def setStatus(self, id, vrpmStatus):
if 'status' in vrpmStatus :
# matched_obj = self.findMonitoring(id)
#call the start API of the c++ driver
if (vrpmStatus['status'] == 'started'):
return self.startMonitoring(id)
else :
return self.stopMonitoring(id)
# return matched_obj.status
# return ""
def findMonitoring(self, id):
try:
return next(x for x in self.mons if str(x.id) == id)
except:
return None #"no Item found"
def getMonitoring2files(self):
#search in the given directory
dirs = [d for d in os.listdir(self.monfilespath) if os.path.isdir(d)]
#return for the filter
def getMonitoringfiles(self, id, params):
#search in the given directory
monId = params.get('monId')
logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
logging.info("getMonitoringfiles: monId:%s", monId)
if (monId == None):
return None
complete = False
mons = self.getMonofMonfiles(monId)
logging.info("getMonitoringfiles: mons.length:%d", len(mons))
if (len(mons) == 0) :
return None
else :
#TODO ML: only one monitoring
monId = mons[0].id
#TODO ML change to array
#for file in files:
filename = self.monfilespath + str(monId) + '/'
monfiles = self.loadMonfiles(filename, complete)
schema = VRPMDV_MonfilesSchema()
result = schema.dumps(monfiles, many=True)
return result
def loadMonfiles(self, id, complete):
#files = [f for f in os.listdir() if os.path.isfile(f)]
logging.info("loadMonfiles: monId:%s", id)
completeMonPath = os.path.dirname(id)
monfiles = []
for f in os.listdir(completeMonPath) :
# if (os.path.isfile(f)) :
try:
completeFilepath = id + str(f)
with open(completeFilepath, 'r') as f:
logging.info("loadMonfiles: before fmonfile:%s", completeFilepath)
fmonfile = f.read()
logging.info("loadMonfiles: after fmonfile:%s", completeFilepath)
if fmonfile:
# if (complete):
# schema = VRPMDV_MonfilesCompleteSchema()
# else :
logging.info("loadMonfiles: before schemaload")
if (complete):
schema = VRPMDV_MonfilesCompleteSchema()
else:
schema = VRPMDV_MonfilesSchema()
try:
monfile = schema.loads(fmonfile, unknown=EXCLUDE)
except ValidationError as err:
logging.info("SchemaError: %s",err.messages) # => {"email": ['"foo" is not a valid email address.']}
logging.info("Data: %s",err.valid_data) # => {"name": "John"}
monfiles.append(monfile)
except:
#nothing todo ML we should create a file later the database
print("file not found")
logging.info("loadMonfiles: file not found:%s", completeFilepath)
return monfiles
def getMonsDFAvalable(self):
monfilters = []
mons = self.getMonofMonfiles(0)
if (len(mons) == 0):
return None
else:
schema = VRPMDV_MonFilterSchema()
for mon in mons:
monfilter = VRPMDV_MonFilter(str(mon.id), mon.name)
monfilters.append(monfilter)
return schema.dumps(monfilters, many=True)
def getMonofMonfiles(self, monId) :
dirname = os.path.dirname(self.monfilespath)
dirs = []
for d in os.listdir(dirname) :
path_file = self.monfilespath + d #os.sep.join([self.monfilespath, d])
if os.path.isdir(path_file) :
dirs.append(d)
mons = []
for dir in dirs:
mon = self.findMonitoring(dir)
if ((mon != None) and ((monId == 0 ) or (monId == str(mon.id)))):
mons.append(mon)
# monId = mon.id
# else:
# return None
return mons
def getMFDownload(self, params):
#search in the given directory
monId = params.get('monId')
if (monId == None):
return None
fileId = params.get('fileid')
mons = self.getMonofMonfiles(monId)
#TODO ML change to array
#for file in files:
filename = self.monfilespath + str(monId) + '/'
monfiles = self.loadMonfiles(filename, True)
schema = VRPMDV_MonfilesCompleteSchema()
result = schema.dumps(monfiles, many=True)
return result
# This is to get the directory that the program
# is currently running in.
# dir_path = os.path.dirname(os.path.realpath(__file__))
# for root, dirs, files in os.walk(dir_path):
# for file in files:
# # change the extension from '.mp3' to
# # the one of your choice.
# if file.endswith('.mp3'):
# print (root+'/'+str(file))

View File

@@ -0,0 +1,10 @@
import datetime as dt
class VRPMDV_DeleteMonCmd:
def __init__(self, id ) :
self.cmdid = 2
self.id = id

View File

@@ -0,0 +1,23 @@
import uuid
import datetime as dt
from marshmallow import Schema, fields, post_load, post_dump
from vrpmdvdeletemoncmd import VRPMDV_DeleteMonCmd
class VRPMDV_DeleteMonSchema(Schema):
cmdid = fields.Integer()
id = fields.UUID()
@post_load
def make_vrpmdv_DeleteMonitoring(self, data, **kwargs):
mon = VRPMDV_DeleteMonCmd(**data)
return mon

View File

@@ -0,0 +1,10 @@
import datetime as dt
# generic command for delete, start, stop of the monitoring
class VRPMDV_GenericMonCmd:
def __init__(self, id , cmdId) :
self.id = id
self.cmdId = cmdId

View File

@@ -0,0 +1,34 @@
from extensions.rt_service import rt_service as rts
import logging
import threading
import time
def thread_function(name):
logging.info("Thread %s: starting", name)
rtserv = rts.RT_Service()
isok = rtserv.initLogChannel()
if (not isok):
logging.info("Thread %s: could not open the logport", name)
while (isok):
msg = rtserv.readLogChannel()
logging.info(msg)
if (msg == 'noResult'):
break
logging.info("Thread %s: finishing", name)
def createCoproLoggingTask():
format = "%(asctime)s: %(message)s"
logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
x = threading.Thread(target=thread_function, args=(1,))
x.start()
return x

View File

@@ -0,0 +1,9 @@
import datetime as dt
class VRPMDV_MonChannels:
def __init__(self, name , valuetype):
self.name = name
self.valuetype = valuetype

View File

@@ -0,0 +1,18 @@
import uuid
import datetime as dt
from marshmallow import Schema, fields, post_load, EXCLUDE
from vrpmdvmonchannels import VRPMDV_MonChannels
class VRPMDV_MonChannelSchema(Schema):
name = fields.String()
valuetype = fields.String()
#value = fields.Number()
@post_load
def make_vrpmdv_MonfilesChannelSchema(self, data, **kwargs):
return VRPMDV_MonChannels(**data)

View File

@@ -0,0 +1,35 @@
from extensions.rt_service import rt_service as rts
import logging
import threading
import time
def thread_function(name):
logging.info("MonThread %s: starting", name)
rtserv = rts.RT_Service()
isok = rtserv.openDataChannel('/dev/mon-datafile')
if (not isok):
logging.info("MonThread %s: could not open the logport", name)
while (isok):
msg = rtserv.readDataChannel()
logging.info(msg)
if (msg == 'noResult'):
break
logging.info("MonThread %s: finishing", name)
rtserv.closeDataChannel()
def createCoproLoggingTask():
format = "%(asctime)s: %(message)s"
logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
x = threading.Thread(target=thread_function, args=(1,))
x.start()
return x

View File

@@ -0,0 +1,15 @@
import datetime as dt
class VRPMDV_Monfiles:
def __init__(self, id, monid, name , samplerate, sampleperiod, downtime, timestamp, hwdescription) :
self.id = id
self.monid = monid
self.name = name
self.samplerate = samplerate
self.sampleperiod = sampleperiod
self.downtime = downtime
self.timestamp = timestamp
self.hwdescription = hwdescription

View File

@@ -0,0 +1,19 @@
import datetime as dt
from vrpmdvmonfiles import VRPMDV_Monfiles
class VRPMDV_MonfilesComplete(VRPMDV_Monfiles):
def __init__(self, id, monid, name , samplerate, sampleperiod, downtime, timestamp, hwdescription, values) :
self.id = id
self.monid = monid
self.name = name
self.samplerate = samplerate
self.sampleperiod = sampleperiod
self.downtime = downtime
self.timestamp = timestamp
self.hwdescription = hwdescription
self.values = values

View File

@@ -0,0 +1,39 @@
import uuid
import datetime as dt
from marshmallow import Schema, fields, post_load, EXCLUDE
from utilities.union import UnionField
from vrpmdvmonfilescomplete import VRPMDV_MonfilesComplete
from vrpmdvmonfilesschema import VRPMDV_MonfilesSchema
# books = fields.List(fields.Nested("BookSchema", exclude=("author",)))
class VRPMDV_MonfilesCompleteSchema(Schema):
id = fields.String(required=True)
monid = fields.String(required=True)
name = fields.String(required=True)
samplerate = fields.Integer(required=True)
sampleperiod = fields.Integer(required=True)
downtime = fields.Integer(required=True)
timestamp = fields.Integer(required=True)
hwdescription = fields.List(fields.Nested("VRPMDV_MonSensorSchema"))
values = fields.List(UnionField(
types=[int, float],
metadata={
"description": "Multiple types.",
},
))
@post_load
def make_vrpmdv_MonfilesCompleteSchema(self, data, **kwargs):
return VRPMDV_MonfilesComplete(**data)
# some_field = UnionField(
# types=[str, int, float, dict, list, bool, set, tuple],
# metadata={
# "description": "Multiple types.",
# },
# )

View File

@@ -0,0 +1,24 @@
import uuid
import datetime as dt
from marshmallow import Schema, fields, post_load, EXCLUDE
from vrpmdvmonfiles import VRPMDV_Monfiles
class VRPMDV_MonfilesSchema(Schema):
id = fields.String(required=True)
monid = fields.String(required=True)
name = fields.String(required=True)
samplerate = fields.Integer(required=True)
sampleperiod = fields.Integer(required=True)
downtime = fields.Integer(required=True)
timestamp = fields.Integer(required=True)
hwdescription = fields.List(fields.Nested("VRPMDV_MonSensorSchema"))
@post_load
def make_vrpmdv_Monfiles(self, data, **kwargs):
return VRPMDV_Monfiles(**data)

View File

@@ -0,0 +1,10 @@
import datetime as dt
class VRPMDV_MonFilter:
def __init__(self, id, name ) :
self.id = id
self.name = name

View File

@@ -0,0 +1,16 @@
import uuid
import datetime as dt
from marshmallow import Schema, fields, post_load
from vrpmdvmonfilter import VRPMDV_MonFilter
class VRPMDV_MonFilterSchema(Schema):
id = fields.String()
name = fields.String()
@post_load
def make_vrpmdv_MonFilter(self, data, **kwargs):
return VRPMDV_MonFilter(**data)

View File

@@ -0,0 +1,223 @@
import uuid
import datetime as dt
from marshmallow import Schema, fields, post_load
from vrpmdvcreatemoncmd import VRPMDV_CreateMonCmd
from vrpmdvcreatemonschema import VRPMDV_CreateMonSchema
from vrpmdvdeletemoncmd import VRPMDV_DeleteMonCmd
from vrpmdvdeletemonschema import VRPMDV_DeleteMonSchema
from vrpmdvmonreq import VRPMDV_MonReq
from extensions.rt_service import rt_service as rts
from vrpmdvmonitoringState import VRPMDVMonitoringState
from vrpmdvmondata import createCoproLoggingTask
# from vrpmdvntlink import trySend
import logging
import threading
import time
import io
import fcntl
import mmap
from vrpmdvntlink import trySend
from vrpmdvstatusmoncmd import VRPMDV_StatusMonCmd
from vrpmdvstatusmonschema import VRPMDV_StatusMonSchema
# def thread_function(name):
# logging.info("MonThread %s: starting", name)
# fdesc = -1
# rtMon = rts.RTSMonitoringTask()
# fdesc = rtMon.openChannel('/dev/mon-datafile')
# # write loginfos to Buffer
# msg = rtMon.getLogMsg()
# for msgstr in msg:
# logging.info(str(msgstr))
# while ((fdesc >= 0) && ()):
# msg = rtMon.readChannel(fdesc)
# # write loginfos to Buffer
# logmsg = rtMon.getLogMsg()
# for msgstr in logmsg:
# logging.info(str(msgstr))
# logging.info(msg)
# if (msg == 'noResult'):
# break
# logging.info("MonThread %s: finishing", name)
# rtMon.closeChannel(fdesc)
# if (res):
# props = res.getMsg()
# #props = res.getProps()
# if (res.getResCode() == 'error'):
# try:
# logging.info(props)
# # for key, value in props.items():
# # logging.info(key+" "+ str(value))
# except:
# logging.info("MonThread %s: could not open the channel", name)
# else:
# try:
# logging.info(props)
# # for key, value in props.items():
# # logging.info(key+" "+ str(value))
# except:
# logging.info("MonThread %s: could read fdesc of the channel", name)
# else :
# logging.info("MonThread %s: result = None", name)
class VRPMDV_Monitoring(VRPMDV_MonReq):
def __init__(self, no, id, name , samplerate, sampleperiod, downtime, status, owner="None", created_at=dt.datetime.now()) :
self.no = no
self.id = id
self.created_at = created_at
#TODO ML: uncomment
self.rtservice = None #rts.RT_Service()
self.rtMon = None
self.monTask = None
self.run_thread = False
self.fdesc = -1
super().__init__(name, samplerate, sampleperiod, downtime, owner, status)
def startMonitoring(self) :
#send create command to M4
try :
logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
logging.info("MainThread: createMonOnDevice => before vrpmdCreateCmd samplerate:%d, samplerate:%d, samplerate:%d", self.samplerate, self.sampleperiod, self.downtime)
vrpmdCreateCmd = VRPMDV_CreateMonCmd(self.samplerate, self.sampleperiod, self.downtime)
logging.info("MainThread: createMonOnDevice => before schemaCreateCmd")
schemaCreateCmd = VRPMDV_CreateMonSchema()
logging.info("MainThread: try send start monitoring starting %s", schemaCreateCmd.dumps(vrpmdCreateCmd))
# TODO ML: uncomment this
res = trySend(schemaCreateCmd.dumps(vrpmdCreateCmd))
#res = 'Test'
logging.info("MainThread: try send start monitoring done %s", res)
# start the receiving thread
logging.info("MainThread %s: open", str(self.id))
# self.fdesc = self.rtMon.openChannel('/dev/mon-datafile')
# self.run_thread = True
# self.monTask = threading.Thread(target=self.run, args=())
# self.monTask.start()
# logging.info("MainThread: strated Mon Thread %s started", self.id)
logging.info("startmonitoring: create RTSMonitoringTask")
strid = str(self.id)
logging.info("rts.RTSMonitoringTask: self.id:%s", strid)
self.rtMon = rts.RTSMonitoringTask(str(self.id), str(self.name), self.samplerate, self.sampleperiod, self.downtime, '/home/root/monfiles/')
# self.rtMon.id = self.id
# self.rtMon.name = self.name
# self.rtMon.samplerate = self.samplerate
# self.rtMon.samplePeriod = self.sampleperiod
# self.rtMon.downtime = self.downtime
# self.rtMon.path = '/home/root/monfiles'
#logging.info("startmonitoring: created RTSMonitoringTask: id:%s name:%s samplerate:%d sampleperiod:%d downtime:%d path:%s", self.rtMon.id, self.rtMon.name, self.rtMon.samplerate, self.rtMon.samplePeriod, self.rtMon.downtime, self.rtMon.path)
##new ML 09.07.2024
if (self.rtMon.start()) :
logging.info("startmonitoring - self.rtMon.start(): Monitoring started")
self.status = 'started'
else :
self.status = 'stopped'
return self.status
except :
self.status = "stopped"
self.rtMon = None
return self.status
def stopMonitoring(self) :
# isstopped = self.rtservice.setMonitoringState(str(self.id), VRPMDVMonitoringState.stopped)
logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")#
logging.info("MainThread: stopping Mon Thread %s ", self.id)
#send delete cmd to M4
#logging.info("MainThread: stop monitoring")
# if (self.monTask != None) :
# set the value Runthread to fals that the thread terminate
# self.run_thread = False
# self.monTask.join(None)
##new ML 09.07.2024
if (self.rtMon != None) :
self.rtMon.stop()
# self.monTask = None
# logging.info("MonThread %s: closing fdesc=%s", str(self.id), str(self.fdesc))
# # self.rtMon.closeChannel(self.fdesc)
# logging.info("MonThread %s: closed fdesc=%s", str(self.id), str(self.fdesc))
logging.info("MainThread: stopped Mon Thread %s ", self.id)
vrpmdDeleteCmd = VRPMDV_DeleteMonCmd(self.no)
schemaDeleteCmd = VRPMDV_DeleteMonSchema()
# TODO ML: uncomment this
res = trySend(schemaDeleteCmd.dumps(vrpmdDeleteCmd))
#res = 'Stopped'
logging.info("MainThread: try send stop monitoring done %s", res)
self.rtMon = None
# if (isstopped) :
self.status = 'stopped'
return self.status
# def setStatus(self, status) :
# # isStatusSet = self.rtservice.setMonitoringStatus(str(self.id), status)
# logging.info("MainThread: set status ")
# return True
def run(self):
# logging.info("MonThread %s: starting", str(self.id))
# fdesc = -1
# rtMon = rts.RTSMonitoringTask()
# fdesc = rtMon.openChannel('/dev/mon-datafile')
# write loginfos to Buffer
# msg = rtMon.getLogMsg()
# for msgstr in msg:
# logging.info(str(msgstr))
count = 0;
if (self.fdesc >= 0) :
while (self.run_thread):
# check if the thread is running
# if (count == 50):
# vrpmdStatusCmd = VRPMDV_StatusMonCmd(self.no)
# schemaStatusCmd = VRPMDV_StatusMonSchema()
# res = trySend(schemaStatusCmd.dumps(vrpmdStatusCmd))
# logging.info("MainThread: try send stop monitoring done %s", res)
# count = 0
#count = count +1
msg = self.rtMon.readChannel(self.fdesc)
logging.info("MonThread %s: running", str(self.id))
logging.info("Result: %s", msg)
#time.sleep(1)
# write loginfos to Buffer
# logmsg = rtMon.getLogMsg()
# for msgstr in logmsg:
# logging.info(str(msgstr))
# logging.info(msg)
# if (msg == 'noResult'):
# break
# logging.info("MonThread %s: finishing", str(self.id))
# rtMon.closeChannel(fdesc)
logging.info("MonThread %s: finished", str(self.id))
# msg = rtMon.getLogMsg()
# for msgstr in msg:
# logging.info(str(msgstr))
else:
logging.info("MonThread %s: opening failed fdesc <= 0", str(self.id))

View File

@@ -0,0 +1,30 @@
#from enum import Enum
from marshmallow import Schema, fields, post_load
class VRPMDVMonitoringState():
STARTED = 'started'
STOPPED = 'stopped'
NCREATE = 0
NDELETE = 1
def __init__(self, state = STOPPED):
self.state = state
def get(self) :
if (self.state == self.STARTED) :
return self.NCREATE
else :
return self.NDELETE
# class VRPMDVMonitoringState(Enum):
# off = 1
# created = 2
# started = 3
# stopped = 4

View File

@@ -0,0 +1,29 @@
import uuid
import datetime as dt
from marshmallow import Schema, fields, post_load, post_dump
from vrpmdvmonitoring import VRPMDV_Monitoring
class VRPMDV_MonitoringSchema(Schema):
no = fields.Integer()
id = fields.UUID()
created_at = fields.DateTime("%m/%d/%Y, %H:%M")
name = fields.String()
samplerate = fields.Integer()
sampleperiod = fields.Integer()
downtime = fields.Integer()
owner = fields.String()
status = fields.String()
@post_load
def make_vrpmdv_Monitoring(self, data, **kwargs):
mon = VRPMDV_Monitoring(**data)
#create the monitoring on the realtime side
# mon.createMonitoring()
return mon

View File

@@ -0,0 +1,14 @@
import datetime as dt
class VRPMDV_MonReq:
def __init__(self, name , samplerate, sampleperiod, downtime, owner, status) :
self.name = name
self.samplerate = samplerate
self.sampleperiod = sampleperiod
self.downtime = downtime
self.owner = owner
self.status = status

View File

@@ -0,0 +1,20 @@
import uuid
import datetime as dt
from marshmallow import Schema, fields, post_load
from vrpmdvmonreq import VRPMDV_MonReq
class VRPMDV_MonReqSchema(Schema):
name = fields.String()
samplerate = fields.Integer()
sampleperiod = fields.Integer()
downtime = fields.Integer()
owner = fields.String()
status = fields.String()
@post_load
def make_vrpmdv_MonitoringReq(self, data, **kwargs):
return VRPMDV_MonReq(**data)

View File

@@ -0,0 +1,11 @@
import datetime as dt
class VRPMDV_MonSensor:
def __init__(self, name , channels):
self.name = name
self.channels = channels

View File

@@ -0,0 +1,16 @@
import uuid
import datetime as dt
from marshmallow import Schema, fields, post_load, EXCLUDE
from vrpmdvmonsensor import VRPMDV_MonSensor
class VRPMDV_MonSensorSchema(Schema):
name = fields.String()
channels = fields.List(fields.Nested("VRPMDV_MonChannelSchema"))
@post_load
def make_vrpmdv_MonfilesSensorSchema(self, data, **kwargs):
return VRPMDV_MonSensor(**data)

View File

@@ -0,0 +1,53 @@
#!/usr/bin/env python3
import traceback
from pyroute2.netlink import NLM_F_REQUEST
from pyroute2.netlink import genlmsg
from pyroute2.netlink.generic import GenericNetlinkSocket
import sys
RLINK_CMD_UNSPEC = 0
RLINK_CMD_REQ = 1
class rcmd(genlmsg):
'''
Message class that will be used to communicate
with the kernel module
'''
nla_map = (
('RLINK_ATTR_UNSPEC', 'none'),
('RLINK_ATTR_DATA', 'asciiz'),
)
class Rlink(GenericNetlinkSocket):
def send_data(self, data):
msg = rcmd()
msg['cmd'] = RLINK_CMD_REQ
msg['version'] = 1
msg['attrs'] = [('RLINK_ATTR_DATA', data)]
ret = self.nlm_request(msg, self.prid, msg_flags=NLM_F_REQUEST)[0]
return ret.get_attr('RLINK_ATTR_DATA')
def trySend(data):
# if __name__ == '__main__':
try:
# create protocol instance
rlink = Rlink()
rlink.bind('gnl-vrpmdv-mcmd', rcmd)
#rlink.send_data(data)
# request a method
res = rlink.send_data(data)
if res :
print(res, file=sys.stdout)
sys.stdout.flush()
except:
# if there was an error, log it to the console
traceback.print_exc()
finally:
# finally -- release the instance
rlink.close()
return res

View File

@@ -0,0 +1,176 @@
# from vrpmdv-server/vrpmdv-main import application
import logging
import os
import sys
import json
from flask import Flask, request , send_from_directory , Response
from flask_cors import CORS
from vrpmdvdata import VRPMDV_Data
from vrpmdvmonreqschema import VRPMDV_MonReqSchema
# import ecal.core.core as ecal_core
# from proto_messages.RTService_pb2 import _RTSERVICE as rtservice
app = Flask(__name__, static_url_path='', static_folder='./build')
#app = Flask(__name__, static_url_path='/public', static_folder='../build')
#app = Flask(__name__)
CORS(app) #comment this on deployment
vrpmdvdata = VRPMDV_Data()
@app.route("/", defaults={'path':''})
#@app.route("/")
@app.route('/<path:path>')
def serve(path):
logging.basicConfig(format=format, level=logging.INFO, datefmt="%H:%M:%S")
logging.info("vrpmdvserver: path:%s", path)
# path_dir = os.path.abspath("../build") #path react build
# if path != "" and os.path.exists(os.path.join(path_dir, path)):
# return send_from_directory(os.path.join(path_dir), path)
# else:
# return send_from_directory(os.path.join(path_dir),'index.html')
return send_from_directory(app.static_folder,'index.html')
@app.errorhandler(404)
def not_found(e):
return app.send_static_file('index.html')
@app.route('/vrpmdvapi/1_0/monitorings', methods=['GET'])
def get_monitorings():
data = vrpmdvdata.getMonitorings()
resp = Response(data, status=200, mimetype='application/json')
return resp
@app.route('/vrpmdvapi/1_0/monitorings/<id>', methods=['GET'])
def get_monitoring(id):
data = vrpmdvdata.getMonitoring(id)
resp = Response(data, status=200, mimetype='application/json')
return resp
@app.route('/vrpmdvapi/1_0/monitorings/<id>', methods=['PATCH'])
def set_monitoring(id):
# vrpmreq = VRPMDV_MonReqSchema().load(request.get_json())
vrpmreq = request.get_json()
data = vrpmdvdata.setMonitoring(id, vrpmreq)
resp = Response(data, status=200, mimetype='application/json')
return resp
@app.route('/vrpmdvapi/1_0/monitorings', methods=['POST'])
def create_monitoring():
#vrpmreq = VRPMDV_MonReqSchema().load(request.get_json())
#data = vrpmdvdata.createMonitoring(vrpmreq)
data = vrpmdvdata.createMonitoring(request)
resp = Response(data, status=200, mimetype='application/json')
return resp
@app.route('/vrpmdvapi/1_0/monitorings/<id>', methods=['DELETE'])
def delete_monitoring(id):
data = vrpmdvdata.deleteMonitoring(id)
resp = Response(data, status=200, mimetype='application/json')
return resp
@app.route('/vrpmdvapi/1_0/monitorings/start', methods=['PATCH'])
def start_monitoring():
vrpmid = request.get_json()
data = vrpmdvdata.startMonitoring(vrpmid)
resp = Response(data, status=200, mimetype='application/json')
return resp
@app.route('/vrpmdvapi/1_0/monitorings/stop/', methods=['PATCH'])
def stop_monitoring():
vrpmid = request.get_json()
data = vrpmdvdata.stopMonitoring(vrpmid)
resp = Response(data, status=200, mimetype='application/json')
return resp
@app.route('/vrpmdvapi/1_0/monitoringstatus/<id>', methods=['PATCH'])
def setStatus(id):
vrpmStatus = request.get_json()
data = vrpmdvdata.setStatus(id, vrpmStatus)
resp = Response(data, status=200, mimetype='application/json')
return resp
@app.route('/vrpmdvapi/1_0/monitoring/mondfaivalable', methods=['GET'])
def get_mondfaivalable():
data = vrpmdvdata.getMonsDFAvalable()
if (data == None):
resp = Response("no Item found", status=404, mimetype='application/json')
else:
resp = Response(data, status=200, mimetype='application/json')
return resp
@app.route('/vrpmdvapi/1_0/monitoringfiles', methods=['GET'])
def get_monitoringfiles():
vrpmreqjson = request.args
#vrpmreq = VRPMDV_MonReqSchema().load(request.get_json())
#data = vrpmdvdata.createMonitoring(vrpmreq)
data = vrpmdvdata.getMonitoringfiles(0, request.args)
if (data == None):
resp = Response("no Item found", status=404, mimetype='application/json')
else:
resp = Response(data, status=200, mimetype='application/json')
return resp
@app.route('/vrpmdvapi/1_0/monitoringfiles/download', methods=['GET'])
def get_mfDownload():
vrpmreqjson = request.args
data = vrpmdvdata.getMFDownload(request.args)
if (data == None):
resp = Response("no Item found", status=404, mimetype='application/json')
else:
resp = Response(data, status=200, mimetype='application/json')
return resp
if __name__ == "__main__":
# initialize eCAL API. The name of our Process will be
# "Python Protobuf Subscriber"
#ecal_core.initialize(sys.argv, "Python Protobuf Subscriber")
app.run()
# if __name__ == "__main__":
# # Create a Protobuf Publisher that publishes on the topic
# # "hello_world_python_protobuf_topic". The second parameter tells eCAL which
# # datatype we are expecting to receive on that topic.
# sub = ProtoSubscriber("hello_world_python_protobuf_topic"
# , hello_world_pb2.HelloWorld)
# # Set the Callback
# sub.set_callback(callback)
# # Just don't exit
# while ecal_core.ok():
# time.sleep(0.5)
# # finalize eCAL API
# ecal_core.finalize()

View File

@@ -0,0 +1,10 @@
import datetime as dt
class VRPMDV_StatusMonCmd:
def __init__(self, id ) :
self.cmdid = 3
self.id = id

View File

@@ -0,0 +1,23 @@
import uuid
import datetime as dt
from marshmallow import Schema, fields, post_load, post_dump
from vrpmdvstatusmoncmd import VRPMDV_StatusMonCmd
class VRPMDV_StatusMonSchema(Schema):
cmdid = fields.Integer()
id = fields.UUID()
@post_load
def make_vrpmdv_StatusMonitoring(self, data, **kwargs):
mon = VRPMDV_StatusMonCmd(**data)
return mon