Skip to content

Commit

Permalink
EXPEREMENTAL: Backendserver replaced by Server dataclasss
Browse files Browse the repository at this point in the history
  • Loading branch information
EinEinfach committed Oct 26, 2024
1 parent e0bb62f commit 82f7191
Show file tree
Hide file tree
Showing 8 changed files with 410 additions and 48 deletions.
11 changes: 9 additions & 2 deletions CaSSAndRA/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
from logging.handlers import RotatingFileHandler

# local imports
from src.pathdata import paths
from src.backend import backendserver
from src.backend.server import cassandra

# logging setup
logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -48,7 +50,8 @@ def __init__(self):
signal.signal(signal.SIGTERM, self.exit_gracefully)

def exit_gracefully(self, *args):
backendserver.stop()
#backendserver.stop()
cassandra.stop()
self.kill_now = True

default_data_path = os.path.join(os.path.expanduser('~'), '.cassandra')
Expand Down Expand Up @@ -121,12 +124,16 @@ def start(host, port, proxy, data_path, debug, app_log_level, app_log_file_level

# initialize data files
file_paths = init_data(data_path)
paths.set(file_paths)

# logging config
config_logging(file_paths.log, app_log_level, app_log_file_level, server_log_level, pil_log_level)

# start backend server
backendserver.start(file_paths)
cassandra.setup(file_paths)
cassandra.run()
#backendserver.start(file_paths)


assets_path = os.path.abspath(os.path.dirname(__file__)) +'/src/assets'
app = dash.Dash(
Expand Down
33 changes: 6 additions & 27 deletions CaSSAndRA/src/backend/backendserver.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import time
import os

from src.pathdata import paths
from . data import saveddata, calceddata, cleandata, cfgdata, logdata
from . data.scheduledata import schedule_tasks
from . comm.connections import mqttcomm, httpcomm, uartcomm, mqttapi
Expand All @@ -15,17 +16,6 @@

restart = threading.Event()

# def slow_tasks(restart: threading.ExceptHookArgs) -> None:
# start_time_slow_tasks = datetime.now()
# time_to_wait = 1
# while True:
# if restart.is_set():
# logger.info('Slow tasks thread is stopped')
# return
# if (datetime.now() - start_time_slow_tasks).seconds >= 30*time_to_wait:
# robot.calc_seconds_per_idx()
# time.sleep(1)

def message_service(restart: threading.ExceptHookArgs) -> None:
while True:
if restart.is_set():
Expand Down Expand Up @@ -193,12 +183,7 @@ def start(file_paths) -> None:

logger.info('Backend: Read communication config file')

# todo: this should be refactored so the class is initialized with correct data immediately
logdata.commlog.path = file_paths.log

# initialize config data
# todo: this should be a class or refactored in some way to avoid circular dependencies
cfgdata.file_paths = file_paths
connect_data = cfgdata.commcfg.read_commcfg()
cfgdata.rovercfg.read_rovercfg()
cfgdata.pathplannercfg.read_pathplannercfg()
Expand All @@ -210,13 +195,13 @@ def start(file_paths) -> None:
cfgdata.schedulecfg.read_schedulecfg()

# todo: saveddata should probably be a class instead
saveddata.file_paths = file_paths
saveddata.file_paths = paths.file_paths
logger.info('Backend: Read saved data')
saveddata.read(file_paths.measure)
saveddata.read(paths.file_paths.measure)
logger.info('Backend: Read map data file')
saveddata.read_perimeter(file_paths.map)
saveddata.read_perimeter(paths.file_paths.map)
logger.info('Backend: Read tasks data file')
saveddata.read_tasks(file_paths.map)
saveddata.read_tasks(paths.file_paths.map)

#read schedule tasks
schedule_tasks.load_task_order(cfgdata.schedulecfg)
Expand Down Expand Up @@ -321,12 +306,6 @@ def start(file_paths) -> None:
schedule_thread.daemon = True
schedule_thread.start()

#start an own thre for slow tasks
# logger.info('Starting thread for slow tasks')
# slow_tasks_thread = threading.Thread(target=slow_tasks, args=(restart,), name='slow tasks')
# slow_tasks_thread.daemon = True
# slow_tasks_thread.start()

#give some times to establish connection
time.sleep(2)

Expand All @@ -341,7 +320,7 @@ def reboot() -> None:
data_storage_running = True
time.sleep(5)
restart.clear()
start(cfgdata.file_paths)
start(paths.file_paths)

def stop() -> None:
logger.info('Backendserver is being shut down')
Expand Down
3 changes: 3 additions & 0 deletions CaSSAndRA/src/backend/comm/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,9 @@ class API:

def create_api_payload(self) -> None:
self.apistate = 'ready'

def create_server_payload(self) -> None:
pass

def create_robot_payload(self) -> None:
self.robotstate['firmware'] = robot.fw
Expand Down
25 changes: 13 additions & 12 deletions CaSSAndRA/src/backend/data/cfgdata.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,8 @@
import pandas as pd
from PIL import Image

file_paths = None
# local imports
from src.pathdata import paths

#commcfg class
@dataclass
Expand Down Expand Up @@ -40,7 +41,7 @@ class CommCfg:

def read_commcfg(self) -> dict:
try:
with open(file_paths.user.comm) as f:
with open(paths.file_paths.user.comm) as f:
commcfg_from_file = json.load(f)
f.close()
logger.debug('Backend: commcfg to read: '+ str(commcfg_from_file))
Expand Down Expand Up @@ -72,7 +73,7 @@ def read_commcfg(self) -> dict:
logger.error('Could not read commcfg.json. Missing commcfg.json. Go with standard values')
logger.debug(str(e))
res = self.save_commcfg()
with open (file_paths.user.comm) as f:
with open (paths.file_paths.user.comm) as f:
commcfg_from_file = json.load(f)
f.close()
return commcfg_from_file
Expand Down Expand Up @@ -107,7 +108,7 @@ def save_commcfg(self) -> None:
{'CHAT_ID': self.telegram_chat_id}]
new_data['PUSHOVER'] = [{'TOKEN': self.pushover_token},
{'USER': self.pushover_user}]
with open(file_paths.user.comm, 'w') as f:
with open(paths.file_paths.user.comm, 'w') as f:
logger.debug('New commcfg data: '+str(new_data))
json.dump(new_data, f, indent=4)
logger.info('commcfg data are successfully stored in commcfg.json')
Expand All @@ -134,7 +135,7 @@ class AppCfg:

def read_appcfg(self) -> None:
try:
with open(file_paths.user.appcfg) as f:
with open(paths.file_paths.user.appcfg) as f:
appcfg_from_file = json.load(f)
f.close()
except Exception as e:
Expand Down Expand Up @@ -171,7 +172,7 @@ def save_appcfg(self) -> int:
new_data['obstacles_amount'] = self.obstacles_amount
new_data['light_mode'] = self.light_mode
new_data['rover_picture_size'] = self.rover_picture_size
with open(file_paths.user.appcfg, 'w') as f:
with open(paths.file_paths.user.appcfg, 'w') as f:
logger.debug('New appcfg data: '+str(new_data))
json.dump(new_data, f, indent=4)
logger.info('appcfg data are successfully stored in appcfg.json')
Expand All @@ -198,7 +199,7 @@ class RoverCfg:

def read_rovercfg(self) -> None:
try:
with open(file_paths.user.rovercfg) as f:
with open(paths.file_paths.user.rovercfg) as f:
rovercfg_from_file = json.load(f)
f.close()
except Exception as e:
Expand Down Expand Up @@ -229,7 +230,7 @@ def save_rovercfg(self) -> int:
new_data['lat'] = self.lat
new_data['fix_timeout'] = self.fix_timeout
new_data['finish_and_restart'] = self.finish_and_restart
with open(file_paths.user.rovercfg, 'w') as f:
with open(paths.file_paths.user.rovercfg, 'w') as f:
logger.debug('New rovercfg data: '+str(new_data))
json.dump(new_data, f, indent=4)
logger.info('rovercfg data are successfully stored in rovercfg.json')
Expand All @@ -253,7 +254,7 @@ class PathPlannerCfg:

def read_pathplannercfg(self) -> None:
try:
with open(file_paths.user.pathplannercfg) as f:
with open(paths.file_paths.user.pathplannercfg) as f:
pathplannercfg_from_file = json.load(f)
f.close()
except Exception as e:
Expand Down Expand Up @@ -286,7 +287,7 @@ def save_pathplannercfg(self) -> int:
new_data['mowborder'] = self.mowborder
new_data['mowexclusion'] = self.mowexclusion
new_data['mowborderccw'] = self.mowborderccw
with open(file_paths.user.pathplannercfg, 'w') as f:
with open(paths.file_paths.user.pathplannercfg, 'w') as f:
logger.debug('New pathplannercfg data: '+str(new_data))
json.dump(new_data, f, indent=4)
logger.info('pathplannercfg data are successfully stored in pathplannercfg.json')
Expand Down Expand Up @@ -344,7 +345,7 @@ def reset_schedulecfg(self) -> None:

def read_schedulecfg(self) -> None:
try:
with open(file_paths.user.schedulecfg) as f:
with open(paths.file_paths.user.schedulecfg) as f:
schedulecfg_from_file = json.load(f)
f.close()
except Exception as e:
Expand Down Expand Up @@ -393,7 +394,7 @@ def save_schedulecfg(self) -> int:
{'saturday': self.saturday_tasks},
{'sunday': self.sunday_tasks}
]
with open(file_paths.user.schedulecfg, 'w') as f:
with open(paths.file_paths.user.schedulecfg, 'w') as f:
logger.debug('New schedulecfg data: '+str(new_data))
json.dump(new_data, f, indent=4)
logger.info('Schedulecfg data are successfully stored in schedulecfg.json')
Expand Down
7 changes: 6 additions & 1 deletion CaSSAndRA/src/backend/data/logdata.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,22 @@
import logging
logger = logging.getLogger(__name__)

# imports
import pandas as pd
from datetime import datetime
from dataclasses import dataclass, field
import os

# local imports
from src.pathdata import paths

ABSOLUTE_PATH = os.path.dirname(__file__)

@dataclass
class Log():
lastdata: pd.DataFrame = field(default_factory=lambda: pd.DataFrame())
path = ABSOLUTE_PATH.replace('/src/backend/data', '/src/data/log/cassandra.log')
#path = ABSOLUTE_PATH.replace('/src/backend/data', '/src/data/log/cassandra.log')
path: str = paths.log

def read(self) -> None:
try:
Expand Down
7 changes: 1 addition & 6 deletions CaSSAndRA/src/backend/data/roverdata.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,10 +51,7 @@ class Mower:
last_cmd: pd.DataFrame = field(default_factory=lambda: pd.DataFrame([{'msg': 'AT+C,-1,-1,-1,-1,-1,-1,-1,-1'}]))
last_task_name: str = 'no task'
current_task: pd.DataFrame = field(default_factory=lambda: pd.DataFrame())
map_upload_started: bool = False
map_upload_failed: bool = False
map_old_crc: int = None
map_upload_cnt: int = 0
mowprogress: float = 0.0
last_position_mow_point_index: int = None
measured_time_since_last_position_index_change = None
Expand All @@ -68,7 +65,6 @@ class Mower:
status_tmp_timestamp: datetime = datetime.now()
sensor_status: str = 'unknown'
position_age_hr = '99+d'
dock_reason_operator: bool = False
dock_reason: str = None
dock_reason_time: datetime = datetime.now()

Expand Down Expand Up @@ -251,7 +247,7 @@ def set_rover_image(self) -> None:

def check_dock_reason(self) -> None:
if self.job == 4:
if self.dock_reason_operator:
if self.dock_reason != None:
pass
elif self.sensor == 18:
self.dock_reason = 'temperature'
Expand All @@ -263,7 +259,6 @@ def check_dock_reason(self) -> None:
self.dock_reason = 'low battery'
self.dock_reason_time = datetime.now()
elif (self.job == 2 and (datetime.now() - self.dock_reason_time).seconds >= 3600) or (self.job != 4 and self.job != 2):
self.dock_reason_operator = False
self.dock_reason = None
self.dock_reason_time = datetime.now()

Expand Down
Loading

0 comments on commit 82f7191

Please sign in to comment.