Index: dialin/dg/ro_pump.py =================================================================== diff -u -r0514a69831286e4727429f57e046f71e73e78110 -rca7a00d1584b97eed9471fe4a5f17a7aa3ea62d8 --- dialin/dg/ro_pump.py (.../ro_pump.py) (revision 0514a69831286e4727429f57e046f71e73e78110) +++ dialin/dg/ro_pump.py (.../ro_pump.py) (revision ca7a00d1584b97eed9471fe4a5f17a7aa3ea62d8) @@ -191,9 +191,9 @@ self.logger.debug("Timeout!!!!") return False - def cmd_ro_flow_rate_override(self, flow: float, reset: int = NO_RESET) -> int: + def cmd_ro_flow_rate_measured_override(self, flow: float, reset: int = NO_RESET) -> int: """ - Constructs and sends the RO rate override command. + Constructs and sends the RO measured rate override command. Constraints: Must be logged into DG. Index: dialin/utils/data_logger.py =================================================================== diff -u -r12fc8d4dee213f861ee7645ce83c8b3a79896e10 -rca7a00d1584b97eed9471fe4a5f17a7aa3ea62d8 --- dialin/utils/data_logger.py (.../data_logger.py) (revision 12fc8d4dee213f861ee7645ce83c8b3a79896e10) +++ dialin/utils/data_logger.py (.../data_logger.py) (revision ca7a00d1584b97eed9471fe4a5f17a7aa3ea62d8) @@ -21,7 +21,9 @@ from logging import Logger from time import sleep from typing import Tuple - +from multiprocessing import Process +from pathlib import Path +from typing import Union import pandas as pd from dialin.utils.base import _FauxLogger @@ -47,6 +49,7 @@ self.csv_writers = {} self.logger = logger self.thread.start() + self.path_disable_logging = "/tmp/DIALIN_DISABLE_LOGGING" def logging_scheduler(self) -> None: """ @@ -65,8 +68,11 @@ :return: None """ # ("module", "timestamp", "header", "value") - if not self.disable_logging: + if not os.path.exists(self.path_disable_logging): self.queue.append(data) + # Keep for debugging + # else: + # self.logger.debug("Ignoring {0}".format(data)) def do_data_logging(self) -> None: """ @@ -95,20 +101,31 @@ if i >= self.MAX_CHUNK_SIZE: break - def export_to_xlsx(self, output_path: str): + def export_to_xlsx(self, output_path: str) -> None: """ Called when the user wishes to export all captured logs to a xlsx file :param output_path: (str) the destination output path :return: None """ + process = Process(target=self._do_export_to_xlsx, args=(output_path,)) + process.start() + + def _do_export_to_xlsx(self, output_path: str) -> None: + """ + Performs the actual export to xlsx + + :param output_path: (str) the destination output path + :return: None + """ + + Path(self.path_disable_logging).touch() self.logger.debug("Starting data export to {0}".format(output_path)) - self.disable_logging = True log_path = os.path.join(self.base_folder, "*Log") folders = glob.glob(log_path) if len(folders) == 0: self.logger.debug("No folder with data to export") - self.disable_logging = False + os.remove(self.path_disable_logging) return writer = pd.ExcelWriter(output_path) for folder in folders: @@ -125,21 +142,21 @@ self.logger.debug("Added {0} to {1}".format(module_name, output_path)) except ValueError as e: self.logger.error("Error during write to excel: {0}".format(e)) - + writer.save() self.logger.debug("Finished data export to {0}".format(output_path)) - self.disable_logging = False + os.remove(self.path_disable_logging) def clear_logs(self): """ Called when the user clears the logs :return: None """ - self.disable_logging = True + Path(self.path_disable_logging).touch() log_path = os.path.join(self.base_folder, "*Log") folders = glob.glob(log_path) for folder in folders: self.logger.debug("Removing {0}".format(folder)) shutil.rmtree(folder) - self.disable_logging = False + os.remove(self.path_disable_logging) Index: tests/peter/test_gen_requirements.py =================================================================== diff -u -r1508298c28026c5a1df24fb8e614cb8ab65b2e09 -rca7a00d1584b97eed9471fe4a5f17a7aa3ea62d8 --- tests/peter/test_gen_requirements.py (.../test_gen_requirements.py) (revision 1508298c28026c5a1df24fb8e614cb8ab65b2e09) +++ tests/peter/test_gen_requirements.py (.../test_gen_requirements.py) (revision ca7a00d1584b97eed9471fe4a5f17a7aa3ea62d8) @@ -17,25 +17,15 @@ sys.path.append("../../") from dialin.dg.dialysate_generator import DG from dialin.hd.hemodialysis_device import HD -from dialin.hd.constants import RESET, NO_RESET, BUTTON_PRESSED, BUTTON_RELEASED -import time -import pprint +from typing import List -def test_dg_version(): +def gen_publish_requirements(modules: List[object]) -> dict: """ - Prints the DG version. - - @return: None + Generates a list of publish requirements + @param modules: + @return: """ - dg = DG() - if dg.cmd_log_in_to_dg(): - dg.cmd_ui_request_dg_version() - time.sleep(0.5) - print(dg.dg_version) - - -def gen_publish_requirements(modules): result = {} for module in modules: @@ -49,28 +39,28 @@ not attr.isupper(): result[module.__class__.__name__] = result.get(module.__class__.__name__, []) + [attr] - # pp = pprint.PrettyPrinter(indent=4) - # pp.pprint(result) - for module, attrs in result.items(): print("\n{0} \n ".format(module)) for attr in attrs: print("The Dialin API shall publish the {0} to all observers upon HD messaging.".format(attr.replace("_", " "))) return result -def gen_cmd_requirements(modules): +def gen_cmd_requirements(modules: List[object]) -> dict: + """ + Generates requirements from dialin commands + @param modules: the list of modules to generate requirements for + @return: + """ + result = {} for module in modules: for attr in dir(module): if callable(getattr(module, attr)) and attr.startswith("cmd"): result[module.__class__.__name__] = result.get(module.__class__.__name__, []) + [attr] - # pp = pprint.PrettyPrinter(indent=4) - # pp.pprint(result) - for module, attrs in result.items(): print("\n{0} \n ".format(module)) for attr in attrs: @@ -121,17 +111,6 @@ dg = DG() modules = [ - # hd.hd_proxy, - # hd.load_cells, - # hd.pressures, - # hd.reservoirs, - # hd.valves, - # hd.ro_pump, - # hd.drain_pump, - # hd.heaters, - # hd.temperature_sensors, - # hd.conductivity_sensors, - # hd.accel, dg.alarms, dg.concentrate_pumps, dg.fans, @@ -146,4 +125,4 @@ if __name__ == '__main__': generate_dg_requirements() - # generate_hd_requirements() + generate_hd_requirements()